2017-03-07 29 views
1

を使用してSDカードに保存された画像のコンテンツURIを取得する - 私が使用しています/storage/emulated/0/私は絶対パスでSDカードに保存された画像ファイルのファイル・プロバイダ

からstorage/4469-0C17/DCIM/...と絶対パスで内部ストレージに保存されている別の画像をFileProviderを使用して外部のアプリケーションと共有できます。

さて、私は内部ストレージに保存された画像を共有することができていますが、外部記憶装置に格納された画像のために、それのようにエラーがスローされます -
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/4469-0C17/DCIM/....

私のマニフェスト -

<manifest> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <application> 
    ..... 
     <provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="${applicationId}.provider" 
      android:exported="false" 
      android:grantUriPermissions="true"> 
       <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/provider_paths" /> 
     </provider> 
    </application> 
</manifest> 

provider_paths .xmlの

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="external_files" path="."/> 
</paths> 

コード -

Intent share = new Intent(Intent.ACTION_SEND); 
share.setType("image/*"); 
File imageFileToShare = new File(filePath); 
Uri imageURI = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", imageFileToShare); 
share.putExtra(Intent.EXTRA_STREAM, imageURI); 
share.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
context.startActivity(Intent.createChooser(share, "Share Image")); 
+0

: – LearnPainLess

答えて

0

とAndroid SDKがexternal storageというものであり、絶対パスを有する内部記憶装置に格納された他の画像

が、外部記憶装置に記憶された画像のために、それはのようにエラーをスロー - java.lang.IllegalArgumentExceptionがは:/ストレージ/ 4469-0C17/DCIMを含有する構成ルートを見つけることができませんでした/ ....

まず、外部記憶装置ではなく、removable storageです。

第2に、FileProviderはリムーバブルストレージをサポートしていません。

+0

アンドロイドで私のアプリはとにかくクラッシュします。 ?それをサポートする方法はありますか? – Harshit

+0

@Harshit:AFAIK、あなたのアプリは 'storage/4469-0C17/DCIM /'への直接フ​​ァイルシステムアクセスを持っていないので、どこからそのパスを取得したのか分かりません。 – CommonsWare

0

あなた自身が非常に限られていると思われるFileProviderを使用する代わりに、ContentProviderから独自のプロバイダを派生させるほうがよいでしょう。

次に、任意のファイルを提供できます。

CommonsWareには、そのようなファイルプロバイダを設定する方法の良い例があります。代わりにあなたのprovider_paths.xmlファイルに

<root-path path="." name="external_files" /> 
0

は、あなたのprovider_paths.xmlこれに追加します ''試してみてください '/'
関連する問題