Загрузите .apk с помощью DownloadManager

Привет, я столкнулся с небольшой проблемой здесь. Для обновлений моего приложения (которого нет в 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, чтобы он обрабатывался как один.

Надеюсь, я ясно изложил свою мысль, может кто-нибудь помочь?


person Zuop    schedule 27.01.2015    source источник


Ответы (1)


Да ну... как-то глупо..

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

просто влияет на то, как андроид хочет открыть файл.

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

сделаю это...

person Zuop    schedule 27.01.2015