我在一家手机公司工作,我们的手机基于Android(SDK 1.5),我们可以在手机中签署应用程序并授予其固件权限,例如:
在使用PackageManager时安装外部应用程序。(SDK 1.5)
我就是这么做的:
File src = context.getFileStreamPath(fileName);
Uri mPackageURI = Uri.parse(src.getAbsolutePath());
PackageManager pm = context.getPackageManager();
int installFlags = 0;
try {
PackageInfo pi = pm.getPackageInfo(packageName,
PackageManager.GET_UNINSTALLED_PACKAGES);
if (pi != null) {
Log.debug(TAG, TAG + ":replacing " + fileName);
installFlags |= PackageManager.REPLACE_EXISTING_PACKAGE;
}
} catch (NameNotFoundException e) { }
try {
PackageInstallObserver observer = new PackageInstallObserver();
pm.installPackage(mPackageURI, observer, installFlags);
} catch (SecurityException e) {
//if the app is not signed by the manufacture it will get here a security exception
}
class PackageInstallObserver extends IPackageInstallObserver.Stub {
public void packageInstalled(String packageName, int returnCode) {
}
}
因为我们是人,所以在执行的时候不会有任何异常
安装包(mPackageURI,observer,installFlags);
因为我们已经用管理员权限签署了我们的应用程序。
但我们得到的是这个疯狂的结果和手机重新启动。
threadid=21: thread exiting with uncaught exception (group=0x4000fe70)
07-11 16:29:38.493: ERROR/AndroidRuntime(2561): Uncaught handler: thread PackageManager exiting due to uncaught exception
07-11 16:29:38.493: ERROR/AndroidRuntime(2561): *** EXCEPTION IN SYSTEM PROCESS. System will crash.
07-11 16:29:38.493: ERROR/AndroidRuntime(2561): java.lang.NullPointerException
07-11 16:29:38.493: ERROR/AndroidRuntime(2561): at
com.android.server.PackageManagerService.installPackageLI(PackageManagerService.java:3634)
07-11 16:29:38.493: ERROR/AndroidRuntime(2561): at com.android.server.PackageManagerService.access$1500(PackageManagerService.java:120)
07-11 16:29:38.493: ERROR/AndroidRuntime(2561): at com.android.server.PackageManagerService$5.run(PackageManagerService.java:3253)
07-11 16:29:38.493: ERROR/AndroidRuntime(2561): at android.os.Handler.handleCallback(Handler.java:587)
07-11 16:29:38.493: ERROR/AndroidRuntime(2561): at android.os.Handler.dispatchMessage(Handler.java:92)
07-11 16:29:38.493: ERROR/AndroidRuntime(2561): at android.os.Looper.loop(Looper.java:123)
07-11 16:29:38.493: ERROR/AndroidRuntime(2561): at android.os.HandlerThread.run(HandlerThread.java:60)
第二种方式:
我也试过这种方法,但得到了不同的例外:
*与第一种方式非常相似,只是主要区别在于:
String src = String.format("file:///data/data/com.mirs.agentcore/files/%s", fileName);
Uri mPackageURI = Uri.parse(src);
PackageManager pm = context.getPackageManager();
String src = String.format("file:///data/data/com.mirs.agentcore/files/%s", fileName);
Uri mPackageURI = Uri.parse(src);
PackageManager pm = context.getPackageManager();
int installFlags = 0;
.... //the rest of the code is the same as the First way(mention above)
执行此代码(第二种方式)后,手机会正常继续,但我发现以下异常:
09-12 12:10:16.484:错误/PackageManager(6601):无法将包文件复制到临时文件。