我在 Android 上实现了应用内更新。
Todya 我发布了我的应用程序的新版本,我在 Play Console 中遇到了很多错误(今天由于这个原因导致了 +3K 错误!)。
错误是:
java.lang.IllegalArgumentException:在 androidx.fragment.app.FragmentActivity.checkForValidRequestCode (FragmentActivity.java:715) 在 androidx.fragment.app.FragmentActivity.startIntentSenderForResult (FragmentActivity.java:702) 在 com.google.android.play.core .appupdate.d.startIntentSenderForResult(未知来源:9)在 com.google.android.play.core.appupdate.b.startUpdateFlowForResult(未知来源:35)在 com.google.android.play.core.appupdate.b.startUpdateFlowForResult (未知来源:5)在 org.deiverbum.app.activities.MainActivity.lambda$checkAppUpdate$1$MainActivity (MainActivity.java:258) 在 org.deiverbum.app.activities.-$$Lambda$MainActivity$yZ2n4QRhF7BFdFURB2K2ok-2vu8。 onSuccess (Unknown Source:4) at com.google.android.play.core.tasks.e.run (Unknown Source:27) at android.os.Handler。handleCallback (Handler.java:809) at android.os.Handler.dispatchMessage (Handler.java:102) at android.os.Looper.loop (Looper.java:166) at android.app.ActivityThread.main (ActivityThread.java :7555) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:469) 在 com.android.internal.os.ZygoteInit.main 的 java.lang.reflect.Method.invoke (Native Method) (ZygoteInit.java:963)
崩溃发生在第 258 行:appUpdateManager.startUpdateFlowForResult(
这是我的更新代码MainActivity
:
private void checkAppUpdate() {
appUpdateManager = AppUpdateManagerFactory.create(this);
appUpdateManager.registerListener(installStateUpdatedListener);
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
try {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.FLEXIBLE,
this,
UPDATE_REQUEST_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
});
}
此方法从以下位置调用onCreate()
:
protected void onCreate(Bundle savedInstanceState) {
//...
checkAppUpdate();
}
我有这些字段MainActivty
:
private static final int UPDATE_REQUEST_CODE = 20200100;
private AppUpdateManager appUpdateManager;
private InstallStateUpdatedListener installStateUpdatedListener = installState -> {
if (installState.installStatus() == InstallStatus.DOWNLOADED) {
popupAlerter();
}
};
我也有与应用内更新相关的代码MainActivity
:
@Override
protected void onDestroy() {
unregisterListener();
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
checkNewAppVersionState();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == UPDATE_REQUEST_CODE) {
if (resultCode != RESULT_OK) {
Log.d(TAG, "Update flow failed! Result code: " + resultCode);
}
}
}
/*
You should execute this check at all app entry points.
*/
private void checkNewAppVersionState() {
appUpdateManager
.getAppUpdateInfo()
.addOnSuccessListener(new OnSuccessListener<AppUpdateInfo>() {
@Override
public void onSuccess(AppUpdateInfo appUpdateInfo) {
if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
popupAlerter();
Log.d(TAG, "checkNewAppVersionState(): resuming flexible update. Code: " + appUpdateInfo.updateAvailability());
}
}
});
}
private void popupAlerter() {
Snackbar snackbar =
Snackbar.make(
findViewById(android.R.id.content),
"Nueva versión descargada, por favor reinicia",
Snackbar.LENGTH_INDEFINITE);
snackbar.setAction("REINICIAR", view -> appUpdateManager.completeUpdate());
snackbar.setActionTextColor(
getResources().getColor(R.color.colorAccent));
snackbar.show();
}
private void unregisterListener() {
if (appUpdateManager != null && installStateUpdatedListener != null)
appUpdateManager.unregisterListener(installStateUpdatedListener);
}
我编写这段代码是阅读 Android 上的解释和另一个教程,但我不知道是什么导致了这些错误。