Привет, я столкнулся с небольшой проблемой здесь. Для обновлений моего приложения (которого нет в Play Store) я загружаю его через DownloadManager
в каталог Donwload на устройстве. Файл .apk находится на ftp-сервере.
После загрузки у меня появляется диалоговое окно, если пользователь хочет установить обновление (не злонамеренное или что-то в этом роде, рут не нужен). Все работает нормально, за исключением, когда пользователь отменяет это диалоговое окно и хочет «вручную» установить apk, щелкнув загруженный файл в каталоге загрузки. Если это так, я не заставляю Package-Installer открывать файл. На некоторых устройствах "HTML Viewer" открывается без вопросов. Если я загружаю apk через QR-код (прямая ссылка) из браузера, все в порядке, поэтому я предполагаю, что это сбой, связанный с DownloadManager.
Как я могу загрузить файл с ftp с помощью DownloadManager, чтобы он распознавался как .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, чтобы он обрабатывался как один.
Надеюсь, я ясно изложил свою мысль, может кто-нибудь помочь?