安卓跳转各厂商的应用市场

谷歌安卓提供的统一方法

大家网上搜到的各厂商统一跳转应用市场详情页的方法是:
Uri uri = Uri.parse(“market://details?id=” + context.getPackageName());
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setPackage(“应用商店的包名”);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
基本统一的方式是这样的,但是各厂商都提供了一定的魔改。然后在现在安卓13,基本上使用统一方法,只能提供跳转,但是不一定能跳转到最新的界面。而且还不写清楚,从文档海里找可费劲了。

适配厂商问题统计

所有的适配结果以当前时间为准,可能后续厂商会自己更新界面
总的各厂商都有的问题,新增安卓30,谷歌对获取当前手机安装的应用,有了限制,见这里的讲解。谷歌30号新增权限限制
我目前只在hw的新旗舰上遇到了,是安卓31版本。
然后,这个尝试无效:

   <intent>
   		<action android:name="android.intent.action.VIEW" />
        <data android:scheme="market://details?id=包名"/>
    </intent>
还有这个也无效:
  <!--  <package android:name="com.xiaomi.market" />
        <package android:name="com.huawei.appmarket" />
        <package android:name="com.heytap.market" />
        <package android:name="com.oppo.market" />
        <package android:name="com.bbk.appstore" />
        <package android:name="com.sec.android.app.samsungapps" />
        <package android:name="com.tencent.android.qqdownloader" />-->
为啥呢?既然都谷歌都放出来了,为啥不生效呢?

而申请这个权限会被应用市场审核导致无法通过。另外主动申请这个权限会需要app重启,才能生效。

最终解决办法是: 通过设备厂商来直接给与设备上安装的应用包名。
 String device = Build.BRAND;
            String apkStore1 = null;
            switch (device) {
                case "Redmi":
                case "Xiaomi":
                    apkStore1 = apkStore.get(0);
                    break;
                case "HUAWEI":
                case "HONOR":
                    apkStore1 = apkStore.get(1);
                    break;
                case "OPPO":
                case "OnePlus":
                    apkStore1 = apkStore.get(2);
                    break;
                case "vivo":
                    apkStore1 = apkStore.get(4);
                    break;
                case "samsung":
                    apkStore1 = apkStore.get(5);
                    break;
                default:
                    apkStore1 = apkStore.get(6);
                    break;

适配华为

问题点:统一方法与新方法跳转的页面不同。新方法页面是应用商店搜索应用进入的详情页。
https://blog.csdn.net/weixin_44708240/article/details/114976204
hw的文档海里搜不到这些,还得在csdn的hw开发者论坛里才查到。

storePkg.get(0) 是应用商店的包名
 if (storePkg.get(0).equals("com.huawei.appmarket")) { //适配hw,通用链接也能进,就是画面不美观
            Intent intent = new Intent("com.huawei.appmarket.intent.action.AppDetail");
            intent.setPackage(storePkg.get(0));
            intent.putExtra("APP_PACKAGENAME", context.getPackageName());
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
            return;
        }

oppo厂商

问题点,统一方法在新老应用商店上跳转的页面不同,然而这两个页面与搜索页面进入的详情页都不同,也就是说至少三个页面,给大哥跪了
https://open.oppomobile.com/new/developmentDoc/info?id=11038
这是厂商文档链接,我只取一部分,详情看这里
代码如下,文档建议使用startActivityForResult,不过我不关注执行结果,直接跳。另外,startActivityForResult 即将被废弃,需要oppo改一下。
oppo老应用商店,使用的页面风格与其他厂商一样,新版应用商店跳转的则把评论隐藏起来,有点推荐大家使用这个快捷评论功能的意思,所以我也选择了这个方法来做。如下,可以直接调起评论功能。
但是下面这个方法,说是

Android 从 R(11) 开始对获取应用包信息做了限制
ps:上线前这个限制没感觉生效。上线以后,这个限制就发生了,赶的很寸,泪目。所以需要按文档添加配置

安卓13版本
另外比较坑的是,版本号大于84000,连安卓8.1的老手机都影响到了,oppo对软件的适配做的这么深干啥?

这是oppo应用评论的办法。
 Uri uri = Uri.parse("oaps://mk/developer/comment?pkg=" + context.getPackageName());
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.setPackage(storePkg.get(0));
            intent.setData(uri);
            context.startActivity(intent);
需要判断应用版本:文档显示,需要软件版本号大于84000。
 private long getOppoAppStoreVersionCode(CCActivity mActivity, String packageName){
        long versionCode = -1;
        try { // 进行保护,文档显示在安卓11上需要申请某权限,但是安卓13机型,在没有权限情况下,正常执行了。
            PackageInfo info = mActivity.getPackageManager().getPackageInfo(packageName, PackageManager.GET_META_DATA);
            if (info != null) {
                versionCode = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P ? info.getLongVersionCode() : info.versionCode;
            }
        } catch (PackageManager.NameNotFoundException e) {
           e.printStackTrace();
        }
        return versionCode;
    }

这个拉起较慢,若连续点击两次,可能会重复拉起。需要加快速点击,我的间隔是2s

小米

小米虽然跳转页面与搜索后进入的页面不是同一个,但是ui风格很像,不需要调整,但是有个问题,弱网环境下跳转一个报错页面。大概是h5内容没下载下来。不知道有没有办法解决。

提供一份判断当前手机安装了哪些应用市场的方法

public void showAppStoreOption() {
        // 需要判断 有几个应用市场,应用商店的名字基本不变
        final List<String> apkStore = new ArrayList<String>() {
            {
                add("com.xiaomi.market");//小米应用商店
                add("com.huawei.appmarket");//华为应用商店
                add("com.heytap.market");//OPPO商店名有两个,Q之后的软件商店包名
                add("com.oppo.market");//OPPO应用商店,旧名字
                add("com.bbk.appstore");//vivo应用商店
                add("com.sec.android.app.samsungapps");//三星应用商店
                add("com.tencent.android.qqdownloader");//腾讯应用宝
            }
        };
        List<String> installStore = new ArrayList<>();
        for (int i = 0; i < apkStore.size(); i++) {
            if (isInstalledApp(mActivity, apkStore.get(i))) {
                installStore.add(apkStore.get(i));
            }
        }
        // 点击跳转应用市场
    }
    private boolean isInstalledApp(Context context, String packageName) {
        final PackageManager packageManager = context.getPackageManager();
        // 所有已安装包的包信息
        List<PackageInfo> pInfo = packageManager.getInstalledPackages(0);
        List<String> pName = new ArrayList<>();
        for (PackageInfo info : pInfo) {
            pName.add(info.packageName);
        }
        // 判断装了哪些应用市场
        return pName.contains(packageName);
    }

当有其他厂商的应用商店时,如何获取包名,可以用这个:获得activity的同时能够提供包名

adb shell dumpsys activity|findstr ResumedActivit
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值