目标API 28对IPackageInstallObserver和IPackageDeleteObserver的限制

时间:2019-05-14 11:59:13

标签: android

我正在使用以下类通过我的代码安装其他应用程序:

android.content.pm.IPackageDeleteObserver
android.content.pm.IPackageInstallObserver

考虑到Google链接link1link2link3,我的应用程序正在根据目标API 27进行编译

我相信,如果某个应用程序使用的是目标API级别的灰色列表中的私有API,那么它们将对该应用程序列入黑名单。

现在,我正在使用的API已添加到API 28的灰色列表中,但是只要我具有目标API级别27,我就可以使用它们。

问题是,如果我移到目标API 28,这些API将被列入我的应用黑名单。

我的问题是,是否还有其他人面临同样的问题,以及是否有解决方案?

我也已经在Google问题跟踪器中举了票,但是很久以来,注意事项也一直在更新。

2 个答案:

答案 0 :(得分:0)

我在API 28中使用android.content.pm也遇到了同样的问题。我能够使用以下功能来安装软件包:

val ACTION_INSTALL_COMPLETE = "com.example.myinstallexample.INSTALL_COMPLETE"


fun installPackage(file: File) {

            val pi = Application.instance.applicationContext.getPackageManager().getPackageInstaller()
            val sessionId =
                pi.createSession(PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL))
            val session = pi.openSession(sessionId)
            var sizeBytes: Long = 0

            if (file.isFile()) {
                sizeBytes = file.length();
            }

            var input: InputStream? = null
            var out: OutputStream? = null

            input = FileInputStream(file.path)

            out = session.openWrite("app_store_session", 0, sizeBytes);

            var total = 0

            val buffer = ByteArray(65536)

            var len: Int

            while(input.read(buffer).also { len = it } != -1) {
                total += len;
                out.write(buffer, 0, len);
            }

            session.fsync(out);

            input.close()

            out.close();

            val broadCastTest = PendingIntent.getBroadcast(
                Application.instance.applicationContext,
                sessionId,
                Intent(ACTION_INSTALL_COMPLETE),
                PendingIntent.FLAG_UPDATE_CURRENT
            )

            session.commit(broadCastTest.getIntentSender());

            session.close();

}

答案 1 :(得分:0)

Maximiliano Gonzalez的答案在转换为Java代码并以uuid系统作为系统应用程序(作为固件的一部分)构建时实际上可以工作。这是代码:

    private void installPackage(File file) throws IOException {
    PackageInstaller pi = getApplicationContext().getPackageManager().getPackageInstaller();
    PackageInstaller.SessionParams sp = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    int sessionId = pi.createSession(sp);
    PackageInstaller.Session session = pi.openSession(sessionId);

    long sizeBytes = 0;
    if (file.isFile()) {
        sizeBytes = file.length();
    }

    InputStream input;
    OutputStream out;

    input = new FileInputStream(file.getPath());
    out = session.openWrite("app_store_session", 0, sizeBytes);

    long total = 0;
    byte[] buffer = new byte[65536];

    int len;

    do {
        len = input.read(buffer);
        if (len != -1) {
            total += len;
            out.write(buffer, 0, len);
        }

    } while (len != -1);

    session.fsync(out);
    input.close();
    out.close();

    PendingIntent broadCastTest = PendingIntent.getBroadcast(getApplicationContext(),
                                    sessionId, new Intent(ACTION_INSTALL_COMPLETE),
                                    PendingIntent.FLAG_UPDATE_CURRENT);
    session.commit(broadCastTest.getIntentSender());
    session.close();
}