1.先解决怎么调用一些隐藏的API: 找到SDK的路径下的platforms里面有对应的很多Android-10文件夹(由于我是在4.2下测试的我用的是Android-17)打开后里面有个Android.jar包
然后将IPackageInstallObserver.class IPackageInstallObserver$Stub.class PackageManage.class 拷贝到(Android.jar用WinRAR打开)android/ content/pm/目录下保存即可,记住拷贝之前自己要先备份一下Android.jar,等程序写完后记得把Android.jar改回去.
2.然后在Eclipse中建立项目编写源码,记得API要选中自己修改的那个Android.jar包对应的API啊.
import android.content.pm.IPackageInstallObserver; //手工导入类
public void Install(String fileName,String packageName) //安装方法第一个参数是apk所在的路径, 第二个是包名
{
Uri uri = Uri.fromFile(new File(fileName, "MoireAnim.apk"));
int installFlags = 0;
PackageManager pm = getPackageManager();
try {
PackageInfo pi = pm.getPackageInfo(packageName,PackageManager.GET_UNINSTALLED_PACKAGES);//
if(pi != null) {
installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
}
} catch (NameNotFoundException e) {
}
Toast.makeText(MainActivity.this, "安装开始", Toast.LENGTH_SHORT).show();
PackageInstallObserver observer = new PackageInstallObserver();
pm.installPackage(uri, observer, installFlags, packageName);
}
//用于显示结果
class PackageInstallObserver extends IPackageInstallObserver.Stub {
public void packageInstalled(String packageName, int returnCode) {//如果returnCode == 1就为成功
if(returnCode == 1){
Toast.makeText(getApplicationContext(), "安装成功", 0) .show() ;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//执行安装操作
String fileName = Environment.getExternalStorageDirectory().getAbsolutePath(); //当然,自己必须前uc.apk放到这个文件夹里
Install(fileName, "com.example.moireanim") ;
}
3.在AndroidManifest.xml下增加以下权限,加进去后回出现很多错误,直接点击Project选项Clean.. 清除以下缓存就没事了
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.demo"android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="android.uid.system" >>系统级权限
>
<uses-permission android:name="android.permission.INSTALL_LOCATION_PROVIDER" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
<uses-permission android:name="android.permission.INTERNET" />
D:\android-sdk-windows\platforms
4:在运行程序会出现INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 的错误信息.出现是因为我们的程序没有系统级的签名,签名过程:
将platform.x509.pem platform.pk8 SignApk.jar 和刚刚编译出来的Demo.apk放在同一目录下面,然后打开CMD命令进入到改目录下执行:
java -jar signapk.jar platform.x509.pem platform.pk8 Demo.apk Demo_signed.apk即可,Demo_sigend.apk就是签名之后的文件了,直接用adb install Demo_signed.apk运行就行了。
IPackageInstallObserver.class IPackageInstallObserver$Stub.class PackageManage.class 三个class和signapk.jar platform.x509.pem platform.pk8这几个签名文件在这下载即可:
http://download.csdn.net/detail/xl2567893/8491253