In un mio caso di utilizzo l'applicazione nel server di contatti iniziali scarica l'aggiornamento della stessa applicazione.Installazione APK a livello di codice su Marshmallow
Per il download sto utilizzando la classe DownloadManager di Android. Quindi, utilizzando il codice seguente, tenta di creare l'intento di installazione dell'app in onReceive()
, ad esempio dopo che l'APK è stato scaricato correttamente.
@Override
public void onReceive(Context context, Intent intent) {
//check if the broadcast message is for our Enqueued download
long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (downloadReference == referenceId) {
try {
Log.v("", "Downloading of the new app version complete");
String filepath = Environment.getExternalStorageDirectory() + "/" +
Environment.DIRECTORY_DOWNLOADS + "/" + mLatestVersionFileName;
//start the installation of the latest version
Uri uri = downloadManager.getUriForDownloadedFile(downloadReference);
//downloadManager.getUriForDownloadedFile(downloadReference)
Uri fileLoc = Uri.fromFile(new File(filepath));
Intent promptInstall = new Intent(Intent.ACTION_VIEW);
promptInstall.setDataAndType(uri, "application/vnd.android.package-archive");
promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(promptInstall);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Il codice funziona bene per i dispositivi Pre-Marshmallow e utente ottiene schermo per installare APK.
Questo non funziona sul dispositivo Marshmallow.
sto ottenendo il seguente eccezione Marshmallow:
android.content.ActivityNotFoundException: trovate attività per gestire Intent {atto = android.intent.action.VIEW dat = tenore: // download/my_downloads/287 typ = application/vnd.android.package-archivio FLG = 0x10000000}
ho cercato seguenti cose:
- utilizzando esattamente PackageInstaller di mar shmallow
(com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity)
nome componente come parte di Intent. - Passare fileLoc anziché uri.
promptInstall.setDataAndType(uri, "application/vnd.android.package-archive");
Ciò si traduce in 'errore Parse'.
Gli intenti ideali vengono risolti dal sistema operativo Android. Immagino che non sia un grosso problema e forse mi manchi qualcosa durante la creazione di Intent.