Pau*_*aul 3 java android 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);
Run Code Online (Sandbox Code Playgroud)
曾经工作。现在不行了。我在意图之后开始的方法是:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
}
Run Code Online (Sandbox Code Playgroud)
在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)
Run Code Online (Sandbox Code Playgroud)
我要求文件保存在这里:
new File(Environment.getExternalStorageDirectory(), getString(a.getApplicationInfo().labelRes))
Run Code Online (Sandbox Code Playgroud)
这似乎是问题所在。
在这里,@CommonsWare 确实值得称赞。问题是getTempFileString()源代码中的调用。我试图将文件保存到临时路径,以便我可以在之后立即删除它。该文件仅存在不久。谷歌阻止了对此的访问。该Camera应用程序收到一个错误有关无法保存到该路径,但它并不会引发错误或显示消息。它只是返回了一个RESULT_CANCELED返回到我的应用程序的结果。我通过更新用于本地缓存目录的路径解决了这个问题,getExternalCacheDir()并在其中使用了一个子目录。
编辑:添加对我有用的代码。删除了特定于应用程序的文本以及错误处理以使其简短和简单。
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File path = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "My Application Directory");
if (!path.exists()) {
path.mkdir();
}
File imageFile = File.createTempFile("Your file Name", ".jpg", path);
Context context = getActivity().getBaseContext();
Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", imageFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
context.grantUriPermission(packageName, CurrentUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
startActivityForResult(intent, IMAGE_CAPTURE); // IMAGE_CAPTURE = 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4346 次 |
| 最近记录: |