【问题标题】:Download .apk with DownloadManager使用 DownloadManager 下载 .apk
【发布时间】:2015-01-27 13:14:12
【问题描述】:

您好,我在这里遇到了一个小问题。对于我的应用程序的更新(在 Play 商店中不可用),我通过 DownloadManager 将其下载到设备的 Donwload 目录。 .apk 文件位于 ftp 服务器上。

下载后,如果用户想要安装更新,我会弹出一个对话框(不是恶意或其他东西,不需要 root)。一切正常除了用户取消此对话框并希望通过单击下载目录中的下载文件来“手动”安装 apk。如果是这样,我没有让 Package-Installer 选择打开文件。在某些设备上,“HTML 查看器”会毫无问题地打开。如果我从浏览器通过 QR 码(直接链接)下载 apk,一切都很好,所以我猜这是 DownloadManager 出现的故障。

我如何使用 DownloadManager 从 ftp 下载文件,以便将其识别为 .apk 并且我可以从下载区域安装它?

这是下载和安装Intent的代码:

String url = "http://www.test.xx/myApp.apk";
Uri mUri = Uri.parse(url);
DownloadManager.Request r = new DownloadManager.Request(mUri);
r.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "myApp.apk");
r.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
DownloadManager dm = (DownloadManager)activity.getSystemService(Context.DOWNLOAD_SERVICE);
dm.enqueue(r);

下载后接收:

@Override
public void onReceive(Context context, Intent intent) {
    try {
        Bundle extras = intent.getExtras();
        long myDownloadID = DashboardActivity.this.mSharedPref.getLong(PreferenceIdentifier.DOWNLOAD_APK.toString(), 0);
        mSharedPref.edit().remove(PreferenceIdentifier.DOWNLOAD_APK.toString()).commit();
        long downloadCompletedId = extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID);
        DownloadManager.Query q = new DownloadManager.Query();

        if (myDownloadID == downloadCompletedId) {
            q.setFilterById(downloadCompletedId);
            DownloadManager mManager = (DownloadManager) MyActivity.this.getSystemService(Context.DOWNLOAD_SERVICE);
            Cursor c = mManager.query(q);
            if (c.moveToFirst()) {
                int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
                    if (status == DownloadManager.STATUS_SUCCESSFUL) {
                        Intent promptInstall = new Intent(Intent.ACTION_VIEW);
                        promptInstall.setDataAndType(
                            Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/myApp.apk")),
                                    "application/vnd.android.package-archive");
                            promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivity(promptInstall);
                    }
            }
            c.close();
        }

如你所见,我做到了

promptInstall.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/myApp.apk")),
"application/vnd.android.package-archive");

我认为这会将文件类型设置为 apk,以便将其作为一个处理。

希望我能说清楚,有人可以帮忙吗?

【问题讨论】:

    标签: android file ftp apk download-manager


    【解决方案1】:

    是的,嗯...有点愚蠢..

    promptInstall.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/myApp.apk")),
    "application/vnd.android.package-archive");
    

    只会影响android想要打开文件的方式..

    DownloadManager.Request r = new DownloadManager.Request(mUri);
                r.setMimeType("application/vnd.android.package-archive");
    

    会做的...

    【讨论】:

      猜你喜欢
      • 2015-09-30
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多