检索外部存储路径android时发生java.lang.IllegalArgumentException

时间:2018-01-03 09:52:47

标签: android android-studio file-permissions android-permissions

我已经实现了一个使用设备相机拍摄图像的Android应用程序。我想将图像保存到设备的外部存储目录中。我一直在按照android文档中给出here的说明来实现这一目标。

这是我的代码:

我在清单文件中添加了提供程序。

<provider
        android:authorities="com.efftronics.android.eEmployee.provider"
        android:name="android.support.v4.content.FileProvider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

xml文件夹中,我创建了paths.xml文件并定义了路径元素。

<?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <files-path name="my_images" path="images/"/>
        <files-path name="my_docs" path="docs/"/>
    </paths>

这是Java代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                //mContext.checkImageDirectories();
                String fileName = EmpConstants.startImgName +
                        new SimpleDateFormat(EmpConstants.PhotoFileFormat, Locale.US).format(new Date());
                File outFile = new File(
                        mContext.getEmpImageDirPath() + fileName + ".jpg");
               // File newfile = new File(outFile,"default_image.jpg");
               /* mCurrentPhotoPath = outFile.getPath();
                cameraOpeningIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outFile));*/
                Intent i = new Intent(Intent.ACTION_VIEW,FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID +".provider",outFile));
                i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                /*cameraOpeningIntent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);*/

                startActivityForResult(i, REQUEST_IMAGE_CAPTURE);
            }


        public String getEmpImageDirPath() {
          try {
            return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString()
                    + EmpConstants.appDir;
              } catch (Exception e) {
              Log.d("eEmp/ImgDir", e.toString());
              return "";
        }
}

现在,当我打开相机时,会抛出以下异常:

  

由于java.lang.IllegalArgumentException引发错误:无法找到包含/storage/emulated/0/DCIM/eEmployee/IMG_20180103_150825.jpg

的已配置根目录

我无法弄清楚这个例外的原因。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

您不需要paths.xml文件中<files-path name="my_images" path="images/"/>中的<paths>元素。您关注的链接指出:

  

<files-path name="name" path="path" />表示应用内部存储区域的files/子目录中的文件。该子目录与Context.getFilesDir()返回的值相同。

同样,它也表明:

  

<external-path name="name" path="path" />表示外部存储区根目录中的文件。该子目录的根路径与Environment.getExternalStorageDirectory()返回的值相同。

从您上面分享的代码中,我们可以看到您在函数Environment.getExternalStoragePublicDirectory()中使用getEmpImageDirPath()

因此,要解决此错误,您必须将<files-path name="my_images" path="images/"/>替换为<external-path name="my_images" path="images/" />