首页 文章

拍照后应用程序崩溃

提问于
浏览
0

我正在使用此代码创建一个简单的相机应用程序 . 我可以拍张照片 . 但是,拍摄照片后应用程序崩溃了 .

{
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);                       

    File imageFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "abc.jpg");


    Uri store= Uri.fromFile(imageFile);
    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, store);
    intent.putExtra(android.provider.MediaStore.EXTRA_VIDEO_QUALITY, 0);
    startActivityForResult(intent, 0);
}

/ ********* ********* onActivityResult ************ /

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 0) {
            switch (resultCode) {
                case Activity.RESULT_OK:
                    if (imageFile.exists())
                    {
                        Toast.makeText(this, "The file was saved at " + imageFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
                    }
                    else
                    {
                        Toast.makeText(this, "Error saving the file ", Toast.LENGTH_LONG).show();
                    }
                        break;
                case Activity.RESULT_CANCELED:
                            break;
                        default:
                            break;
                    }
            }
        }

下面是logcat .

java.lang.RuntimeException:将结果ResultInfo {who = null,request = 0,result = -1,data = null}传递给activity {com.camera/com.camera.MainActivity}失败:java.lang.NullPointerException:Attempt在android.app.ActivityThread.handleSendResult(ActivityThread.java:3801)的android.app.ActivityThread.deliverResults(ActivityThread.java:3758)上的空对象引用上调用虚方法'boolean java.io.File.exists()' )在Android.app.Handler.dispatchMessage(Handler.java:102)的android.app.ActivityThread.access $ 1400(ActivityThread.java:157)android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1405) android.os.Looper.loop(Looper.java:148)位于com.android.internal的java.lang.reflect.Method.invoke(Native Method)的android.app.ActivityThread.main(ActivityThread.java:5551) . os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:730)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)引起:java.lang.NullPointerException:尝试调用虚方法android上的android.app.Activity.dispatchActivityResult(Activity.java:6463)中的com.camera.MainActivity.onActivityResult(MainActivity.java:43)上的空对象引用上的'boolean java.io.File.exists()' . android.app.ActivityThread $的android.app.ActivityThread.access $ 1400(ActivityThread.java:157)上的android.app.ActivityThread.handleSendResult(ActivityThread.java:3801)app.ActivityThread.deliverResults(ActivityThread.java:3754) 2.handleMessage(ActivityThread.java:1405)位于android.app.AtoT.Thread.main(ActivityThread)的android.os.Handler.dispatchMessage(Handler.java:102)android.os.Looper.loop(Looper.java:148) .java:5551)位于com.android.internal.os.ZygoteInit的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:730)的java.lang.reflect.Method.invoke(Native Method) . 主要(ZygoteInit.java:620)

我无法弄清楚为什么会这样 . 有谁知道我该如何修复错误?谢谢!

4 回答

  • 1

    当用户从“相机”单击操作导航回“活动”时,将重新创建“活动” .

    因此,您需要将文件路径存储在 onSaveInstanceState() 中的Bundle中(确保在 outState Bundle 上调用 putString 后调用 super.onSaveInstanceState(outState); ),然后在 onRestoreInstanceState() 内再次创建文件 .

  • 0

    请检查您的应用中是否配置了相应的权限 AndroidManifest.xml
    READ_EXTERNAL_STORAGE 和/或 WRITE_EXTERNAL_STORAGE

  • 0

    您可以尝试从 Intent 参数中检索图像URI:

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == 0) {
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        imageFile = new File(data.getData().toString());
                        if (imageFile.exists())
                        {
    
  • 0

    我唯一能想到的是你有两个 imageFile 变量,一个是你在intent中定义和发送的变量,另一个是 imageFile 全局变量,总是为null .

    这段代码很完美:

    public class CameraIntentActivity extends AppCompatActivity {
    
        private File imageFile;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_camera_intent);
    
            Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    
            imageFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "abc.jpg");
    
            Uri store= Uri.fromFile(imageFile);
            intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, store);
            intent.putExtra(android.provider.MediaStore.EXTRA_VIDEO_QUALITY, 0);
            startActivityForResult(intent, 0);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if (requestCode == 0) {
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        if (imageFile.exists())
                        {
                            Toast.makeText(this, "The file was saved at " + imageFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
                        }
                        else
                        {
                            Toast.makeText(this, "Error saving the file ", Toast.LENGTH_LONG).show();
                        }
                        break;
                    case Activity.RESULT_CANCELED:
                        break;
                    default:
                        break;
                }
            }
        }
    

相关问题