【问题标题】:Application crash after taking a photo拍照后应用程序崩溃
【发布时间】:2017-02-24 16:32:56
【问题描述】:

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

{
    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} 传递给活动 {com.camera/com.camera.MainActivity} 失败:java.lang.NullPointerException : 尝试在空对象引用上调用虚拟方法 'boolean java.io.File.exists()'

在 android.app.ActivityThread.deliverResults(ActivityThread.java:3758)

在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3801)

在 android.app.ActivityThread.access$1400(ActivityThread.java:157)

在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148)

在 android.app.ActivityThread.main(ActivityThread.java:5551) 在 java.lang.reflect.Method.invoke(Native Method)

在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)

在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean java.io.File.exists()”

在 com.camera.MainActivity.onActivityResult(MainActivity.java:43)

在 android.app.Activity.dispatchActivityResult(Activity.java:6463)

在 android.app.ActivityThread.deliverResults(ActivityThread.java:3754)

在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3801) 处

在 android.app.ActivityThread.access$1400(ActivityThread.java:157)

在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) 处

在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148)

在 android.app.ActivityThread.main(ActivityThread.java:5551) 在 java.lang.reflect.Method.invoke(Native Method)

在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)

在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

我不知道为什么会这样。有谁知道我应该如何修复错误?谢谢!

【问题讨论】:

    标签: android


    【解决方案1】:

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

    【讨论】:

    • 我在 AndroidManifest.xml 文件中都有这两个。
    【解决方案2】:

    您可以尝试从 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())
                        {
    

    【讨论】:

    • 我尝试了你的建议。我仍然有同样的问题。你知道其他方法吗?谢谢!
    【解决方案3】:

    当用户从相机点击操作返回到 Activity 时,Activity 被重新创建。

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

    【讨论】:

    • 我刚开始 Android 编程,并不确定如何在我的应用程序中使用您的解决方案中说明的功能。我应该如何编写您建议的代码?谢谢!
    • 基本上,当您离开某个 Activity 时,该 Activity 可能会被销毁。然后,当您导航回它时,它会被重新创建。现在,您的问题中发生的事情是,在重新创建 Activity 时,您的 File 对象被无效。因此,要恢复其先前的状态,您可以通过覆盖onSaveInstanceState() 将标识的File(即文件路径)保存到Bundle,然后通过覆盖@ 创建File 的新实例987654332@。 Bundle 的对象具有 putStringputInt 等方法。
    【解决方案4】:

    我唯一能想到的是,您有两个 imageFile 变量,一个是您在意图中定义和发送的,另一个是始终为空的 imageFile 全局变量。

    这段代码完美运行:

    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;
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多