Android DownloadManager类:getUriForDownloadedFile返回错误的路径

时间:2017-04-10 13:23:05

标签: android

我使用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

2 个答案:

答案 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方案。