web-dev-qa-db-ja.com

DownloadManagerは、Pieを使用してSamsungの外部ストレージにダウンロードできません

Android DownloadManagerを使用して外部ストレージにDownloadManagerをダウンロードすると、Samsung Galaxy S9、S9 + Android 9(Pie))で失敗します。

Android 8を搭載したSamsungデバイス、またはAndroid 9(Pixel 2など)

マニフェストに次の権限を追加しました。

 "Android.permission.WRITE_EXTERNAL_STORAGE", 
 "Android.permission.READ_EXTERNAL_STORAGE",
 "Android.permission.INTERNET"

実行時にREAD/WRITE_EXTERNAL_STORAGE権限もリクエストしました。

ファイルパスは/storage/4295-DDD5/Android/data/com.example.myapplication/files/filename.fileおよびこのファイルパスが存在します。AndroidStudioのデバイスファイルエクスプローラーを使用して作成しました

ダウンロードを作成する方法:

public void downloadFile(String url, String filePath) {
   DownloadManager mDownloadManager = 
   (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);

   DownloadManager.Request request = new 
   DownloadManager.Request(Uri.parse(url));

   request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | 
   DownloadManager.Request.NETWORK_WIFI);

   request.setVisibleInDownloadsUi(true);

   request.setDestinationUri(Uri.parse("file://" + filePath));

   mDownloadManager.enqueue(request);
}

期待される結果は、指定したファイルをURLからfilePathにダウンロードすることです。代わりに、ログに次のエラーが表示されます。

D/DownloadManager: [8616] Starting com.example.myapplication
W/DownloadManager: [8616] Stop requested with status FILE_ERROR: Failed to generate filename: Java.io.IOException: Permission denied
D/DownloadManager: [8616] Finished with status WAITING_TO_RETRY
V/DownloadManager: MIME Type = application/octet-stream
I/DownloadManager: Download 8616 finished with status WAITING_TO_RETRY
I/DownloadManager: Notification Clear Download 1:com.example.myapplication
12
Oagar

setDestinationInExternalFilesDir(2番目のパラメーターとしてnullを使用)を使用して、なんとか動作させることができました。

これにより、ファイルは要求されたのとまったく同じ場所に保存されますが、実際の実装はSamsungデバイスで動作するようです。また、私は許可を要求しません(*_EXTERNAL_STORAGE)。

0
hrach