Faça o download do .apk com o DownloadManager

Oi, eu estou enfrentando um pequeno problema aqui. Para atualizações do meu aplicativo (que não está disponível na Play Store), faço o download viaDownloadManager para o diretório Donwload do dispositivo. O arquivo .apk está em um servidor ftp.

Após o download, eu mostro uma caixa de diálogo se o usuário quiser instalar a atualização (não maliciosa ou algo assim, não é necessário root). Tudo funciona bemexceto o usuário cancela esta caixa de diálogo e deseja instalar "manualmente" o apk, clicando no arquivo baixado no diretório de downloads. Se sim, eunão obtenha o instalador de pacotes optar por abrir o arquivo. Em alguns dispositivos, o "HTML Viewer" é aberto sem uma pergunta. Se eu baixar o apk via QR-Code (link direto) do navegador, tudo está bem, então acho que é uma falha no DownloadManager.

Como posso baixar um arquivo do ftpcom DownloadManager, para que seja reconhecido como .apk e eu possa instalá-lo na região de download?

Aqui está o código para baixar e instalar oIntent:

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);

E no download, receba:

@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();
        }

Como você pode ver, eu fiz

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

Eu pensei que iria definir o tipo de arquivo para apk, por isso é alças como um.

Espero ter esclarecido meu argumento, alguém pode ajudar?

questionAnswers(1)

yourAnswerToTheQuestion