android.content.pm.PackageInstaller#Session()源码实例Demo

下面列出了android.content.pm.PackageInstaller#Session() 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

源代码1 项目: splitapkinstall   文件: MainActivity.java
private int doCommitSession(int sessionId, boolean logSuccess) throws RemoteException {
    PackageInstaller.Session session = null;
    try {
        try {
            session = packageInstaller.openSession(sessionId);
        } catch (IOException e) {
            e.printStackTrace();
        }

        Intent callbackIntent = new Intent(getApplicationContext(), APKInstallService.class);
        PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, callbackIntent, 0);
        session.commit(pendingIntent.getIntentSender());
        session.close();

        System.out.println("install request sent");

        Log.d(TAG, "doCommitSession: " + packageInstaller.getMySessions());
        Log.d(TAG,
                "doCommitSession: after session commit ");
        return 1;
    } finally {
        session.close();
    }
}
 
private int doRemoveSplit(int sessionId, String splitName, boolean logSuccess)
        throws RemoteException {
    final PrintWriter pw = getOutPrintWriter();
    PackageInstaller.Session session = null;
    try {
        session = new PackageInstaller.Session(
                mInterface.getPackageInstaller().openSession(sessionId));
        session.removeSplit(splitName);

        if (logSuccess) {
            pw.println("Success");
        }
        return 0;
    } catch (IOException e) {
        pw.println("Error: failed to remove split; " + e.getMessage());
        return 1;
    } finally {
        IoUtils.closeQuietly(session);
    }
}
 
源代码3 项目: Shelter   文件: DummyActivity.java
private void actionInstallPackageQ(Uri uri) throws IOException {
    PackageInstaller pi = getPackageManager().getPackageInstaller();
    PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
            PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    int sessionId = pi.createSession(params);

    // Show the progress dialog first
    pi.registerSessionCallback(new InstallationProgressListener(this, pi, sessionId));

    PackageInstaller.Session session = pi.openSession(sessionId);
    doInstallPackageQ(uri, session, () -> {
        // We have finished piping the streams, show the progress as 10%
        session.setStagingProgress(0.1f);

        // Commit the session
        Intent intent = new Intent(this, DummyActivity.class);
        intent.setAction(PACKAGEINSTALLER_CALLBACK);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        session.commit(pendingIntent.getIntentSender());
    });
}
 
源代码4 项目: YalpStore   文件: InstallerPrivilegedSession.java
@Override
protected void install(App app) {
    registerReceiver();
    PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
    PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    sessionParams.setAppPackageName(app.getPackageName());
    sessionParams.setAppLabel(app.getDisplayName());
    PackageInstaller.Session session = null;
    try {
        int sessionId = packageInstaller.createSession(sessionParams);
        session = packageInstaller.openSession(sessionId);
        for (File file: Paths.getApkAndSplits(context, app.getPackageName(), app.getVersionCode())) {
            writeFileToSession(file, session);
        }
        session.commit(getIntentSender(sessionId));
    } catch (IOException e) {
        fail(e, app.getPackageName());
    } finally {
        com.github.yeriomin.yalpstore.Util.closeSilently(session);
    }
}
 
源代码5 项目: YalpStore   文件: InstallerPrivilegedSession.java
private void writeFileToSession(File file, PackageInstaller.Session session) throws IOException {
    InputStream in = context.getContentResolver().openInputStream(FileProvider.getUriForFile(
        context,
        BuildConfig.APPLICATION_ID + ".fileprovider",
        file
    ));
    OutputStream out = session.openWrite(file.getName(), 0, file.length());
    try {
        int c;
        byte[] buffer = new byte[65536];
        while ((c = in.read(buffer)) != -1) {
            out.write(buffer, 0, c);
        }
        session.fsync(out);
    } finally {
        com.github.yeriomin.yalpstore.Util.closeSilently(in);
        com.github.yeriomin.yalpstore.Util.closeSilently(out);
    }
}
 
源代码6 项目: xDrip   文件: VersionFixer.java
private static boolean installPackage(Context context, InputStream in, String packageName)
        throws IOException {
    final PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
    final PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
            PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    params.setAppPackageName(packageName);

    final int sessionId = packageInstaller.createSession(params);
    final PackageInstaller.Session session = packageInstaller.openSession(sessionId);
    final OutputStream out = session.openWrite("COSU", 0, -1);
    final byte[] buffer = new byte[65536];
    int bytes_read;
    while ((bytes_read = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytes_read);
    }
    session.fsync(out);
    in.close();
    out.close();

    session.commit(createIntentSender(context, sessionId));
    return true;
}
 
