使用DownloadManager下载.apk文件

5

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

下载完成后,如果用户想要安装更新(没有恶意或其他问题,无需root),我会弹出一个对话框。一切都正常,除非用户取消此对话框并希望通过单击下载目录中的已下载文件来“手动”安装apk。如果是这样,我 无法获取Package-Installer 来选择打开该文件。在某些设备上,“HTML Viewer”将被打开而无需询问。如果我通过浏览器从QR码(直接链接)下载apk,一切都很好,因此我想这是使用DownloadManager时出现的问题。

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

以下是用于下载和installIntent的代码:

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,因此它会被视为一个apk文件。希望我表达清楚了,有人能帮忙吗?
1个回答

4

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

(翻译仅供参考)
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");

我会做好它...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接