W jednym z przypadków użycia aplikacja na początku kontaktuje się z serwerem i pobiera aktualizację tej samej aplikacji.Instalacja APK programowo na Marshmallow
Do pobierania używam klasy DownloadManager systemu Android. Następnie za pomocą poniższego kodu próbuje utworzyć intencję instalatora aplikacji pod numerem onReceive()
, tj. Po pomyślnym pobraniu pliku APK.
@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();
}
}
}
Kod działa poprawnie na urządzeniach Pre-prawoślazu i użytkownik dostaje ekranie, aby zainstalować plik APK.
To nie działa na urządzeniu Marshmallow.
otrzymuję następujący wyjątek na Marshmallow:
android.content.ActivityNotFoundException: Nie stwierdzono aktywny uchwyt Intent {act = android.intent.action.VIEW dat = zawartość: // download/my_downloads/287 typ = application/vnd.android.package-archiwum FLG = 0x10000000}
próbowałem następujące rzeczy:
- stosując dokładnie PackageInstaller Mar shmallow
(com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity)
nazwa komponentu jako część intencji. - Przekazywanie pliku fileLoc zamiast uri.
promptInstall.setDataAndType(uri, "application/vnd.android.package-archive");
Powoduje to 'błąd Parse'.
Idealne zamiary są rozwiązywane przez system operacyjny Android. Myślę, że to nie jest duży problem i być może brakuje mi czegoś podczas tworzenia Intent.