15

私はファイル共有に関してAndroid tutorialに従おうとしています。 私はこのようなFileProviderセットアップ:私はしようとしていますIllegalArgumentException:FileProvider.getUriForFileでxxxを含む設定ルートを見つけることができませんでした

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

そして、私のコードで:

メインマニフェスト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ファイルを次のようになります。

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です: 「/storage/emulated/0/Android/data/com.example:http://pastebin.com/xbyMewHc – AndroidNewbie

答えて

22

このファイルのパスは、getExternalFilesDir(Environment.DIRECTORY_PICTURES)が返すもので正確に始まります。

AFAIKという名前のディレクトリには、SpCars_album/という名前のディレクトリはありません。

私はすべてが収まるように見えるので、何がエラーを起こすのか理解できません。

あなたが指定したファイルは、定義されたルーツのFileProviderによって提供できるファイルではありません。


UPDATE

私はこれがa documentation bug on FileProviderに結びついていることを忘れてしまいました。 FileProvider<external-path>で、getExternalFilesDir()からのファイルですが、代わりにEnvironment.getExternalStorageDirectory()です。私はa StreamProvider subclass that offers support for getExternalFilesDir()を作成しました。

私のStreamProviderを使用して、<external-path><external-files-path name="myexternalimages" path="Pictures/SpCars_album/" />に置き換えた場合は、運がよかったはずです。

+0

は、その後、私は奉仕したいファイルは次のパスにあると仮定。 mysecondapp/files/Pictures/SpCars_Album/' filepaths 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" /> 

これはかなり右に感じることはありませんが、動作するように見えるん!あなたは()FileProvider.getUriFoFileについてはIllegalArgumentExceptionとしてキャッチ例外を試すいけない場合

+0

素敵なハックですが、スーパー不安!!! –

+0

@eAj:魅力のように働いた - IOUビール – Chepech

+0

秒を待っては、ユーザーが明確に**、NOT ** getExternalStorageDirectory ** ** getExternalFilesDirsを使用することを望んでいます。だから、なぜ ''の代わりに ''を指定すべきですか? –

-6

、あなたのコードを実行するときに、あなたも、この例外があります。

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