私は銀河の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カードにファイルを作成することができます。
助けてください。 そのパスにファイルをダウンロードできる必要があります。
これは実際には推測ではありません。 –
@ChrisStratton:質問を読むと、 'DownloadManager'が特定の' SecurityException'を投げています。 'DownloadProvider'ソースコードを読むと' checkFileUriDestination() 'がこの例外をスローして" DESTINATION_FILE_URIに与えられたファイルURIが有効であることをチェック "することがわかります。したがって、サポートされていません。 'DownloadManager'(または、もっと正確には' DownloadProvider')は普通のアプリです。スーパーユーザー権限で実行しない限り、任意のパスに書き込む権限はありません。 – CommonsWare
いいえ、アプリケーションレベルのチェックを権限と混同しています。それらは2つの**まったく異なる**メカニズムです(実際には3つのパーミッションは2つの実行段階を持ちます)。 –