使用 DownloadManager 下载 .apk
Download .apk with DownloadManager
您好,我遇到了一个小问题。对于我的应用程序更新(在 Play 商店中不可用),我通过 DownloadManager
将其下载到设备的 Donwload 目录。 .apk 文件位于 ftp 服务器上。
下载后,如果用户想要安装更新,我会弹出一个对话框(不是恶意软件或其他东西,不需要 root)。一切正常 除了 用户取消此对话框并希望 "manually" 通过单击下载目录中下载的文件来安装 apk。如果是这样,我 没有让 Package-Installer 选择打开文件。在某些设备上 "HTML Viewer" 会毫无疑问地打开。如果我通过 QR 码(直接 link)从浏览器下载 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,因此它是一个文件。
希望我表达清楚了,有人可以帮忙吗?
是啊,嗯...有点傻..
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");
会做的...
您好,我遇到了一个小问题。对于我的应用程序更新(在 Play 商店中不可用),我通过 DownloadManager
将其下载到设备的 Donwload 目录。 .apk 文件位于 ftp 服务器上。
下载后,如果用户想要安装更新,我会弹出一个对话框(不是恶意软件或其他东西,不需要 root)。一切正常 除了 用户取消此对话框并希望 "manually" 通过单击下载目录中下载的文件来安装 apk。如果是这样,我 没有让 Package-Installer 选择打开文件。在某些设备上 "HTML Viewer" 会毫无疑问地打开。如果我通过 QR 码(直接 link)从浏览器下载 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,因此它是一个文件。
希望我表达清楚了,有人可以帮忙吗?
是啊,嗯...有点傻..
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");
会做的...