问题描述
开始意图:
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