建议用户通过Google Play(Google应用内更新支持)更新Android应用程序。

3
我看到当我打开Tokopedia的旧版本应用时,这个对话框总是出现。Tokopedia建议我更新应用程序。

enter image description here

这个对话框给了我两种更新应用的方法:

  • 立即更新
  • 在 Wi-Fi 可用时更新

如果我选择稍后(取消),下次打开应用程序时会再次出现该对话框。但是,如果我选择第二个选项,我会打开 Play Store 并看到以下行为:

enter image description here

直到我的设备连接到Wi-Fi,它才会在后台进行更新。
我想模仿Tokopedia所做的相同操作,因为我的应用程序某些版本包含关键错误。我想给用户提供更好的用户体验。
你知道如何显示上面的对话框吗?

1
最好在应用程序的第一个屏幕中创建一个新的网络服务。它将提供应用程序在Play商店中的最新版本和其他必要详情。您需要将已安装的应用程序版本与Web服务响应中获取的版本进行比较,然后才能显示对话框。 - DAS
@SibinDavis 我有一个Web服务来检测用户是否使用旧版本。现在的问题是,如何显示对话框?当用户点击更新时,对话框会告诉Play商店更新我们的应用程序。我确定该对话框来自Google Play服务API。 - Anggrayudi H
不需要使用Google Play服务API。您可以设计一个类似上面的对话框,当点击更新按钮时,您可以重定向到您应用程序的商店页面。如果他们点击取消按钮,您可以关闭对话框并重定向到下一个屏幕。 - DAS
3个回答

3
这是通过Google提供的应用内更新功能实现的。
应用内更新仅适用于运行Android 5.0(API级别21)或更高版本的设备,并且需要使用Play Core库1.5.0或更高版本。有两种类型- 1.灵活和2.即时。
请访问以下链接并根据您的需求实施应用内更新:https://developer.android.com/guide/app-bundle/in-app-updates

这是实现这个的唯一方法。感谢您的支持。@Anggrayudi H 谢谢。 - Anupam
@AnggrayudiH 它能用吗?那我想使用这个方法。 - DAS
它是相对较新的技术,由谷歌推荐。像PayTm这样的应用正在使用它。 - Anupam
@akshay_shahane 我会的。 - Anggrayudi H
1
我将不使用Android应用程序包进行工作。我已经实施了。抱歉!我之前无法理解你的意思。 - Anupam
显示剩余4条评论

1
您可以使用应用内更新支持来实现此功能。
  • 它仅适用于Android 5.0(API级别21)或更高版本

  • 在应用内更新中,有两种类型的可用更新:

    • 灵活更新
    • 立即更新

检查更新是否可用

// Creates instance of the manager.
AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(context);

// Returns an intent object that you use to check for an update.
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();

// Checks that the platform will allow the specified type of update.
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
          // For a flexible update, use AppUpdateType.FLEXIBLE
          && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
              // Request the update.
    }
});

1

好的,这里是@akshay_shahane请求的完整代码。

首先,在您的应用程序的build.gradle中添加此行:

dependencies {
    implementation 'com.google.android.play:core:1.6.1'
}

在您的活动中:

class MainActivity : AppCompatActivity(), InstallStateUpdatedListener {

    private val appUpdateManager by lazy {
        AppUpdateManagerFactory.create(this).also { it.registerListener(this) }
    }

    override fun onDestroy() {
        if (Build.VERSION.SDK_INT >= 21) {
            appUpdateManager.unregisterListener(this)
        }
        super.onDestroy()
    }

    override fun onResume() {
        super.onResume()
        if (Build.VERSION.SDK_INT >= 21) {
            appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
                // If the update is downloaded but not installed, notify the user to complete the update.
                if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
                    popupSnackbarForCompleteUpdate()
                } else if (it.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS
                        && it.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
                    appUpdateManager.startUpdateFlowForResult(it, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_UPDATE_APP)
                }
            }
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == ActivityResult.RESULT_IN_APP_UPDATE_FAILED && requestCode == REQUEST_CODE_UPDATE_APP) {
            Toast.makeText(this, "Update failed", Toast.LENGTH_SHORT).show()
        }
    }

    override fun onStateUpdate(state: InstallState) {
        when (state.installStatus()) {
            InstallStatus.DOWNLOADED -> popupSnackbarForCompleteUpdate()
            InstallStatus.REQUIRES_UI_INTENT -> {
                Snackbar.make(findViewById(R.id.activity_main_layout),
                        "To perform the installation, a Play Store UI flow needs to be started.",
                        Snackbar.LENGTH_LONG
                ).show()
            }
            else -> {
                val stateString = when (state.installStatus()) {
                    InstallStatus.FAILED -> "failed"
                    InstallStatus.PENDING -> "pending"
                    InstallStatus.DOWNLOADING -> "downloading"
                    InstallStatus.INSTALLING -> "installing"
                    InstallStatus.INSTALLED -> "installed"
                    InstallStatus.CANCELED -> "canceled"
                    else -> null
                }
                if (stateString != null) {
                    Snackbar.make(findViewById(R.id.activity_main_layout),
                            "An update is $stateString.",
                            Snackbar.LENGTH_SHORT
                    ).show()
                }
            }
        }
    }

    private fun popupSnackbarForCompleteUpdate() {
        Snackbar.make(findViewById(R.id.activity_main_layout),
                "An update is ready to install.",
                Snackbar.LENGTH_INDEFINITE
        ).apply {
            setAction("INSTALL") { appUpdateManager.completeUpdate() }
            show()
        }
    }

    @RequiresApi(21)
    fun checkUpdateViaGooglePlay() {
        appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
            when (appUpdateInfo.updateAvailability()) {
                UpdateAvailability.UPDATE_AVAILABLE -> {
                    if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
                        appUpdateManager.startUpdateFlowForResult(
                            appUpdateInfo, AppUpdateType.FLEXIBLE, this, REQUEST_CODE_UPDATE_APP)
                    } else if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
                        appUpdateManager.startUpdateFlowForResult(
                            appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_UPDATE_APP)
                    }
                }
                UpdateAvailability.UPDATE_NOT_AVAILABLE -> {
                    Toast.makeText(this, R.string.no_updates_found, Toast.LENGTH_SHORT).show()
                }
            }
        }.addOnFailureListener {
            Toast.makeText(this, R.string.error_check_update, Toast.LENGTH_SHORT).show()
        }
    }

    companion object {
        const val REQUEST_CODE_UPDATE_APP = 8
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接