私はかなりの間にこの問題に対して頭を殴ってきました...私は、外部記憶域パブリックディレクトリにファイルをダウンロードするような単純なタスクを実行するために、ダウンロードマンガを使用するアプリを更新しています。
_Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
_
ここではすべてが細かく機能します。Android API 19-28。 API 29(Q/10)でテストするときの問題が発生するところです。 Android実装されたスコープされたストレージと、getExternalStoragePublicDirectory ...を非推奨にしました。結果として、API 19 -29をサポートするための互換性のあるソリューションを見つける必要があります。 DownloNationManagerがSecurityExceptionをスローするため、Internal Application Storageを使用できません。 Androidのマニュアルは、DownloNationManager.Request setDestinationUri
を使用できることを示しています。Context.getExternalFilesDir(String)
を使用できることをAndroid qでも正確に説明します。私がこれをするとき、パスはまだエミュレートされたパスです。
_/storage/emulated/0/Android/data/com.my.package.name/files/Download/myFile.xml
_
ダウンロードマネージャからダウンロードが完了したこと(正しいIDを持つ)でコールバックが表示されますが、保存した領域からダウンロードをつかむことはできません。ファイルが存在するかどうかを確認し、Falseを返します。
_new File("/storage/emulated/0/Android/data/com.my.package.name/files/Download/myFile.xml").exists();
_
あらゆる助けがあります
コンテキストのコードを追加します。だからダウンロードマネージャを設定します
_ private void startDownload() {
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
registerReceiver(downloadReceiver, filter);
String remoteURL= getString(R.string.remote_url);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(remoteUrl));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
request.setTitle(getString(R.string.download_title));
request.setDescription(getString(R.string.download_description));
request.setDestinationUri(Uri.fromFile(new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "myFile.xml")));
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
mainDownloadID= manager.enqueue(request);
}
_
ファイルが存在する場合はファイルを確認してください。
_new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "myFile.xml").exists(); //this returns false in the onReceive (and download IDs match)
_
Android Q以上]で、アプリのプライベートディレクトリの外部のファイルパス。
参照 https://developer.android.com/training/data-storage#scoped-storage
ユーザーにファイルをダウンロードする場所に問い合わせる必要がありますが、これによりDownloadManager
宛先のURIが表示されます。
https://developer.android.com/training/data-storage/shared/documents-files#grant-Access-Directory - *
あなたはおそらくこの許可を永続化したいでしょう
https://developer.android.com/training/data-storage/shared/documents-files#persist-permissions :
ええ、そのスコープストレージがQ +でファイルをダウンロードすることはできますが、DownloadMangerを使用する必要がありませんAndroid:requestLegacyExternalStorage="true"
_
私はこのようにしています。
ダウンロードマンガー
val fileName =
Constants.FILE_NAME + Date().time
val downloadUri = Uri.parse(media.url)
val request = DownloadManager.Request(
downloadUri
)
request.setAllowedNetworkTypes(
DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE
)
.setAllowedOverRoaming(true).setTitle("Some name")
.setDescription("Downloading file")
.setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS, File.separator + FOLDER + File.separator + fileName
)
Toast.makeText(
context,
"Download successfully to ${downloadUri?.path}",
Toast.LENGTH_LONG
).show()
downloadManager.enqueue(request)
_
したがって、QとQ +では、QとQ +で書き込み権限を求めます。