关于静默安装,我在百度上面查找这个可行的方法,特地记录下来与大家分享,亲测成功!!!
一、需要在AndroidManifest.xml添加系统权限
android:sharedUserId="android.uid.system"
二、注册一个静态广播方便接收消息来安装apk
//注册广播
<receiver android:name="com.android.packageinstaller.SilentInstallReceiver"
android:permission="zqc.permission.SILENT_INSTALL_PERMISSIONS"
android:exported="true">
<intent-filter android:priority="1">
<action android:name="com.zqc.package.silentinstaller" />
</intent-filter>
</receiver>
//接收广播
public class SilentInstallReceiver extends BroadcastReceiver {
private static final String TAG = "SilentInstallReceiver";
private Context mContext;
private static final String ACTION_SILENCE_INSTALL = "com.zqc.package.silentinstaller";
private static final String KEY_FILE_PATH = "file_path";
private static final String KEY_PACKAGE_NAME = "package_name";
private static final int MSG_SILENT_INSTALL = 1;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case MSG_SILENT_INSTALL:
Intent intent = (Intent) msg.obj;
String filePath = intent.getStringExtra(KEY_FILE_PATH);
String packageName = intent.getStringExtra(KEY_PACKAGE_NAME);
Log.i(TAG, "---MSG_SILENT_INSTALL filePath=" + filePath + ",packageName=" + packageName);
SilentInstallManager.getInstance(mContext).startInstall(filePath);//安装应用
break;
default:
break;
}
};
};
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i(TAG, "onReceive() action="+action);
if (ACTION_SILENCE_INSTALL.equals(action)) {
mContext = context;
Message msg = Message.obtain(mHandler);
msg.what = MSG_SILENT_INSTALL;
msg.obj = intent;
mHandler.sendMessage(msg);
}
}
三、核心代码包含静默安装应用和静默卸载应用
1、静默安装应用
public class SilentInstallManager {
private static final String TAG = "SilentInstallManager";
private static SilentInstallManager silentInstallManager;
private static final String BROADCAST_ACTION = "com.android.packageinstaller.ACTION_INSTALL_COMMIT";
private static final String INSTALL_CMD = "install";
private Context mContext;
private SilentInstallManager(Context mContext) {
this.mContext = mContext;
}
public static SilentInstallManager getInstance(Context mContext) {
if (null == silentInstallManager) {
silentInstallManager = new SilentInstallManager(mContext);
}
return silentInstallManager;
}
public static boolean startInstall(String apkPath) {
String[] args = {"pm", INSTALL_CMD, "-r", apkPath};
String result = apkProcess(args);
Log.e(TAG, "install log:" + result);
if (result != null
&& (result.endsWith("Success") || result.endsWith("Success\n"))) {
return true;
}
return false;
}
public static String apkProcess(String[] args) {
String result = null;
ProcessBuilder processBuilder = new ProcessBuilder(args);
Process process = null;
InputStream errIs = null;
InputStream inIs = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read = -1;
process = processBuilder.start();
errIs = process.getErrorStream();
while ((read = errIs.read()) != -1) {
baos.write(read);
}
baos.write('\n');
inIs = process.getInputStream();
while ((read = inIs.read()) != -1) {
baos.write(read);
}
byte[] data = baos.toByteArray();
result = new String(data);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (errIs != null) {
errIs.close();
}
if (inIs != null) {
inIs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
if (process != null) {
process.destroy();
}
}
return result;
}
}
adb shell am broadcast -a com.zqc.package.silentinstaller --es file_path "/storage/sdcard0/DCIM/Video/Demo.apk"
2、静默卸载应用
public static boolean uninstall(String packageName) {
String[] args = {"pm", UNINSTALL_CMD, packageName};
String result = apkProcess(args);
Log.e(TAG, "uninstall log:" + result);
if (result != null
&& (result.endsWith("Success") || result.endsWith("Success\n"))) {
return true;
}
return false;
}