registrar oyente
<receiver android:name="InstallResultReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.content.pm.extra.STATUS"/> </ filtro de intenciones> </receiver>
clase pública InstallResultReceiver extiende BroadcastReceiver { public final String TAG = "carden" + InstallResultReceiver.class.getSimpleName(); public InstallResultReceiver() { } @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "Receive La transmisión de comentarios de la instalación"); if (intent != null) { final int status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE); Log.d(TAG, "Recibió la transmisión de comentarios de la instalación --"+ estado) ; if (estado == PackageInstaller.STATUS_SUCCESS) { // éxito int requestCode=intent.getIntExtra("flag",0); si (requestCode==1){ Log.d(TAG,"Instalación silenciosa exitosa"); }else if (requestCode==2){ Log.d(TAG,"Desinstalación silenciosa exitosa"); } Log.d(TAG, "APP Install Success!") ; } else { String msg = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE); Log.e(TAG, "Install FAILURE status_massage" + msg); } } } }
2. Instalación, la ruta se completa dinámicamente de acuerdo con su propia autorización, lo escribí hasta la muerte
private void silentInstallApk(Context context,String apkFilePath, String apkName) { File apkFile = new File(apkFilePath); long apkFileLength = apkFile.length(); PackageManager pm = context.getPackageManager(); PackageInstaller paqueteInstaller = pm.getPackageInstaller(); packageInstaller.registerSessionCallback(nuevo PackageInstaller.SessionCallback() { @Override public void onCreated(int sessionId) { Log.e(TAG, "Install Start sessionId-> " + sessionId); } @Override public void onBadgingChanged(int sessionId) {} @Override public void onActiveChanged(int sessionId, boolean active) {} @Override public void onProgressChanged(int sessionId, float progress) {} @Override public void onFinished(int sessionId, boolean success) { if (success) { Log.e(TAG, "Silent Install Success"); } else { Log.e(TAG, "Error de instalación silenciosa"); } } }); conteo int; ID de sesión int; byte[] búfer = nuevo byte[1024*1024]; flujo de entrada flujo de entrada; flujo de salida flujo de salida; PackageInstaller.Session session = null; PackageInstaller.SessionParams sessionParams; intentar { sessionParams = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL); sessionId = paqueteInstaller.createSession(sessionParams); sesión = paqueteInstaller.openSession(sessionId); Log.e(TAG, "Inicio de instalación ID de sesión-> " + ID de sesión); inputStream = nuevo FileInputStream(apkFile); outputStream = session.openWrite("base.apk", 0, apkFileLength); while((recuento = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, count); progreso flotante = ((flotante) cuenta / (flotante) apkFileLength); session.setStagingProgress(progreso); } sesión.fsync(outputStream); inputStream.close(); salidaStream.flush(); flujo de salida.close(); Intención intención = nueva intención (esto, InstallResultReceiver.class); intent.putExtra("bandera", 1); PendingIntentpendienteIntent = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); session.commit(pendingIntent.getIntentSender()); } catch (Excepción e) { e.printStackTrace(); } finalmente { if (sesión != nulo) { sesión.cerrar(); } } } int mSessionId =-1; public String installApp(String apkFilePath) { String éxito = "fallo"; Log.d(TAG, "installApp()------->" + apkFilePath); Archivo apkFile = nuevo archivo (apkFilePath); if (!apkFile.exists()) { Log.d(TAG, "文件不存在"); } PackageInfo packageInfo = getPackageManager().getPackageArchiveInfo(apkFilePath, PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES); if (información del paquete! = nulo) { String nombre del paquete = información del paquete.nombre del paquete; int versionCode = packageInfo.versionCode; String versionName = packageInfo.versionName; Log.d("ApkActivity", "packageName=" + packageName + ", versionCode=" + versionCode + ", PackageInstaller packageInstaller = getPackageManager().getPackageInstaller(); PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstaller .SessionParams.MODE_FULL_INSTALL); Log.d(TAG, "longitud del archivo apk" + apkFile.longitud()); sessionParams.setSize(apkFile.length()); prueba { mSessionId = packageInstaller.createSession(sessionParams); } catch (IOException e) { e.printStackTrace(); } Registro.d(ETIQUETA, if (mSessionId != -1) { boolean copySuccess = onTransfesApkFile(apkFilePath); Log.d(TAG, "copiarÉxito---->" + copiarÉxito); si (copiarÉxito) { booleano isSuccess = execInstallAPP(); éxito = eséxito? "Éxito" : "fracaso"; Log.d(TAG, "静默成功---" + isSuccess); } } devuelve el éxito; } booleano privado onTransfesApkFile(String apkFilePath) { Log.d(TAG, "---------->onTransfesApkFile()<------------------- --"); InputStream en = nulo; OutputStream fuera = nulo; PackageInstaller.Session session = null; éxito booleano = falso; intente { Archivo apkFile = nuevo archivo (apkFilePath); sesión = getPackageManager().getPackageInstaller().openSession(mSessionId); session.close(); out = session.openWrite("base.apk", 0, apkFile.length()); en = nuevo FileInputStream(apkFile); int total = 0, c; byte[] búfer = nuevo byte[1024 * 1024]; while ((c = in.read(buffer)) != -1) { total += c; out.write(búfer, 0, c); } sesión.fsync(fuera); Log.d(TAG, "transmitido " + total + " bytes"); éxito = verdadero; } catch (IOException e) { e.printStackTrace(); } finalmente { if (null != session) { if (null != out) { out.close(); } intente { intent.putExtra("bandera", 1); } if (null != in) { in.close(); } } catch (IOException e) { e.printStackTrace(); } } devuelve el éxito; } private boolean execInstallAPP() { Log.d(TAG, "--------------------->execInstallAPP()<---------- --------"); PackageInstaller.Session session = null; pruebe { sesión = getPackageManager().getPackageInstaller().openSession(mSessionId); Intención intención = nueva intención (esto, InstallResultReceiver.class); PendienteIntentpendienteIntent = PendingIntent.getBroadcast(this, 1, intent PendingIntent.FLAG_UPDATE_CURRENT); session.commit(pendingIntent.getIntentSender()); devolver verdadero; } catch (IOException e) { e.printStackTrace(); falso retorno; } finalmente { if (null != session) { session.close(); } } }