很长一段时间以来,我一直在努力解决这个问题……我正在更新一个应用程序,该应用程序使用 DownloadManger 来执行一个简单的任务,例如将文件下载到外部存储公共目录,即:
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
Run Code Online (Sandbox Code Playgroud)
从 Android api 19-28 开始,这里一切正常。在 API 29 (Q/10) 上进行测试时,就会出现问题。Android实作用域存储等弃用getExternalStoragePublicDirectory ......因此,我需要找出一个兼容的解决方案,以支持的API 19- 29。我无法使用内部应用程序存储,因为 DownloadManager 会抛出 SecurityException。Androids 文档指出我可以使用 DownloadManager.RequestsetDestinationUri并且它甚至提到我可以使用的 Android Q Context.getExternalFilesDir(String)。但是,当我这样做时,路径仍然是模拟路径:
/storage/emulated/0/Android/data/com.my.package.name/files/Download/myFile.xml
Run Code Online (Sandbox Code Playgroud)
我从下载管理器收到一个回调,表明下载已完成(使用正确的 ID),但随后我无法从保存它的区域获取下载。我检查文件是否存在并返回false:
new File("/storage/emulated/0/Android/data/com.my.package.name/files/Download/myFile.xml").exists();
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏
添加上下文代码。所以设置下载管理器
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);
}
Run Code Online (Sandbox Code Playgroud)
检查文件是否存在:
new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "myFile.xml").exists(); //this returns false in the onReceive (and download …Run Code Online (Sandbox Code Playgroud) android download android-download-manager android-10.0 scoped-storage