【问题标题】:Unable to save image from the directory using FileProvider无法使用 FileProvider 从目录中保存图像
【发布时间】: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>

【问题讨论】:

  • 也许这个特定设备上的相机应用程序不支持 content Uri 值。例如,直到今年夏天,Google 自己的相机应用程序才支持视频的 content 方案。
  • storageDir.mkdirs();。您应该检查返回值,因为 mkdirs 可能会失败并返回 false。如果它是错误的,则显示一个 toast 告诉用户这一点并返回。不要继续其他代码。我敢打赌,该目录不是一开始就创建的。
  • @greenapps 嘿,mkdirs 返回 false,因为我没有在清单文件中添加写入外部存储权限。谢谢你!
  • @CommonsWare 我现在能够在目录中创建和保存图像。我只是想知道是否有办法检查设备是否支持内容 uri?
  • 设备不是问题。 相机应用程序是问题所在。而且,不,没有办法检测任何给定的相机应用程序是否支持EXTRA_OUTPUTcontent 方案。我最好的建议是让您尽可能将targetSdkVersion 保持在 24 以下,这样您就可以继续使用file 方案,而世界上的相机应用程序(希望)升级以开始支持content

标签: android image-processing android-fileprovider


【解决方案1】:

这是解决方案。

storageDir.mkdirs();

上面的代码返回false,这是因为我没有在外部存储中放写权限。我在我的 android 清单文件中添加了以下代码。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<!-- other code here-->   

</manifest>

感谢 greenapp 指出 storageDir.mkdirs。

【讨论】:

  • I bet that the directory is not created to begin with.。那么我的奖励在哪里? ;-)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 2012-09-27
相关资源
最近更新 更多