15

我一直在试图关注共享文件上的Android tutorial。 我成立了FileProvider这样的:IllegalArgumentException:未能在FileProvider.getUriForFile上找到包含xxx的配置根

在主清单XML:

<provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="com.example.mysecondapp.fileprovider" 
      android:exported="false" 
      android:grantUriPermissions="true" > 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/filepaths" /> 
     </provider> 

的RES/XML/filpaths.xml文件:

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="myexternalimages" path="SpCars_album/" /> 
</paths> 

而在我的代码,我想如下:

File requestFile = new File(mImageFilenames[position]); 
       try { 
        fileUri = FileProvider.getUriForFile(
          SeventhActivity.this, 
          "com.example.mysecondapp.fileprovider", 
          requestFile); 
       } catch (IllegalArgumentException e) { 
        Log.e("File Selector", 
          "The selected file can't be shared: " + 
            mImageFilenames[position]); 
       } 

requestFile被实例化一个适当的文件的工作路径。 该文件的路径始于getExternalFilesDir(Environment.DIRECTORY_PICTURES)返回的路径。 我只是不明白是什么引起了错误,因为一切似乎都适合。 在此先感谢。

+1

您能否提供完整的logcat输出? – bbuecherl

+0

这是完整的logcat:http://pastebin.com/xbyMewHc – AndroidNewbie

回答

22

该文件的路径与getExternalFilesDir(Environment.DIRECTORY_PICTURES)返回的内容正好开始。

AFAIK,那不会给你一个名为SpCars_album/的目录。

我只是不能理解是什么引起了错误,因为一切似乎都合适。

您提供的文件不是FileProvider可从您定义的根目录中提供的文件。


UPDATE

我忘了,这是依赖于a documentation bug on FileProviderFileProvider<external-path>确实不是getExternalFilesDir()服务文件,而是从Environment.getExternalStorageDirectory()。我创建了a StreamProvider subclass that offers support for getExternalFilesDir()

如果您使用我的StreamProvider,请用<external-files-path name="myexternalimages" path="Pictures/SpCars_album/" />替换<external-path>,那么您应该有更好的运气。

+0

然后假设我想要服务的文件位于以下路径: '/storage/emulated/0/Android/data/com.example。 mysecondapp/files /图片/ SpCars_Album /' 我应该在我的文件路径xml文件中指定什么? – AndroidNewbie

+0

@AndroidNewbie:查看更新后的答案。 – CommonsWare

+0

非常感谢你 – AndroidNewbie

8

这是一个老问题,但我刚刚有类似的问题。

懒惰的解决方案,我发现是只使用:

<external-path name="myexternalimages" path="Android/" /> 

因为getExternalStorageDirectory返回“/存储/模拟/ 0 /”,共享/安卓(下一个级别),将允许在任何文件你的应用程序被访问。

另外,如果你想更精确,你可以这样做:

<external-path name="myexternalimages" path="Android/data/YOUR_BUNDLE_ID/files/SpCars_album" /> 

这并不手感相当不错,但它似乎工作!

+0

尼斯破解,但超级不安全! –

+0

@eAj:像魅力一样工作 - IOU啤酒 – Chepech

+0

等一下,用户显然想要使用** getExternalFilesDirs **,而不是** getExternalStorageDirectory **。那么为什么我们应该指定''而不是''? –

-6

如果您不尝试捕获异常作为IllegalArgumentException为FileProvider.getUriFoFile(),当您运行您的代码时,您也将有此异常。

try { 
    Uri uriForFile = FileProvider.getUriForFile(this,"com.fengfutong.bluetoothc2s.fileprovider", f); 
} catch (IllegalArgumentException e) { 
    e.printStackTrace(); 
} 
相关问题