所以,因为我有一个这样的文件…
private File createImageFile() throws IOException { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"MyAppFolder"); if (!storageDir.exists() && !storageDir.mkdir()) Log.w(TAG,"Couldn't create photo folder: " + storageDir.getAbsolutePath()); File image = new File(storageDir,timeStamp + ".jpg"); mCurrentPhotoPath = image.getAbsolutePath(); return image; }
…我可以使用公共图片目录的内置提供程序来获取内容URI吗?如果是这样的话
我已经尝试过了
takePictureIntent.putExtra( MediaStore.EXTRA_OUTPUT,FileProvider.getUriForFile(this,MediaStore.AUTHORITY,createImageFile()));
但它只是抛出
IllegalArgumentException: Missing android.support.FILE_PROVIDER_PATHS Meta-data
该机构是否正确?如果我必须使用我自己的提供者共享公共文件,那么我可以在我的FILE_PROVIDER_PATHS元数据中指定哪些路径?所有options I can find都是私人目录.
解决方法@H_404_22@
TL:DR< external-path name =“MyAppFolder”path =“.” />工作,但它是安全的吗? 您将需要自己制作FileProvider.值得一读
documentation,但这里是一个简短的下载.
正如@CommonsWare所提到的,你需要用你的例子中的MediaStore.AUTHORITY替换为“com.example.fileprovider”,这就是你在清单中定义的权限.
在< application>标签在AndroidManifest中键入以下内容:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<Meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
你得到的例外是由于没有< Meta-data>标签,链接到一个xml文件,其中包含您的FileProvider允许触摸的所有路径.但是,这个文件是我自己一直在努力的.
在您链接的教程结束之后,在Save the Full-size Photo部分的末尾,Google给这个file_paths.xml的示例是:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Android/data/com.example.package.name/files/Pictures" />
</paths>
“my_images”将在您的示例中替换为“MyAppFolder”.在Google的这个教训中
The path component corresponds to the path that is returned by getExternalFilesDir() when called with Environment.DIRECTORY_PICTURES. Make sure that you replace com.example.package.name with the actual package name of your app.
…并打字出来让我意识到这并不是指你和我正在寻找的公共Pictures目录.这就解释了为什么使用该路径会产生这种异常:
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Pictures/MyAppFolder/{filename}.jpg
我会留在这里,以备将来参考,并继续回答您的大问题 – 您可以指定什么路径以允许其他应用与您的应用定位API第24级创建的公共图片目录中的文件进行交互?
正如@CommonsWare所说:“您所需的子目录的详细信息因设备而异”,因此您无法声明public Pictures目录的路径,但是我确实找到了一种方法.
< external-path name =“MyAppFolder”path =“.” />将允许您的FileProvider向其他应用程序(如相机)提供内容URI,然后可以读取并写入其解析的文件. 如果有任何危险或缺点,我很乐意听到他们的意见.
正如@CommonsWare所提到的,你需要用你的例子中的MediaStore.AUTHORITY替换为“com.example.fileprovider”,这就是你在清单中定义的权限.
在< application>标签在AndroidManifest中键入以下内容:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.fileprovider" android:exported="false" android:grantUriPermissions="true"> <Meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
你得到的例外是由于没有< Meta-data>标签,链接到一个xml文件,其中包含您的FileProvider允许触摸的所有路径.但是,这个文件是我自己一直在努力的.
在您链接的教程结束之后,在Save the Full-size Photo部分的末尾,Google给这个file_paths.xml的示例是:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_images" path="Android/data/com.example.package.name/files/Pictures" /> </paths>
“my_images”将在您的示例中替换为“MyAppFolder”.在Google的这个教训中
The path component corresponds to the path that is returned by getExternalFilesDir() when called with Environment.DIRECTORY_PICTURES. Make sure that you replace com.example.package.name with the actual package name of your app.
…并打字出来让我意识到这并不是指你和我正在寻找的公共Pictures目录.这就解释了为什么使用该路径会产生这种异常:
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Pictures/MyAppFolder/{filename}.jpg
我会留在这里,以备将来参考,并继续回答您的大问题 – 您可以指定什么路径以允许其他应用与您的应用定位API第24级创建的公共图片目录中的文件进行交互?
正如@CommonsWare所说:“您所需的子目录的详细信息因设备而异”,因此您无法声明public Pictures目录的路径,但是我确实找到了一种方法.
< external-path name =“MyAppFolder”path =“.” />将允许您的FileProvider向其他应用程序(如相机)提供内容URI,然后可以读取并写入其解析的文件. 如果有任何危险或缺点,我很乐意听到他们的意见.