Android 調用相機出現異常 NullPointerException: uri

碰到個很玄學的問題,今天項目需要調用攝像頭,由於之前使用過,直接從原有項目copy了。

異常信息

java.lang.RuntimeException: Unable to resume activity {com.example.androidx/com.example.androidx.activity.FaceDatabaseManage}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.example.androidx/com.example.androidx.activity.FaceDatabaseManage}: java.lang.NullPointerException: uri
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4430)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4470)
        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2199)
        at android.os.Handler.dispatchMessage(Handler.java:112)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7625)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
     Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.example.androidx/com.example.androidx.activity.FaceDatabaseManage}: java.lang.NullPointerException: uri
        at android.app.ActivityThread.deliverResults(ActivityThread.java:5078)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4409)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4470) 
        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51) 
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2199) 
        at android.os.Handler.dispatchMessage(Handler.java:112) 
        at android.os.Looper.loop(Looper.java:216) 
        at android.app.ActivityThread.main(ActivityThread.java:7625) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987) 
     Caused by: java.lang.NullPointerException: uri
        at com.android.internal.util.Preconditions.checkNotNull(Preconditions.java:128)
        at android.content.ContentResolver.openInputStream(ContentResolver.java:1016)
        at com.example.androidx.activity.FaceDatabaseManage.onActivityResult(FaceDatabaseManage.java:246)
        at android.app.Activity.dispatchActivityResult(Activity.java:7797)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:5071)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4409) 
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4470) 
        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51) 
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2199) 
        at android.os.Handler.dispatchMessage(Handler.java:112) 
        at android.os.Looper.loop(Looper.java:216) 
        at android.app.ActivityThread.main(ActivityThread.java:7625) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987) 

代碼相關

調用相機的代碼

 private void startCamaraForRegister() {
        // 創建File對象,用於存儲拍照後的圖片
        File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
        try {
            if (outputImage.exists()) {
                outputImage.delete();
            }
            outputImage.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (Build.VERSION.SDK_INT < 24) {
            imageUri = Uri.fromFile(outputImage);
        } else {
            imageUri = FileProvider.getUriForFile(FaceDatabaseManage.this, AUTHORITY, outputImage);

        }
        // 啓動相機程序
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        System.out.println(imageUri==null);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intent, TAKE_PHOTO);

    }

在這裏我打印了imageUri,這裏顯示不是空,從而執行 startActivityForResult方法

@Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        System.out.println(imageUri==null);
        System.out.println("11111111");

        switch (requestCode) {
            case TAKE_PHOTO:
                if (resultCode == RESULT_OK) {
                    try {
                        //將拍攝的照片顯示到頭像中
                        Bitmap bitmap = BitmapFactory.decodeStream(FaceDatabaseManage.this.getContentResolver().openInputStream(imageUri));
                      
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
          
            default:
                break;
        }
    }

竟然提示imageUri是空的,明明我們先獲取了imageUri ,並且打印顯示不是空的,難道我的全局變量改變了?
更玄學的是,橫屏報錯,正常豎屏就沒問題!!! 於是我就去stackflow上逛了半天

碰見一個跟我一樣的問題
在這裏插入圖片描述
https://stackoverflow.com/questions/20424909/android-startcamera-gives-me-null-intent-and-does-it-destroy-my-global-varia

解決方案:

imanfest文件中,在對應的activity 加

android:windowSoftInputMode="adjustResize"  
android:configChanges="orientation|keyboardHidden|screenSize"

解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章