源代码7 项目: xDrip   文件: VersionFixer.java
private static boolean installPackage(Context context, byte[] buffer, String packageName)
        throws IOException {
    final PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
    final PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
            PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    params.setAppPackageName(packageName);

    final int sessionId = packageInstaller.createSession(params);
    final PackageInstaller.Session session = packageInstaller.openSession(sessionId);
    final OutputStream out = session.openWrite("COSU", 0, -1);
    out.write(buffer, 0, buffer.length);

    session.fsync(out);
    out.close();
    session.commit(createIntentSender(context, sessionId));
    return true;
}
 
源代码8 项目: xDrip-plus   文件: VersionFixer.java
private static boolean installPackage(Context context, InputStream in, String packageName)
        throws IOException {
    final PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
    final PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
            PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    params.setAppPackageName(packageName);

    final int sessionId = packageInstaller.createSession(params);
    final PackageInstaller.Session session = packageInstaller.openSession(sessionId);
    final OutputStream out = session.openWrite("COSU", 0, -1);
    final byte[] buffer = new byte[65536];
    int bytes_read;
    while ((bytes_read = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytes_read);
    }
    session.fsync(out);
    in.close();
    out.close();

    session.commit(createIntentSender(context, sessionId));
    return true;
}
 
源代码9 项目: xDrip-plus   文件: VersionFixer.java
private static boolean installPackage(Context context, byte[] buffer, String packageName)
        throws IOException {
    final PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
    final PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
            PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    params.setAppPackageName(packageName);

    final int sessionId = packageInstaller.createSession(params);
    final PackageInstaller.Session session = packageInstaller.openSession(sessionId);
    final OutputStream out = session.openWrite("COSU", 0, -1);
    out.write(buffer, 0, buffer.length);

    session.fsync(out);
    out.close();
    session.commit(createIntentSender(context, sessionId));
    return true;
}
 
源代码10 项目: android-testdpc   文件: PackageInstallationUtils.java
public static boolean installPackage(Context context, InputStream in, String packageName)
        throws IOException {
    final PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
    final PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
            PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    params.setAppPackageName(packageName);
    // set params
    final int sessionId = packageInstaller.createSession(params);
    final PackageInstaller.Session session = packageInstaller.openSession(sessionId);
    final OutputStream out = session.openWrite("TestDPC", 0, -1);
    final byte[] buffer = new byte[65536];
    int c;
    while ((c = in.read(buffer)) != -1) {
        out.write(buffer, 0, c);
    }
    session.fsync(out);
    in.close();
    out.close();

    session.commit(createInstallIntentSender(context, sessionId));
    return true;
}
 
private int doCommitSession(int sessionId, boolean logSuccess) throws RemoteException {
    final PrintWriter pw = getOutPrintWriter();
    PackageInstaller.Session session = null;
    try {
        session = new PackageInstaller.Session(
                mInterface.getPackageInstaller().openSession(sessionId));

        // Sanity check that all .dm files match an apk.
        // (The installer does not support standalone .dm files and will not process them.)
        try {
            DexMetadataHelper.validateDexPaths(session.getNames());
        } catch (IllegalStateException | IOException e) {
            pw.println("Warning [Could not validate the dex paths: " + e.getMessage() + "]");
        }

        final LocalIntentReceiver receiver = new LocalIntentReceiver();
        session.commit(receiver.getIntentSender());

        final Intent result = receiver.getResult();
        final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
                PackageInstaller.STATUS_FAILURE);
        if (status == PackageInstaller.STATUS_SUCCESS) {
            if (logSuccess) {
                pw.println("Success");
            }
        } else {
            pw.println("Failure ["
                    + result.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + "]");
        }
        return status;
    } finally {
        IoUtils.closeQuietly(session);
    }
}
 
private int doAbandonSession(int sessionId, boolean logSuccess) throws RemoteException {
    final PrintWriter pw = getOutPrintWriter();
    PackageInstaller.Session session = null;
    try {
        session = new PackageInstaller.Session(
                mInterface.getPackageInstaller().openSession(sessionId));
        session.abandon();
        if (logSuccess) {
            pw.println("Success");
        }
        return 0;
    } finally {
        IoUtils.closeQuietly(session);
    }
}
 
源代码13 项目: XAPKInstaller   文件: InstallActivity.java
@TargetApi(21)
private PackageInstaller.Session initSession() throws IOException {
    PackageInstaller.Session session = null;
    PackageInstaller packageInstaller = getPackageManager().getPackageInstaller();
    PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
            PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    int sessionId = 0;
    sessionId = packageInstaller.createSession(params);
    session = packageInstaller.openSession(sessionId);

    return session;
}
 
源代码14 项目: XAPKInstaller   文件: InstallActivity.java
@TargetApi(21)
private void addApkToInstallSession(String filePath, PackageInstaller.Session session)
        throws IOException {
    // It's recommended to pass the file size to openWrite(). Otherwise installation may fail
    // if the disk is almost full.
    try (OutputStream packageInSession = session.openWrite(getFileName(filePath), 0, new File(filePath).length());
         InputStream is = new BufferedInputStream(new FileInputStream(filePath))) {
        byte[] buffer = new byte[16384];
        int n;
        while ((n = is.read(buffer)) >= 0) {
            packageInSession.write(buffer, 0, n);
        }
    }
}
 
