设为首页 加入收藏

TOP

在Android中静默安装应用
2014-11-24 07:15:04 来源: 作者: 【 】 浏览:1
Tags:Android 静默 安装 应用

public interface OnInstalledPackaged {

public void packageInstalled(String packageName, int returnCode);


}


第二步,定义一个系统不可见的接口IPackageInstallObserver,所以包名是不能变的


package android.content.pm;


public interface IPackageInstallObserver extends android.os.IInterface {

public abstract static class Stub extends android.os.Binder implements android.content.pm.IPackageInstallObserver {
public Stub() {
throw new RuntimeException("Stub!");
}


public static android.content.pm.IPackageInstallObserver asInterface(android.os.IBinder obj) {
throw new RuntimeException("Stub!");
}


public android.os.IBinder asBinder() {
throw new RuntimeException("Stub!");
}


public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags)
throws android.os.RemoteException {
throw new RuntimeException("Stub!");
}
}


public abstract void packageInstalled(java.lang.String packageName, int returnCode)
throws android.os.RemoteException;
}


第三步,实现ApplicationManager功能


import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


import android.content.Context;
import android.content.pm.IPackageInstallObserver;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.RemoteException;


public class ApplicationManager {
public final int INSTALL_REPLACE_EXISTING = 2;
public static final int INSTALL_SUCCEEDED = 1;


private PackageInstallObserver observer;
private PackageManager pm;
private Method method;

private OnInstalledPackaged onInstalledPackaged;

class PackageInstallObserver extends IPackageInstallObserver.Stub {


public void packageInstalled(String packageName, int returnCode) throws RemoteException {
if (onInstalledPackaged != null) {
onInstalledPackaged.packageInstalled(packageName, returnCode);
}
}
}

public ApplicationManager(Context context) throws SecurityException, NoSuchMethodException {

observer = new PackageInstallObserver();
pm = context.getPackageManager();

Class< >[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class};
method = pm.getClass().getMethod("installPackage", types);
}

public void setOnInstalledPackaged(OnInstalledPackaged onInstalledPackaged) {
this.onInstalledPackaged = onInstalledPackaged;
}


public void installPackage(String apkFile) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
installPackage(new File(apkFile));
}

public void installPackage(File apkFile) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
if (!apkFile.exists()) throw new IllegalArgumentException();
Uri packageURI = Uri.fromFile(apkFile);
installPackage(packageURI);
}

public void installPackage(Uri apkFile) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
method.invoke(pm, new Object[] {apkFile, observer, INSTALL_REPLACE_EXISTING, null});
}

}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux中如何进行浮点运算? 下一篇获取Android 地图API 密钥

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·数据库:推荐几款 Re (2025-12-25 12:17:11)
·如何最简单、通俗地 (2025-12-25 12:17:09)
·什么是Redis?为什么 (2025-12-25 12:17:06)
·对于一个想入坑Linux (2025-12-25 11:49:07)
·Linux 怎么读? (2025-12-25 11:49:04)