[英]is there a support in-app updates android example in java
我發現這篇文章解決了這個問題,以明確我將編寫class代碼並記住有兩種方法可以實現應用內更新:立即和靈活。
1 實施 'com.google.android.play:core:1.10.3'
2.1 如果您將使用靈活的方法,請將 class 名稱替換為您的示例“MainActivity”
public class Flexible extends AppCompatActivity {
private AppUpdateManager appUpdateManager;
private InstallStateUpdatedListener installStateUpdatedListener;
private static final int FLEXIBLE_APP_UPDATE_REQ_CODE = 123;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update_f);
appUpdateManager = AppUpdateManagerFactory.create(getApplicationContext());
installStateUpdatedListener = state -> {
if (state.installStatus() == InstallStatus.DOWNLOADED) {
popupSnackBarForCompleteUpdate();
} else if (state.installStatus() == InstallStatus.INSTALLED) {
removeInstallStateUpdateListener();
} else {
Toast.makeText(getApplicationContext(), "InstallStateUpdatedListener: state: " + state.installStatus(), Toast.LENGTH_LONG).show();
}
};
appUpdateManager.registerListener(installStateUpdatedListener);
checkUpdate();
}
private void checkUpdate() {
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
startUpdateFlow(appUpdateInfo);
} else if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
popupSnackBarForCompleteUpdate();
}
});
}
private void startUpdateFlow(AppUpdateInfo appUpdateInfo) {
try {
appUpdateManager.startUpdateFlowForResult(appUpdateInfo, AppUpdateType.FLEXIBLE, this, Flexible.FLEXIBLE_APP_UPDATE_REQ_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == FLEXIBLE_APP_UPDATE_REQ_CODE) {
if (resultCode == RESULT_CANCELED) {
Toast.makeText(getApplicationContext(), "Update canceled by user! Result Code: " + resultCode, Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(),"Update success! Result Code: " + resultCode, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "Update Failed! Result Code: " + resultCode, Toast.LENGTH_LONG).show();
checkUpdate();
}
}
}
private void popupSnackBarForCompleteUpdate() {
Snackbar.make(findViewById(android.R.id.content).getRootView(), "New app is ready!", Snackbar.LENGTH_INDEFINITE)
.setAction("Install", view -> {
if (appUpdateManager != null) {
appUpdateManager.completeUpdate();
}
})
.setActionTextColor(getResources().getColor(R.color.purple_500))
.show();
}
private void removeInstallStateUpdateListener() {
if (appUpdateManager != null) {
appUpdateManager.unregisterListener(installStateUpdatedListener);
}
}
@Override
protected void onStop() {
super.onStop();
removeInstallStateUpdateListener();
}}
2.1 如果您將使用即時方法,請將 class 名稱替換為您的示例“MainActivity”
public class Immediate extends AppCompatActivity {
private AppUpdateManager appUpdateManager;
private static final int IMMEDIATE_APP_UPDATE_REQ_CODE = 124;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update_f);
appUpdateManager = AppUpdateManagerFactory.create(getApplicationContext());
checkUpdate();
}
private void checkUpdate() {
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
startUpdateFlow(appUpdateInfo);
} else if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS){
startUpdateFlow(appUpdateInfo);
}
});
}
private void startUpdateFlow(AppUpdateInfo appUpdateInfo) {
try {
appUpdateManager.startUpdateFlowForResult(appUpdateInfo, AppUpdateType.IMMEDIATE, this, Immediate.IMMEDIATE_APP_UPDATE_REQ_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == IMMEDIATE_APP_UPDATE_REQ_CODE) {
if (resultCode == RESULT_CANCELED) {
Toast.makeText(getApplicationContext(), "Update canceled by user! Result Code: " + resultCode, Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(), "Update success! Result Code: " + resultCode, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "Update Failed! Result Code: " + resultCode, Toast.LENGTH_LONG).show();
checkUpdate();
}
}
}}
3 如何測試? 請按照所有步驟
3.1 生成簽名的應用包/APK。 請注意,APK 簽名密鑰和 applicationId 應與已發布的應用程序相同。
3.2 與測試人員共享生成的 APK。 為此,select 在 Google 控制台中發布的應用程序,導航到Internal App Sharing ,然后將生成的 APK 上傳到那里。 查看如何使用Google Internal App Sharing 。
3.3 復制上傳的共享鏈接並與測試人員共享。 在這種情況下,測試人員應該有一個 Android 手機。
3.4 在手機瀏覽器上打開共享鏈接。 您將被重定向到 Play 商店。
3.5 下載應用程序並等待安裝完成。
3.6 完成后,生成另一個簽名的 app bundle/APK。 這次將 app.gradle 文件中的 versionCode 和 versionName 更改為更高版本
3.7 生成 app bundle/APK 后,前往 App Internal Sharing 並上傳。
3.8 再次,復制此上傳生成的可共享鏈接,並用測試人員打開。 當鏈接在 Google Play 商店啟動時,您會看到一個更新按鈕,不要點擊更新。
3.9 關閉 Google Play 商店並打開我們之前安裝的應用程序。 這將啟動一個更新 UI,提示您更新應用程序。 UI 可能會根據您的更新類型(靈活或即時)而有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.