1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Android使用adb和PackageInstaller两种方式安装apk

Android使用adb和PackageInstaller两种方式安装apk

时间:2020-03-27 16:29:37

相关推荐

Android使用adb和PackageInstaller两种方式安装apk

简单实现的一个案例,直接上代码

PackageInstaller安装方式

//安装apk服务public class InstallerApkService extends Service {private final static String TAG = "InstallerApkService";@Overridepublic void onCreate() {super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {installApk();return super.onStartCommand(intent, flags, startId);}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}private void installApk() {LogUtils.e(TAG,"==安装");PackageInstaller.Session session = null;try {PackageInstaller packageInstaller = getPackageManager().getPackageInstaller();packageInstaller.registerSessionCallback(new PackageInstaller.SessionCallback() {@Overridepublic void onCreated(int sessionId) {LogUtils.e(TAG,"==onCreated==sessionId: "+sessionId);}@Overridepublic void onBadgingChanged(int sessionId) {LogUtils.e(TAG,"==onBadgingChanged==sessionId: "+sessionId);}@Overridepublic void onActiveChanged(int sessionId, boolean active) {LogUtils.e(TAG,"==onActiveChanged==sessionId: "+sessionId);}@Overridepublic void onProgressChanged(int sessionId, float progress) {LogUtils.e(TAG,"===onProgressChanged=sessionId: "+sessionId+"===progress: "+progress);}@Overridepublic void onFinished(int sessionId, boolean success) {LogUtils.e(TAG,"===onFinished=sessionId: "+sessionId);}});PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);int sessionId = packageInstaller.createSession(params);session = packageInstaller.openSession(sessionId);try (OutputStream packageInSession = session.openWrite("package", 0, -1);InputStream is = getAssets().open("dev-v1.0.1-release.apk")) {byte[] buffer = new byte[16384];int n;while ((n = is.read(buffer)) >= 0) {packageInSession.write(buffer, 0, n);}}// 创建安装状态接收广播Intent intent = new Intent(getApplicationContext(), InstallerApkBroadcastReceiver.class);intent.setAction(PACKAGE_INSTALLED_ACTION);//此处也可以使用getService回调通知PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);IntentSender statusReceiver = pendingIntent.getIntentSender();// 提交会话,这将启动安装工作流mit(statusReceiver);} catch (IOException e) {throw new RuntimeException("Couldn't install package", e);} catch (RuntimeException e) {if (session != null) {session.abandon();}throw e;}}public static final String PACKAGE_INSTALLED_ACTION ="com.rishun.systemsetting.INSTALLER_SETTING";static class InstallStatusBroadcastReceiver extends BroadcastReceiver {private static final String TAG = "InstallStatus";@Overridepublic void onReceive(Context context, Intent intent) {Bundle extras = intent.getExtras();if (PACKAGE_INSTALLED_ACTION.equals(intent.getAction())) {int status = extras.getInt(PackageInstaller.EXTRA_STATUS);String message = extras.getString(PackageInstaller.EXTRA_STATUS_MESSAGE);switch (status) {case PackageInstaller.STATUS_PENDING_USER_ACTION:break;case PackageInstaller.STATUS_SUCCESS://安装成功Log.d(TAG, "Install succeeded!");break;case PackageInstaller.STATUS_FAILURE:case PackageInstaller.STATUS_FAILURE_ABORTED:case PackageInstaller.STATUS_FAILURE_BLOCKED:case PackageInstaller.STATUS_FAILURE_CONFLICT:case PackageInstaller.STATUS_FAILURE_INCOMPATIBLE:case PackageInstaller.STATUS_FAILURE_INVALID:case PackageInstaller.STATUS_FAILURE_STORAGE:Log.e(TAG, "Install failed!" + status + ", " + message);break;default:Log.e(TAG, "Unrecognized status received from installer: " + status);}}}}}

adb安装方式:

private boolean installApp(String packageName, String apkPath) {Process process = null;BufferedReader successResult = null;BufferedReader errorResult = null;StringBuilder successMsg = new StringBuilder();StringBuilder errorMsg = new StringBuilder();try {process = new ProcessBuilder("pm", "install", "-i", packageName, "-r", apkPath).start();successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));String s;while ((s = successResult.readLine()) != null) {successMsg.append(s);}while ((s = errorResult.readLine()) != null) {errorMsg.append(s);}} catch (Exception e) {LogUtils.e("安装异常" + e.getMessage());} finally {try {if (successResult != null) {successResult.close();}if (errorResult != null) {errorResult.close();}} catch (Exception e) {}if (process != null) {process.destroy();}}String re = successMsg.toString();LogUtils.e("result-----" + re+"---apkPath: "+apkPath);//如果含有“success”认为安装成功return successMsg.toString().equalsIgnoreCase("success");}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。