无法在Android 11上以编程方式拍摄照片-意向返回取消状态

问题描述

开始意图:

  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))

这似乎是问题所在。

解决方法

@CommonsWare确实值得在这里功劳。问题是源代码中的getTempFileString()调用。我试图将文件保存到临时路径,以便稍后将其删除。该文件仅存在不久。 Google阻止了对此的访问。 Camera应用程序收到有关无法保存到此路径的错误,但是未引发错误或显示消息。它只是将RESULT_CANCELED的结果返回给我的应用程序。我通过更新本地缓存目录getExternalCacheDir()的路径来解决此问题,并在其中使用了一个子目录。

,

您不应该使用“getExternalStoragePublicDirectory()”,因为这是共享存储行为,并且从(可能)2021 年 7 月 5 日起,Play 商店中的所有应用程序都必须针对 android SDK 30 并仅使用 Scoped Storage(因此您不能使用“requestLegacyStorage”,与“preserveLegacyStorage”相关。

建议您将目标路径更改为:

∂L/∂z

祝你有美好的一天和美好的编码 :D