Android M开发人员预览

时间:2015-08-25 18:25:11

标签: android android-activity android-install-apk android-6.0-marshmallow

我有一个要实现的功能:以编程方式安装apk。代码I使用:

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?

在Lollipop设备上,上面的代码工作正常。

Google是否完全删除了PackageInstallerActivity?是否有任何解决方法以编程方式在Android 6.0上专门安装apk?

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

5 个答案:

答案 0 :(得分: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);  

答案 1 :(得分: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

答案 2 :(得分: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);

答案 3 :(得分:0)

你可以在android6.0中打开apk文件。 see demo code

答案 4 :(得分: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);