非activityclass拍照
Take picture in non-activity class
我想在非activityclass拍照。但是我得到错误:尝试在空对象引用上调用虚拟方法。这是我的代码:
MainAcvitity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Print myprint = new Print();
myprint.Picture();
}
Print.java
public class Print {
private static final String TAG = "Secret";
Context context;
public void Picture() {
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
((Activity) this.context).startActivityForResult(intent, 1);
Log.v(TAG, "I took a picture.");
}
}
我不知道出了什么问题。你能告诉我为什么会这样吗?我该如何解决?我不希望我的 Print class 成为 Activity class。如果 Print 是 Activity class,我知道如何拍照。 0.0
因为你的上下文是空的。你还没有初始化它。
如果你想创建一个 class 来打开你的相机,试试这个:
public class Print{
private static final String TAG = "Secret";
private Context context;
private File photoCaptured;
public Print(Context context) {
this.context = context;
}
public void openCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String timeStamp = System.currentTimeMillis() + "";
String fileName = "JPEG_" + timeStamp;
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
photoCaptured = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES),
fileName + ".jpg");
} else {
String dir = Environment.getExternalStorageDirectory() + File.separator + "myDirectory";
//create folder
File folder = new File(dir); //folder name
if (!folder.exists()) {
folder.mkdirs();
}
//create file
photoCaptured = new File(dir, fileName + ".jpg");
}
Uri temUri = Uri.fromFile(photoCaptured);
intent.putExtra(MediaStore.EXTRA_OUTPUT, temUri);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
if (intent.resolveActivity(context.getPackageManager()) != null) {
((AppCompatActivity) context).startActivityForResult(intent, REQUEST_TAKE_PHOTO);
}
}
}
然后在你的 MainActivity
中初始化 Print
并使用它。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Print myprint = new Print(this);
myprint.openCamera();
}
对于您的问题,只需初始化您的 Print
class 即可。 (仅针对您的情况,但这不是最好的方法!!!)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Print myprint = new Print(this);
myprint.Picture()
}
我想在非activityclass拍照。但是我得到错误:尝试在空对象引用上调用虚拟方法。这是我的代码:
MainAcvitity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Print myprint = new Print();
myprint.Picture();
}
Print.java
public class Print {
private static final String TAG = "Secret";
Context context;
public void Picture() {
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
((Activity) this.context).startActivityForResult(intent, 1);
Log.v(TAG, "I took a picture.");
}
}
我不知道出了什么问题。你能告诉我为什么会这样吗?我该如何解决?我不希望我的 Print class 成为 Activity class。如果 Print 是 Activity class,我知道如何拍照。 0.0
因为你的上下文是空的。你还没有初始化它。
如果你想创建一个 class 来打开你的相机,试试这个:
public class Print{
private static final String TAG = "Secret";
private Context context;
private File photoCaptured;
public Print(Context context) {
this.context = context;
}
public void openCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String timeStamp = System.currentTimeMillis() + "";
String fileName = "JPEG_" + timeStamp;
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
photoCaptured = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES),
fileName + ".jpg");
} else {
String dir = Environment.getExternalStorageDirectory() + File.separator + "myDirectory";
//create folder
File folder = new File(dir); //folder name
if (!folder.exists()) {
folder.mkdirs();
}
//create file
photoCaptured = new File(dir, fileName + ".jpg");
}
Uri temUri = Uri.fromFile(photoCaptured);
intent.putExtra(MediaStore.EXTRA_OUTPUT, temUri);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
if (intent.resolveActivity(context.getPackageManager()) != null) {
((AppCompatActivity) context).startActivityForResult(intent, REQUEST_TAKE_PHOTO);
}
}
}
然后在你的 MainActivity
中初始化 Print
并使用它。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Print myprint = new Print(this);
myprint.openCamera();
}
对于您的问题,只需初始化您的 Print
class 即可。 (仅针对您的情况,但这不是最好的方法!!!)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Print myprint = new Print(this);
myprint.Picture()
}