【Android】安卓主流应用市场打开方式汇总

解决思路
  • 根据厂商名,获取指定应用市场包名,和网页版地址
  • 如果本地已安装应用市场软件,则跳转至应用市场下载
  • 如果本地未安装应用市场软件,则跳转至网页版应用市场下载
  • 如果未提供网页版应用市场平台,则跳转至该应用市场的下载地址
  • 以上条件均不满足,提示无法找到对应的应用市场
实现代码
object MarketUtils {

    const val MARKET_CHANNEL_NONE = ""
    const val MARKET_CHANNEL_HUAWEI = "HUAWEI"
    const val MARKET_CHANNEL_HONOR = "HONOR"
    const val MARKET_CHANNEL_XIAOMI = "XIAOMI"
    const val MARKET_CHANNEL_VIVO = "VIVO"
    const val MARKET_CHANNEL_OPPO = "OPPO"
    const val MARKET_CHANNEL_TENCENT = "TENCENT"
    const val MARKET_CHANNEL_ALIBABA = "ALIBABA"
    const val MARKET_CHANNEL_BAIDU = "BAIDU"
    const val MARKET_CHANNEL_GOOGLE = "GOOGLE"
    const val MARKET_CHANNEL_SAMSUNG = "SAMSUNG"
    const val MARKET_CHANNEL_LENOVO = "LENOVO"

    const val MARKET_PACKAGE_HUAWEI = "com.huawei.appmarket"
    const val MARKET_PACKAGE_HONOR = "com.hihonor.appmarket"
    const val MARKET_PACKAGE_XIAOMI = "com.xiaomi.market"
    const val MARKET_PACKAGE_VIVO = "com.bbk.appstore"
    const val MARKET_PACKAGE_OPPO = "com.heytap.market"

    const val MARKET_WEBSITE_HUAWEI = "https://appgallery.huawei.com/app/C5683"
    const val MARKET_WEBSITE_HONOR = ""
    const val MARKET_WEBSITE_XIAOMI = "https://app.mi.com/details?id=com.tencent.mm"
    const val MARKET_WEBSITE_VIVO = "https://h5.appstore.vivo.com.cn/#/details?appId=40413&frompage=searchResultApp"
    const val MARKET_WEBSITE_OPPO = "https://store.oppomobile.com"

    const val PACKAGE_RED_BOOK = "com.xingin.xhs"

    val SUPPORTED_NOTE_CHANNELS = listOf(
        MARKET_CHANNEL_HUAWEI,
        MARKET_CHANNEL_HONOR,
        MARKET_CHANNEL_XIAOMI,
        MARKET_CHANNEL_VIVO,
        MARKET_CHANNEL_OPPO
    )

    fun getMarketChannel() = getChannel(CHANNEL_KEY_MARKET, MARKET_CHANNEL_NONE)

    // download third-party apk
    fun openMarketByPackage(packageName: String) {
        val uri = Uri.parse("market://details?id=$packageName")
        val intent = Intent(Intent.ACTION_VIEW, uri)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        getAppContext().startActivity(intent)
    }

    fun isChannelInstalled(vararg channels: String): Boolean {
        return channels.any {
            val marketPackage = getMarketPackage(it)
            return@any getAppContext().isPackageInstalled(marketPackage)
        }
    }

    fun openMarketByChannel(channel: String) {
        val context = getAppContext()
        val marketPackage = getMarketPackage(channel)
        if (!context.isPackageInstalled(marketPackage)) {
            openWebMarketByChannel(channel)
            return
        }
        openLocalMarketByChannel(channel)
    }

    fun openLocalMarketByChannel(channel: String) {
        val context = getAppContext()
        val packageName = context.packageName
        val marketPackage = getMarketPackage(channel)
        var intent = Intent(Intent.ACTION_VIEW)
        when (channel) {
            MARKET_CHANNEL_HUAWEI -> {
                intent.data = Uri.parse("appmarket://details?id=$packageName")
                intent.setPackage(MARKET_PACKAGE_HUAWEI)
            }
            MARKET_CHANNEL_HONOR -> {
                intent.data = Uri.parse("honormarket://details?id=$packageName")
                intent.setPackage(MARKET_PACKAGE_HONOR)
            }
            MARKET_CHANNEL_XIAOMI -> {
                intent.data = Uri.parse("mimarket://details?id=$packageName")
                intent.setPackage(MARKET_PACKAGE_XIAOMI)
            }
            MARKET_CHANNEL_VIVO -> {
                intent.data = Uri.parse("vivomarket://details?id=$packageName")
                intent.setPackage(MARKET_PACKAGE_VIVO)
            }
            MARKET_CHANNEL_OPPO -> {
                intent.data = Uri.parse("oppomarket://details?packagename=$packageName")
                intent.setPackage(MARKET_PACKAGE_OPPO)
            }
            else -> {
                intent.data = Uri.parse("market://details?id=$packageName")
                intent.setPackage(marketPackage)
            }
        }
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        context.startActivity(intent)
    }

    fun openWebMarketByChannel(channel: String) {
        val context = getAppContext()
        val website = getMarketWebsite(channel)
        val uri = Uri.parse(website)
        val intent = Intent(Intent.ACTION_VIEW, uri)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        context.startActivity(intent)
    }

    fun getMarketPackage(channel: String): String {
        return when (channel) {
            MARKET_CHANNEL_HUAWEI -> MARKET_PACKAGE_HUAWEI
            MARKET_CHANNEL_HONOR -> MARKET_PACKAGE_HONOR
            MARKET_CHANNEL_XIAOMI -> MARKET_PACKAGE_XIAOMI
            MARKET_CHANNEL_VIVO -> MARKET_PACKAGE_VIVO
            MARKET_CHANNEL_OPPO -> MARKET_PACKAGE_OPPO
            else -> ""
        }
    }

    fun getMarketWebsite(channel: String): String {
        return when (channel) {
            MARKET_CHANNEL_HUAWEI -> MARKET_WEBSITE_HUAWEI
            MARKET_CHANNEL_HONOR -> MARKET_WEBSITE_HONOR
            MARKET_CHANNEL_XIAOMI -> MARKET_WEBSITE_XIAOMI
            MARKET_CHANNEL_VIVO -> MARKET_WEBSITE_VIVO
            MARKET_CHANNEL_OPPO -> MARKET_WEBSITE_OPPO
            else -> ""
        }
    }

	fun Context.isPackageInstalled(packageName: String): Boolean {
	    try {
	        packageManager.getApplicationInfo(packageName, 0)
	        return true
	    } catch (e: Throwable) {
	        return false
	    }
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值