Java 如何检测用户是否已确认在PackageInstaller(Android)中安装
背景:我正在使用PackageInstaller以编程方式安装android应用程序 我在做什么:下面提到了我正在使用的代码。这与google在PackageInstaller示例中提供的代码相同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
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肯定会在安装应用程序后为我提供状态,但正如我所说的,我必须检测安装按钮,而不是安装成功/失败。我认为不可能实现您想要的。请参考编辑手册。