Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检测用户是否已确认在PackageInstaller(Android)中安装_Java_Android_Android Studio_Kotlin - Fatal编程技术网

Java 如何检测用户是否已确认在PackageInstaller(Android)中安装

Java 如何检测用户是否已确认在PackageInstaller(Android)中安装,java,android,android-studio,kotlin,Java,Android,Android Studio,Kotlin,背景:我正在使用PackageInstaller以编程方式安装android应用程序 我在做什么:下面提到了我正在使用的代码。这与google在PackageInstaller示例中提供的代码相同 private void init() { PackageInstaller.Session session = null; try { PackageInstaller packageInstal

背景:我正在使用PackageInstaller以编程方式安装android应用程序

我在做什么:下面提到了我正在使用的代码。这与google在PackageInstaller示例中提供的代码相同

        private void init() {
        PackageInstaller.Session session = null;
                try {
                    PackageInstaller packageInstaller = getPackageManager().getPackageInstaller();
                    PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                            PackageInstaller.SessionParams.MODE_FULL_INSTALL);
                    int sessionId = packageInstaller.createSession(params);
                    session = packageInstaller.openSession(sessionId);
                    addApkToInstallSession("HelloActivity.apk", session);
                    // Create an install status receiver.
                    Context context = InstallApkSessionApi.this;
                    Intent intent = new Intent(context, InstallApkSessionApi.class);
                    intent.setAction(PACKAGE_INSTALLED_ACTION);
                    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
                    IntentSender statusReceiver = pendingIntent.getIntentSender();
                    // Commit the session (this will start the installation workflow).
                    session.commit(statusReceiver);
                } catch (IOException e) {
                    throw new RuntimeException("Couldn't install package", e);
                } catch (RuntimeException e) {
                    if (session != null) {
                        session.abandon();
                    }
                    throw e;
                }
            }
        });
    }

        private void addApkToInstallSession(String assetName, 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("package", 0, -1);
             InputStream is = getAssets().open(assetName)) {
            byte[] buffer = new byte[16384];
            int n;
            while ((n = is.read(buffer)) >= 0) {
                packageInSession.write(buffer, 0, n);
            }
        }
    }
    // Note: this Activity must run in singleTop launchMode for it to be able to receive the intent
    // in onNewIntent().
    @Override
    protected void onNewIntent(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:
                    // This test app isn't privileged, so the user has to confirm the install.
                    Intent confirmIntent = (Intent) extras.get(Intent.EXTRA_INTENT);
                    startActivity(confirmIntent);
                    break;
                case PackageInstaller.STATUS_SUCCESS:
                    Toast.makeText(this, "Install succeeded!", Toast.LENGTH_SHORT).show();
                    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:
                    Toast.makeText(this, "Install failed! " + status + ", " + message,
                            Toast.LENGTH_SHORT).show();
                    break;
                default:
                    Toast.makeText(this, "Unrecognized status received from installer: " + status,
                            Toast.LENGTH_SHORT).show();
            }
        }
    }

查询:代码工作正常,但单击“安装”按钮时,
PackageInstaller
不会给出任何状态,单击“取消”按钮时,它会提供状态。当用户单击安装按钮确认安装时,我必须执行一些操作。单击“安装”按钮时,是否有其他方法获取状态


注意:我不想要安装成功后的状态,但我想要在单击安装按钮时显示该状态。

您可以注册一个广播以执行添加的操作
,甚至可以使用
PackageManager#getPackageInfo

请参阅以下问题:


编辑:在意识到你正试图取回“安装”按钮上的点击事件之后——我认为这是不可能的。您可以更改应用程序的流程,并对安装成功做出响应,也可以等待其他人回答此问题。它们可能是某种“黑客”方式,但我仍然不建议使用它。

您可以注册一个广播,以便操作
packageinfo添加的包
,甚至可以使用
PackageManager\getPackageInfo检查包是否已安装

请参阅以下问题:


编辑:在意识到你正试图取回“安装”按钮上的点击事件之后——我认为这是不可能的。您可以更改应用程序的流程,并对安装成功做出响应,也可以等待其他人回答此问题。它们可能是一些“黑客”的方法,但我还是不推荐使用。

Hi@Qunata…感谢您的快速帮助,但这不是我想要的。我希望在单击安装按钮时(参考附件图像)而不是在安装完成后立即获取状态。如果用户单击“取消”按钮,我将获得状态,但单击“安装”按钮时没有状态。如果您设置了广播接收器,您将完全实现所需的功能。一旦安装了“Any”包,并且您检查它是否是您期望的包,就会触发广播。您无法检测实际的“单击”事件。另外,
PackageInstaller.STATUS\u SUCCESS
是否已向您提供成功事件?是。。。PackageInstaller.STATUS\u SUCCESS肯定会在安装应用程序后为我提供状态,但正如我所说的,我必须检测安装按钮,而不是安装成功/失败。我认为不可能实现您想要的。请参考编辑。嗨@Qunata…谢谢你的快速帮助,但这不是我要找的。我希望在单击安装按钮时(参考附件图像)而不是在安装完成后立即获取状态。如果用户单击“取消”按钮,我将获得状态,但单击“安装”按钮时没有状态。如果您设置了广播接收器,您将完全实现所需的功能。一旦安装了“Any”包,并且您检查它是否是您期望的包,就会触发广播。您无法检测实际的“单击”事件。另外,
PackageInstaller.STATUS\u SUCCESS
是否已向您提供成功事件?是。。。PackageInstaller.STATUS\u SUCCESS肯定会在安装应用程序后为我提供状态,但正如我所说的,我必须检测安装按钮,而不是安装成功/失败。我认为不可能实现您想要的。请参考编辑手册。