我使用DownloadManager库下载.apk文件,我有一个BroadcastReceiver用于下载服务。这是我在onRecieve()中的代码:
long id = intent.getExtras().getLong(DownloadManager.EXTRA_DOWNLOAD_ID);
DownloadManager dm = (DownloadManager)context.getSystemService(context.DOWNLOAD_SERVICE);
intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(dm.getUriForDownloadedFile(id), "application/vnd.android.package-archive");
context.startActivity(intent);
这里的问题是当我调用UriForDownloadedFile(id)somtimes返回file:///storage/emulated/0/Download/example.apk 并在另一台设备上返回 内容://下载/ all_downloads / 183
并且我无法使用(content:// downloads / all_downloads / 183)路径安装apk
答案 0 :(得分:2)
registerReceiver(
new BroadcastReceiver() {
@Override public void onReceive(Context context, Intent intent) {
final long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
if (downloadId == 0) return;
final Cursor cursor = downloadManager.query(
new DownloadManager.Query().setFilterById(downloadId));
if (cursor.moveToFirst()) {
final String downloadedTo = cursor.getString(
cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
Log.d(TAG, "The file has been downloaded to: " + downloadedTo);
context.startActivity(new Intent(Intent.ACTION_VIEW)
.setDataAndType(Uri.parse(downloadedTo),
"application/pdf"));
}
}
},
new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
答案 1 :(得分:1)
您知道DownloadManager
下载文件的位置,因为您是告诉它下载文件的人。因此,请在Android 6.0及更早版本的设备上删除getUriForDownloadedFile(id)
,并使用Uri.fromFile()
作为您告诉File
下载文件的DownloadManager
。
请注意,在Android 7.0+上,一旦content
达到24或更高,您就必须使用Uri
targetSdkVersion
。幸运的是,安装程序知道如何在Android 7.0及更高版本上处理content
方案。