android - 非 Activity 课拍照

标签 android android-intent android-camera

我想在非 Activity 课上拍照。但是我得到错误:尝试在空对象引用上调用虚拟方法。这是我的代码:

MainAcvitity.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Print myprint = new Print();
    myprint.Picture();
}

打印.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 类成为 Activity 类。如果 Print 是 Activity 类,我知道如何拍照。 0.0

最佳答案

因为你的上下文是空的。你还没有初始化它。

如果你想创建一个类来打开你的相机,试试这个:

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 类即可。 (仅针对您的情况,但这不是最佳方法!!!)

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Print myprint = new Print(this);
    myprint.Picture()
}

关于android - 非 Activity 课拍照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45238400/

相关文章:

Android:通过相机 Activity 裁剪图像的问题

java - @Inject 注释如何知道在同一接口(interface)下实例化哪个具体类?

android - pendingintent.getservice 无法正常工作

java - 显示 imageview onclick 并发布,如果为空则不显示 imageview

android - 软键盘不隐藏

android - 选择一张图片并上传android

android - 调用 camera.release() 时手机死机

java - @string/action_settings 中的值是多少?

java - 使用线程按顺序显示字符串后应用程序崩溃

android - 依赖项的 Gradle 多项目递归任务