【发布时间】:2016-11-28 14:32:24
【问题描述】:
我正在使用 FileProvider 使用设备的相机拍照,但图像没有保存在目录或任何其他目录中。如何解决问题,以便将捕获的图像保存在目录中?
MainActivity.java
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File storageDir = new File(Environment.getExternalStorageDirectory(), "Test-Folder");
if (!storageDir.exists()) {
storageDir.mkdirs();
}
File image = new File(storageDir, "QR_" + timeStamp + ".png");
Uri photoUri = FileProvider.getUriForFile(MainActivity.this, "com.test", image);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
List<ResolveInfo> resInfoList =
getPackageManager()
.queryIntentActivities(cameraIntent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
grantUriPermission(packageName, photoUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
startActivityForResult(cameraIntent, 1);
provider_paths.xml
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="Test-Folder/"/>
</paths>
【问题讨论】:
-
也许这个特定设备上的相机应用程序不支持
contentUri值。例如,直到今年夏天,Google 自己的相机应用程序才支持视频的content方案。 -
storageDir.mkdirs();。您应该检查返回值,因为 mkdirs 可能会失败并返回 false。如果它是错误的,则显示一个 toast 告诉用户这一点并返回。不要继续其他代码。我敢打赌,该目录不是一开始就创建的。 -
@greenapps 嘿,mkdirs 返回 false,因为我没有在清单文件中添加写入外部存储权限。谢谢你!
-
@CommonsWare 我现在能够在目录中创建和保存图像。我只是想知道是否有办法检查设备是否支持内容 uri?
-
设备不是问题。 相机应用程序是问题所在。而且,不,没有办法检测任何给定的相机应用程序是否支持
EXTRA_OUTPUT的content方案。我最好的建议是让您尽可能将targetSdkVersion保持在 24 以下,这样您就可以继续使用file方案,而世界上的相机应用程序(希望)升级以开始支持content。
标签: android image-processing android-fileprovider