Instalación silenciosa SystemAPP

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(); 
        } 
} 
    }

Supongo que te gusta

Origin blog.csdn.net/Angle_Byron/article/details/130511683
Recomendado
Clasificación