Android Camera Intent在Android 11中未响应

问题描述

我再次需要您的帮助。 我正在使用Camera Intent,但我不明白我的代码有什么问题,直到Android 10一切正常,但是在Android 11中我得到的结果是代码0。 我在下面共享代码,请帮助我解决我的问题:

  1. 清单权限 <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  2. 创建文件的意图函数

    private void openCameraApp() { 意图picIntent =新的意图(MediaStore.ACTION_IMAGE_CAPTURE)。 addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 尝试{

             String file_path = Environment.getExternalStorageDirectory().toString() +
                     "/" + mContext.getResources().getString(R.string.app_name);
    
             File dir = new File(file_path);
             if (!dir.exists())
                 dir.mkdirs();
    
             imagePath = new File(dir,mContext.getResources().getString(R.string.app_name) + System.currentTimeMillis() + ".png");
    
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                 picIntent.putExtra(MediaStore.EXTRA_OUTPUT,FileProvider.getUriForFile(mContext,BuildConfig.APPLICATION_ID,imagePath));
                 setUri(FileProvider.getUriForFile(mContext,imagePath));
             } else {
                 picIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(imagePath));
                 setUri(Uri.fromFile(imagePath));
             }
    
             ((Activity) mContext).startActivityForResult(picIntent,CAMERA_REQUEST);
    
         } catch (Exception e) {
             logger.e(e);
         }
     }
    

我已在清单文件的应用程序标记添加android:requestLegacyExternalStorage="true"。 如果代码发布管理不当,我感到非常抱歉,因为我尝试正确地发布它,但是仍然无法对齐。 预先感谢,请帮助。

解决方法

请参见intent.resolveActivity returns null in API 30。 AndroidManifest可能有问题。

<queries>
    <intent>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
    </intent>
</queries>

或参见Cannot take a photo programmatically on Android 11 - intent returns canceled status

,

这是因为您的应用没有权限访问Android 10中的存储,因为, Android已添加新的权限属性,用于访问使用Android 10及更高版本的设备中的存储,您必须在清单中添加

<manifest >
  <application android:requestLegacyExternalStorage="true" >
    ...
   </application>
</manifest>

希望问题的答案:)

,

删除这个 .putExtra(MediaStore.EXTRA_OUTPUT