启动一个意图:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
CurrentFile = new File(getTempFileString());
CurrentUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", CurrentFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, CurrentUri);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(intent, IMAGE_CAPTURE);
曾经可以工作,现在不行了。我使用的方法是在意图之后启动:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
}
resultCode
曾经使用RESULT_OK
,但现在已更改为RESULT_CANCELED
。
如果我停止检查resultCode
并继续运行,我发现照片不存在。
根据CommonsWare的评论,我提取了日志。在此操作期间生成的654行日志中,有四行似乎与此相关。
2020-10-12 11:03:04.301 1471-1763/? E/MediaProvider: Creating a non-default top level directory or deleting an existing one is not allowed!
2020-10-12 11:03:04.310 477-2112/? I/AppsFilter: interaction: PackageSetting{240e1c6 com.[my app package]/10151} -> PackageSetting{193734c com.android.camera2/10124} BLOCKED
2020-10-12 11:03:04.553 390-9884/? W/ServiceManager: Permission failure: android.permission.SYSTEM_CAMERA from uid=10124 pid=11746
2020-10-12 11:03:14.097 11746-11746/? E/CAM_StateSavePic: exception while saving result to URI: Optional.of(content://[my app package].provider/external_files/[The SD card path I asked for]/1602518584301.jpg)
我要求将文件保存在这里:
new File(Environment.getExternalStorageDirectory(), getString(a.getApplicationInfo().labelRes))
看起来这似乎是个问题。
targetSdkVersion
达到 30 后,您将无法写入外部存储的根目录。我强烈建议您将此图像写入其他位置--例如,您的应用程序应该能够贡献给Pictures/
。如果您非常需要在短期内在此处编写,请在清单文件的<application>
元素中添加android:requestLegacyExternalStorage="true"
。 - CommonsWare