6

我有一個要實現的功能:以編程方式安裝apk。我正在使用的代碼:在Android M開發人員預覽中找不到PackageInstallerActivity

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

callingIntent包含來自另一個服務的apk。

在Android 6.0(MPA44G,Nexus 5)上,這個意圖崩潰了。 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? 

在棒棒糖設備上,上面的代碼工作正常。

Google是否完全刪除了PackageInstallerActivity?是否有任何解決方法在Android 6.0上專門以編程方式安裝apk?

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

回答

2

我得到了答案。 Intent.ACTION_INSTALL_PACKAGE是一個更好的選擇。 如果您的應用程序註冊爲包安裝,使用下面的示例代碼,繞過一個選擇對話框:

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

如果你想使用標準的軟件包安裝,使用下面的代碼:

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

我使用的Nexus 5採用Android M和您的解決方案是給我:'ActivityNotFoundException' – pkuszewski

2

正如你注意到的包路徑不正確,沒有指定它將擺脫崩潰。我們現在有

API <= 22 com.android.packageinstaller 

API >= 23 com.google.android.packageinstaller 

您可以在帶有adb的設備上找到任何系統應用路徑。 我在Nexus 5X上尋找新軟件包安裝程序的例子看起來像這樣。

$ 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運行的是Android 6.0.1版本(API 23): com.google.android.packageinstaller。運行Android 6.0.1(api 23)的Nexus 5:com.android.packageinstaller。檢查API級別不是一個確定的方法來確定包名稱 –

+0

@Bryan約翰遜你真的對嗎?你發佈了2個不同的結果的2個平等的版本?你確定它不是其中之一的預覽版嗎?這仍然是實際的嗎? – David

+0

@David有「錯誤」路徑的設備。我會爲他們添加回退。重試其他路徑。 –

0

除了@Adam Wigren答案:
在Android中6的裝箱率名稱更改,但不是活動

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

要避免:ActivityNotFoundException使用Intent.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); 
相關問題