2014-01-14 14 views
5

私は銀河のS4を持っていますが、私の問題はDownloadManagerを使用してSDカードにファイルをダウンロードできません。実際のSDカードのために、それは私に、このエラーを与える:ここでDownloadManagerを使用してエミュレートされたストレージではなく、実際のSDカードにファイルをダウンロードします。

java.lang.SecurityException: Destination must be on external storage: file:///mnt/extSdCard/Android/data/net.myApp/files/exercises/exec.mp4 

は私のコードです:

DownloadManager dwlManager=(DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE); 

DownloadManager.Request dwlmRequest=new DownloadManager.Request(Uri.parse("http://cdn...")); 
File destination = new File("/mnt/extSdCard/Android/data/net.myApp/files/exercises/exec.mp4");    

dwlmRequest.setDestinationUri(Uri.fromFile(destination)); 
dwlManager.enqueue(dwlmRequest); //<--- Here comes the error. 

私のように目的地を設定した場合:

File destination = new File(getExternalFilesDir(null), "exec.mp4"); 

宛先はエミュレートされた記憶域にあるので、コードは正常に機能します。

File f = new File("/mnt/extSdCard/Android/data/net.myApp/files/exercises/exec.mp4"); 
f.createNewFile(); 

それは動作しますが、私はそのパスでダウンロードマネージャを使用することはできません。 はまた、私のようなSDカードにファイルを作成することができます。

助けてください。 そのパスにファイルをダウンロードできる必要があります。

答えて

2

この問題に時間を費やした後、私はダウンロード後にファイルを任意の場所にコピーするより最適なソリューションを見つけました。 主な問題は、SDカードへのパスを正しく設定していないことです。

それがあった:...

を/ mnt/extSdCard /アンドロイド/データしかし、サムスンギャラクシーS4にそれがあるべき:/ストレージ/ extSdCard /アンドロイド/データ...

デフォルトのダウンロードマネージャダウンロードの宛先としてこのパスで正常に動作しているようです。 次のリンクでは、さまざまなデバイスのSDカードへのパスを検出するコードがかなり見つかりました。http://www.javacodegeeks.com/2012/10/android-finding-sd-card-path.html

これは見た目には見えますが、私にとっては最も最適な解決策です。

2

これはサポートされていません。 DownloadManagerには、SDカードを参照していると思われる場合でも、任意のパスに書き込む権利があるという保証はありません。さらに、/mnt/extSdCard/を使用する独自のコードがあなたのデバイスで動作するかもしれませんが、多くのデバイスにはこのようなディレクトリがないこともあります。これによると

+0

これは実際には推測ではありません。 –

+2

@ChrisStratton:質問を読むと、 'DownloadManager'が特定の' SecurityException'を投げています。 'DownloadProvider'ソースコードを読むと' checkFileUriDestination() 'がこの例外をスローして" DESTINATION_FILE_URIに与えられたファイルURIが有効であることをチェック "することがわかります。したがって、サポートされていません。 'DownloadManager'(または、もっと正確には' DownloadProvider')は普通のアプリです。スーパーユーザー権限で実行しない限り、任意のパスに書き込む権限はありません。 – CommonsWare

+0

いいえ、アプリケーションレベルのチェックを権限と混同しています。それらは2つの**まったく異なる**メカニズムです(実際には3つのパーミッションは2つの実行段階を持ちます)。 –

1

:DownloadManagerは、任意の場所にあるファイルに書き込むため java.lang.SecurityException: Destination must be on external storage

それは不可能です。ただし、「環境」定数を使用してファイルを外部ストレージにダウンロードし、ダウンロードが完了したらファイルを目的の場所にコピーし、最後に標準ファイルAPIを使用して元のファイルを削除します。

関連する問題