web-dev-qa-db-ja.com

Android-ファイルが外部SDにある場合のFileProvider getUriForFile

現在、ファイルが外部SDにある場合、FileProvider getUriForFileメソッドはIllegalArgumentExceptionを生成します

ファイルがデバイスのメモリ(/ storage/emulated/0の下)にある場合、正常に動作します。

 Uri videoUri = FileProvider.getUriForFile(this,
            getApplicationContext().getPackageName() + ".provider",
            new File(videoPath));

ここで、videoPathには次の値がありました。

videoPath =  /storage/extSdCard/Android/data/com.podcastcutter.debug/files/episodeMp3/TEDTalks (video)/Why you should love statistics - Alan Smith.mp4  

マニフェストファイルに含まれるもの:

       <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>

そしてここにprovider_paths:

<external-path name="external_files" path="."/>

FileProvider構成を変更してこの問題を解決するにはどうすればよいですか?

前もって感謝します。

生成された例外:

Java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/extSdCard/Android/data/com.podcastcutter.debug/files/episodeMp3/TEDTalks (video)/Why you should love statistics - Alan Smith.mp4 
Android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.Java:711)                  
Android.support.v4.content.FileProvider.getUriForFile(FileProvider.Java:400)

追加の構成情報:

compileSdkVersion 25

buildToolsVersion "23.0.3"

minSdkVersion 16

targetSdkVersion 25

support libraries version : 25.1.1   
8
u2gilles

FileProvider構成を変更してこの問題を解決するにはどうすればよいですか?

できません。 FileProviderはリムーバブルストレージをサポートしていません。

1
CommonsWare

私は自分のprovider.xmlに次の行を追加し、SDカードからファイルURIを取得するために正常に動作します。

<root-path name="external_files" path="/storage/" />

完全なxmlファイル:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="." />
    <root-path
        name="external_files"
        path="/storage/" />
</paths>
16
Rodrigo Jardim

プロバイダーパスのタイプが間違っています。 videoPathにはアプリの外部ストレージへのパスが表示されますが、プロバイダーのパスはデバイスのルート外部ストレージにリンクするexternal-pathを使用しています。 (/storage/emulated/0

プロバイダーパスを<external-files-path>...</external-files-path>に変更します

0
Pztar