6

Ich habe eine Funktion implementiert werden: eine apk programmatisch installieren. Code, den ich verwende:PackageInstallerActivity nicht auf Android M Entwickler-Vorschau gefunden

ComponentName comp = new ComponentName("com.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity"); 
Intent newIntent = new Intent(callingIntent); 
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
newIntent.setComponent(comp); 

Der CallingIntent enthält eine APK von einem anderen Dienst.

Auf Android 6.0 (MPA44G, Nexus 5) wird diese Absicht abstürzt. Logcat:

08-20 14:58:56.127 26222 26222 E AndroidRuntime: Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity}; have you declared this activity in your AndroidManifest.xml? 

Auf Lollipop-Geräten funktioniert der obige Code einwandfrei.

Hat Google vollständig PackageInstallerActivity entfernt? Gibt es eine Problemumgehung programmgesteuert eine APK speziell für Android 6.0 zu installieren?

Referenz: Issue 3017: Unable to find explicit activity class com.android.packageinstaller.PackageInstallerActivity

Antwort

2

bekam ich die Antwort. Intent.ACTION_INSTALL_PACKAGE ist eine bessere Wahl. Wenn Ihre App als Paketinstallationsprogramm registriert ist, verwenden Sie den folgenden Beispielcode ein Auswahldialog zu umgehen:

intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); 
intent.setData(Uri.fromFile(file)); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

Wenn Sie das Standard-Paket-Installer verwenden möchten, verwenden Sie folgenden Code:

File apkFile = new File(apkFileString); 
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); 
mContext.startActivity(intent); 
+2

mit Ich bin mit Nexus 5 mit Android M und Ihre Lösung gibt mir: 'ActivityNotFoundException' – pkuszewski

2

Wie Sie festgestellt haben, war der Paketpfad falsch und wenn Sie ihn nicht angeben, wird der Absturz behoben. Wir haben jetzt

API <= 22 com.android.packageinstaller 

API >= 23 com.google.android.packageinstaller 

Sie können jeden System-App-Pfad auf einem Gerät mit adb finden. Ein Beispiel für mich für ein neues Paket-Installer auf einem Nexus 5X suchen sieht wie folgt aus.

$ adb shell 'pm list packages -f install' 

package:/data/app/android.autoinstalls.config.google.nexus-1/base.apk=android.autoinstalls.config.google.nexus 
package:/system/app/CertInstaller/CertInstaller.apk=com.android.certinstaller 
package:/system/priv-app/GooglePackageInstaller/GooglePackageInstaller.apk=com.google.android.packageinstaller 
+0

Nexus 5X mit Android-Version 6.0.1 (api 23): com.google.android.packageinstaller. Nexus 5 läuft Android 6.0.1 (api 23): com.android.packageinstaller. Überprüfen API-Ebene ist keine garantierte Methode, dass Paketnamen –

+0

@Bryan Johnson sind Ihnen wirklich richtig zu bestimmen? Du hast 2 gleiche Versionen mit 2 verschiedenen Ergebnissen gepostet? Sind Sie sicher, dass es auf einem von ihnen keine Vorschauversion gab? Ist das immer noch aktuell? – David

+0

@ David Es gibt Geräte mit „falschen“ Weg da draußen. Ich würde beiden Fallbacks hinzufügen. Wiederholen mit dem anderen Pfad. –

0

Zusätzlich Antwort auf @ Adam Wigren:
In Android 6 der packge Name wurde geändert, aber nicht die Aktivität

ComponentName comp; 
if(android.os.Build.VERSION.SDK_INT < 23){ 
    comp = new ComponentName("com.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity"); 
}else{ 
    comp = new ComponentName("com.google.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity"); 
} 

Intent newIntent = new Intent(callingIntent); 
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
newIntent.setComponent(comp); 
0

können Sie einfach öffnen apk-Datei in android6.0. see demo code

0

zu vermeiden: ActivityNotFoundExceptionIntent.ACTION_INSTALL_PACKAGE

ComponentName comp; 
File apkFile = new File(apkFileString); 
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); 

if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1/*23*/){ 
comp = new ComponentName("com.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity"); 
}else{ 
comp = new ComponentName("com.google.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity"); 
} 

intent.setComponent(comp); 
startActivity(intent);