源代码15 项目: XAPKInstaller   文件: InstallActivity.java
@TargetApi(21)
private void commitSession(PackageInstaller.Session session) {

    // Create an install status receiver.

    Intent intent = new Intent(this, InstallActivity.class);
    intent.setAction(PACKAGE_INSTALLED_ACTION);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    IntentSender statusReceiver = pendingIntent.getIntentSender();

    // Commit the session (this will start the installation workflow).
    session.commit(statusReceiver);

}
 
源代码16 项目: SAI   文件: RootlessSAIPackageInstaller.java
@SuppressLint("DefaultLocale")
@Override
protected void installApkFiles(ApkSource aApkSource) {
    cleanOldSessions();

    PackageInstaller.Session session = null;
    try (ApkSource apkSource = aApkSource) {
        PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
        sessionParams.setInstallLocation(PreferencesHelper.getInstance(getContext()).getInstallLocation());
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            sessionParams.setInstallReason(PackageManager.INSTALL_REASON_USER);

        int sessionID = mPackageInstaller.createSession(sessionParams);
        mSessionsMap.put(sessionID, getOngoingInstallation().getId());

        session = mPackageInstaller.openSession(sessionID);
        int currentApkFile = 0;
        while (apkSource.nextApk()) {
            try (InputStream inputStream = apkSource.openApkInputStream(); OutputStream outputStream = session.openWrite(String.format("%d.apk", currentApkFile++), 0, apkSource.getApkLength())) {
                IOUtils.copyStream(inputStream, outputStream);
                session.fsync(outputStream);
            }
        }

        Intent callbackIntent = new Intent(getContext(), RootlessSAIPIService.class);
        PendingIntent pendingIntent = PendingIntent.getService(getContext(), 0, callbackIntent, 0);
        session.commit(pendingIntent.getIntentSender());
    } catch (Exception e) {
        Log.w(TAG, e);
        dispatchCurrentSessionUpdate(InstallationStatus.INSTALLATION_FAILED, getContext().getString(R.string.installer_error_rootless, Utils.throwableToString(e)));
        installationCompleted();
    } finally {
        if (session != null)
            session.close();
    }
}
 
源代码17 项目: Shelter   文件: DummyActivity.java
private void doInstallPackageQ(Uri uri, PackageInstaller.Session session, Runnable callback) {
    new Thread(() -> {
        try (InputStream is = getContentResolver().openInputStream(uri);
             OutputStream os = session.openWrite(UUID.randomUUID().toString(), 0, is.available())
        ) {
            Utility.pipe(is, os);
            session.fsync(os);
        } catch (IOException e) {

        }

        runOnUiThread(callback);
    }).start();
}
 
源代码18 项目: SAI   文件: RootlessSaiPackageInstaller.java
private void install(String sessionId, SaiPiSessionParams params) {
    PackageInstaller.Session session = null;
    String appTempName = null;
    try (ApkSource apkSource = params.apkSource()) {
        appTempName = apkSource.getAppName();
        if (appTempName != null)
            mSessionIdToAppTempName.put(sessionId, appTempName);

        setSessionState(sessionId, new SaiPiSessionState.Builder(sessionId, SaiPiSessionStatus.INSTALLING).appTempName(appTempName).build());

        PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
        sessionParams.setInstallLocation(PreferencesHelper.getInstance(getContext()).getInstallLocation());
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            sessionParams.setInstallReason(PackageManager.INSTALL_REASON_USER);

        int androidSessionId = mPackageInstaller.createSession(sessionParams);
        mAndroidPiSessionIdToSaiPiSessionId.put(androidSessionId, sessionId);

        session = mPackageInstaller.openSession(androidSessionId);
        int currentApkFile = 0;
        while (apkSource.nextApk()) {
            try (InputStream inputStream = apkSource.openApkInputStream(); OutputStream outputStream = session.openWrite(String.format("%d.apk", currentApkFile++), 0, apkSource.getApkLength())) {
                IOUtils.copyStream(inputStream, outputStream);
                session.fsync(outputStream);
            }
        }

        Intent callbackIntent = new Intent(RootlessSaiPiBroadcastReceiver.ACTION_DELIVER_PI_EVENT);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), 0, callbackIntent, 0);
        session.commit(pendingIntent.getIntentSender());
    } catch (Exception e) {
        Log.w(TAG, e);
        if (session != null)
            session.abandon();

        setSessionState(sessionId, new SaiPiSessionState.Builder(sessionId, SaiPiSessionStatus.INSTALLATION_FAILED).appTempName(appTempName).error(e.getLocalizedMessage(), Utils.throwableToString(e)).build());
    } finally {
        if (session != null)
            session.close();
    }
}