跳转应用市场详情页market

news2024/11/15 18:47:20

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。
未经允许不得转载

目录

  • 一、导读
  • 二、概览
  • 三、跳转到各大厂商应用商店应用详情页
    • 3.1 vivo
    • 3.2 oppo
    • 3.3 小米
    • 3.4 华为
    • 3.5 通用的方式
    • 3.6 总结一下
  • 四、 推荐阅读

在这里插入图片描述

一、导读

我们继续总结学习基础知识,温故知新。

本文描述了以下两方面内容:
获取当前手机上安装的应用商店包名跟指定页面。
跳转到各大厂商应用商店应用详情页。

Android 应用中跳转到应用市场评分。

二、概览

在国内基本上每个手机厂商都会有自己的手机应用市场,建立自己的生态,为此,app内可以增加引导用户去应用市场评价,
目标是持续增加应用市场的好评数,支持运营人员可配置跳转到某个应用市场去评论。

三、跳转到各大厂商应用商店应用详情页

3.1 vivo

接入评论调起 vivo 应用商店能力后,可以引导你的用户前往你的 app 在 vivo 应用商店的详情页,进行评论和评分。


    /**
     * th_name=need_comment 这个很关键,是用于切换tab的
     * @param context
     * @param pkgname 待下载资源包名
     */
    public static void gotovivomarket(Context context, String pkgname) {
        String url = "market://details?id=" + pkgname + "&th_name=need_comment";

        Uri uri = Uri.parse(url);

        Intent intent= new Intent(Intent.ACTION_VIEW,uri);

        intent.setPackage("com.bbk.appstore");

        context.startActivity(intent);

    }

网页调起应用详情页方法如下:

location.href = 'market://details?id=pkg&th_name=need_comment';

vivo文档

3.2 oppo

oppo中有两个应用市场包名,如下:
com.oppo.market //Q (10)之前的软件商店包名
com.heytap.market // Q (10)之后的软件商店包名

如果是跳转详情页,请查看后面的方式。

如果是要直接调起评论页面,需要软件商店的版本号(versionCode) >= 84000。

应用评论调起能力接入指南
oppo文档

自更新客户端接入
oppo文档

oppo没有直接跳转评论的方法,但可以调用oppo提供的应用评论的一个能力。

3.3 小米

如何在app内部跳转到应用商店的应用详情页和评论页
为了方便开发者在应用内部让用户点击按钮跳转到应用商店的应用详情页和评论页,我们提供以下方式支持跳转,请提供给开发进行查看:

1、跳转到应用的详情页:

  market://details?id=pkgName

2、跳转到应用的评论页:

  market://comments?id=pkgName

action: android.intent.action.VIEW

category: android.intent.category.BROWSABLE

当然,并不是所有系统版本都支持跳转, 跳转前请务必判断activity是否存在。

小米文档

3.4 华为

华为的跳转方式会比较多一些,总结一下:

  • 跳转到AG应用详情页,应用内拉起跳转到应用详情页,应用用户进行评分评论等操作。

  • market拉起所有本地商店并跳转详情页

  • 链接到web AG的应用详情页

  • 图章链接到AG的应用详情页

我们贴出来华为特有的代码:


    /**
     * 华为特有的方式:
     * appmarket:// + 包名
     *
     * @param context
     * @param pkgname 应用包名,例如华为浏览器:com.huawei.browser
     */
    public void toHWMarketByPkgname(Context context, String pkgname) {
        String text1 = "appmarket://details?id=" + pkgname;
        Uri uri = Uri.parse(text1);
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        context.startActivity(intent);
    }

    /**
     * 华为特有的方式:
     * market:// + 华为商店 + APPID
     *
     * @param context
     * @param appId 应用的APPID:例如华为浏览器:C100170981
     */
    public void toHWMarketByAppId(Context context, String appId) {
        String text1 = "market://com.huawei.appmarket.applink?appId=" + appId;
        Uri uri = Uri.parse(text1);
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        context.startActivity(intent);
    }


    // ====================== 通过intent 应用商店 action 跳转到AG应用详情页 ==========================
    /**
     * 应用内通过Intent跳转到应用详情页,应用用户进行评分评论等操作
     * @param context
     * @param marketPkg 应用市场包名,例如华为:com.huawei.appmarket
     * @param appId 应用的APPID:例如华为浏览器:C100170981
     * @param action 如华为:com.huawei.appmarket.appmarket.intent.action.AppDetail.withid
     * @return
     */
    public static boolean toMarketByActionAndAppId(Context context, String appId, String marketPkg, String action) {

        Intent intent = new Intent(action);
        intent.setPackage(marketPkg);
        intent.putExtra("appId", appId);
        context.startActivity(intent);
        return false;
    }

    /**
     * 应用内通过Intent跳转到应用详情页,应用用户进行评分评论等操作
     * @param context
     * @param pkgname 应用包名,例如华为浏览器:com.huawei.browser
     * @param marketPkg 应用市场包名,例如
     *                  华为:com.huawei.appmarket
     *
     * @param action 如:"com.huawei.appmarket.intent.action.AppDetail"
     * @return
     */
    public static boolean toMarketByActionAndPkgname(Context context, String pkgname, String marketPkg, String action) {

        Intent intent = new Intent(action);
        intent.setPackage(marketPkg);
        intent.putExtra("APP_PACKAGENAME", pkgname);
        context.startActivity(intent);
        return false;
    }

华为文档

华为没有直接跳转评论的方法。

3.5 通用的方式

这里我们列出两种通用方式:

  • 通过系统隐式意图 , market拉起所有本地商店并跳转详情页

    /**
     * 传入包名,拉起设备上所有的应用商店,让用户自行选择打开方式,即引导用户选择使用哪个应用市场拉起。
     * 选择好打开的应用商店后可以直接跳转到应用的详情页。
     * 
     * 使用方法:通过传入scheme 为market:// 的链接,Android支持的标准的market协议,可拉起Android设备上的所有应用商店。
     *
     * market://details?id=pkgName   // 支持所有商店
     *
     * @param context
     * @param pkgname 应用包名,例如华为浏览器:com.huawei.browser
     * @param marketPkg 应用市场包名,例如
     *      *                  华为:com.huawei.appmarket
     *      *                  vivo:com.bbk.appstore
     *      *                  小米:com.xiaomi.market
     *      *                  魅族:com.meizu.mstore
     *      *
     *      *                  oppo:com.oppo.market //Q之前的软件商店包名
     *      *                  oppo:com.heytap.market //Q之后的软件商店包名
     * @return 此方式很多市场都跳转不过去。 需要验证
     */
    public static boolean toMarketNormal(Context context, String pkgname, String marketPkg) {
        Uri uri = Uri.parse("market://details?id=" + pkgname);

        Intent intent = new Intent("android.intent.action.VIEW", uri);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (marketPkg != null) {
            intent.setPackage(marketPkg);
        }
        try {
            context.startActivity(intent);
            return true;
        } catch (Exception unused) {
            return false;
        }
    }
  • 通过应用市场的搜索方法 , market拉起所有本地商店并跳转详情页

    /**
     * 打开配置了search的页面
     * @param context
     * @param pkgname 应用包名,例如华为浏览器:com.huawei.browser
     * @param marketPkg
     * @return
     */
    public static boolean toMarketBySearch(Context context, String pkgname, String marketPkg) {

        try {
            Intent i = new Intent(Intent.ACTION_VIEW);
            i.setData(Uri.parse("market://search?q="+context.getPackageName()));
            context.startActivity(i);
            return true;
        } catch (Exception e) {
            Toast.makeText(context, "手机没有安装Android应用市场", Toast.LENGTH_SHORT).show();
            return false;
        }
    }

上面这两个方法很简单易用,几行代码就可以实现调用应用市场,唯一的缺点就是如果手机安装多个应用市场,
他所呈现的弹窗是系统自带风格,有时候我们需要自己定制自己的统一弹窗风格,这时候就需要通过其他方案来实现

  • 获取当前手机上安装的应用商店包名跟指定页面
    主要的思路就是找出当前已经安装的android商店。弹出面板让由用户自己去选择。
    首先需要获取当前已经安装的包名集合,
    然后获取手机上已安装的app,过滤剩下应用市场的相关信息定义为appinfo类,appInfo里有这些属性:包名、应用名、icon、版本号。
    这些属性在后面做一个弹窗之类的功能时候用到,系统自带的弹出选择面板会出现的我们都要显示出来。

    /**
     * 获取当前手机上安装的应用商店包名跟指定页面
     * 后面在跳转时根据 marketPkg 进行调整
     * @param context
     * @return
     */
    public static HashMap<String, String> getInstalledMarketPackageName(Context context) {
        HashMap<String, String> hashMap = new HashMap<>();
        Intent intent = new Intent();
        intent.setAction("android.intent.action.VIEW");
        intent.addCategory("android.intent.category.DEFAULT");
        intent.setData(Uri.parse("market://details?id="));

        List<ResolveInfo> queryIntentActivities = context.getPackageManager().queryIntentActivities(intent, 0);
        if (queryIntentActivities != null && queryIntentActivities.size() != 0) {
            int size = queryIntentActivities.size();
            for (int i = 0; i < size; i++) {
                CharSequence charSequence = "";
                String pkgName = "";
                String cls = "";
                try {
                    ActivityInfo activityInfo = queryIntentActivities.get(i).activityInfo;
                    pkgName = activityInfo.packageName;
                    try {
                        charSequence = activityInfo.loadLabel(context.getPackageManager());
                        cls = activityInfo.name;
                        try {
                            context.getResources().getString(context.getPackageManager().getPackageInfo(pkgName, 0).applicationInfo.labelRes);
                        } catch (Exception unused) {
                        }
                    } catch (Exception unused2) {
                        charSequence = "";
                    }
                } catch (Exception unused3) {
                    charSequence = "";
                }
                if (!TextUtils.isEmpty(pkgName)) {
                    hashMap.put(charSequence.toString(), pkgName);

                    Log.d("20230913", charSequence.toString() +", pkgname = " + pkgName +", cls = " + cls);
                }
            }
        }
        return hashMap;
    }

3.6 总结一下

将各大应用市场的跳转方式进行聚合在一块,我们直接上代码:
实际使用过程中大家需要调试一下,跳转详情页跟评论页面是有些许区别的。


    /**
     *
     * @param context
     * @param pkgName
     */
    public static void openAppMarket(Context context, String pkgName) {
        String uriString = "";
        String marketPkg = "";
        try {
            String lowerCase = Build.BRAND.toLowerCase(Locale.ROOT);
            if (lowerCase.equals("xiaomi") || lowerCase.equals("redmi")) {
                uriString = "mimarket://details?id=";
                marketPkg = "com.xiaomi.market";
            }

            if (lowerCase.equals("huawei") || lowerCase.equals("honor")) {
                uriString = "appmarket://details?id=";
                marketPkg = "com.huawei.appmarket";

            }

            if (lowerCase.equals("vivo")) {
                uriString = "vivoMarket://details?id=";
                marketPkg = "com.bbk.appstore";

            }
//            if (lowerCase.equals("flyme")) {
//                str2 = "mstore://details?packagename=";
//                marketPkg = "";
//
//            }
//            if (lowerCase.equals("samsung")) {
//                str2 = "samsungapps://ProductDetail/";
//                marketPkg = "";
//
//            }
            if (lowerCase.equals("oppo") || lowerCase.equals("oneplus") || lowerCase.equals("realme")) {
                uriString = "oppomarket://details?packagename=";
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    marketPkg = "com.heytap.market";
                } else {
                    marketPkg = "com.oppo.market";
                }
            }

            if(TextUtils.isEmpty(uriString)) {
                uriString = "market://details?id=";
            }


            Intent intent = new Intent("android.intent.action.VIEW", Uri.parse(uriString + pkgName));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            if (marketPkg != null) {
                intent.setPackage(marketPkg);
            }
            try {
                context.startActivity(intent);
//                return true;
            } catch (Exception unused) {
//                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("LuckyDogUtils", "手机无应用商店");
        }
    }
    
    public static boolean toHuaWeiMarketDetails(Context context, String pkgname) {
        try {
            Intent intent = new Intent("com.huawei.appmarket.intent.action.AppDetail");
            intent.setPackage("com.huawei.appmarket");
            intent.putExtra("APP_PACKAGENAME", pkgname);
            context.startActivity(intent);
            return true;
        } catch (Exception e) {
        }
        return false;
    }

    public static boolean toXiaomiMarketDetails(Context context, String pkgname) {
        try {
            Intent intent = new Intent("android.intent.action.VIEW", Uri.parse("mimarket://comments?id=" + pkgname));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addCategory("android.intent.category.BROWSABLE");

            intent.setPackage("com.xiaomi.market");
            context.startActivity(intent);
            return true;
        } catch (Exception e) {
        }
        return false;
    }

四、 推荐阅读

Java 专栏

SQL 专栏

数据结构与算法

Android学习专栏

未经允许不得转载

ddd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1248429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【教3妹学编程-算法题】统计和小于目标的下标对数目

2哥 : 3妹&#xff0c;OpenAI的宫斗剧迎来了大结局&#xff01;OpenAI宣布阿尔特曼复职CEO&#xff0c;董事会重组 3妹&#xff1a;啊&#xff1f;到底谁才是幕后操纵者啊&#xff0c;有咩有揪出来 2哥 : 也不是很清楚&#xff0c;据说在被开除的几周前&#xff0c;前CEO曾谴责…

知虾数据分析软件:解密Shopee大数据,助力科学运营

在电商领域&#xff0c;市场竞争激烈&#xff0c;如何准确洞察市场动态、优化选品策略、了解竞争对手的运营情况成为了每个卖家迫切需要解决的问题。而知虾数据分析软件作为Shopee大数据采集及分析平台&#xff0c;以其强大的功能和精准的数据分析能力&#xff0c;为卖家们提供…

流程图是什么,用什么软件做?

在工作流程中&#xff0c;经常会遇到需要图形化呈现整个流程的情况。流程图就是一种一目了然的图形化表现方式&#xff0c;便于人们理解、沟通和管理整个流程。 1.Visio Visio是一款微软公司的图表软件&#xff0c;可以用于创建各种类型的流程图、组织结构图、网络图、平面图…

acwing算法基础之数学知识--求卡特兰数

目录 1 基础知识2 模板3 工程化 1 基础知识 题目&#xff1a;给定n个0和n个1&#xff0c;它们将按照某种顺序排成长度为2n的序列&#xff0c;求它们能排成的所有序列中&#xff0c;能够满足任意前缀序列中0的个数都不少于1的个数的序列有多少个&#xff1f; 输出的答案对 1 0 …

Unity中Shader的Standard材质解析(二)

文章目录 前言一、我们对 Standard 的 PBR 的 GI 进行解析1、我们先创建一个PBR的.cginc文件&#xff0c;用于整理用到的函数2、然后在Standard的Shader中引用该cginc文件 二、依次整理函数到该cginc文件中我们来看一下PBR中GI的镜面反射做了些什么 二、最终代码.cginc代码&…

Verilog基础:时序调度中的竞争(一)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 作为一个硬件描述语言&#xff0c;Verilog HDL常常需要使用语句描述并行执行的电路&#xff0c;但其实在仿真器的底层&#xff0c;这些并行执行的语句是有先后顺序…

NeurIPS 2023 | RGIB:对抗双边图噪声的鲁棒图学习

▐ 摘要 链接预测[1,2]是图学习的一种基础任务&#xff0c;用于判断图中的两个节点是否可能相连&#xff0c;被广泛应用于药物发现、知识图谱补全和在线问答等实际场景。尽管图神经网络&#xff08;Graph Neural Network&#xff0c;GNN&#xff09;在该问题的性能上取得了显著…

JMeter 常见易错问题

1、配置错误&#xff1a; 问题&#xff1a;线程组配置错误&#xff0c;例如设置了错误的线程数或循环次数。 解决方法&#xff1a;检查线程组的配置。确保线程数&#xff08;即并发用户数量&#xff09;设置正确&#xff0c;以及循环次数符合预期。如果要模拟不同类型的用户行…

怎样自动把网页截图发到微信群里

现在很多公司都在使用企业微信了&#xff0c;不但方便公司内部交流和客户交流&#xff0c;还能组建各种小组群&#xff0c;业务群。企业微信群提供一个机器人的功能&#xff0c;方便我们把公司业务信息&#xff0c;或来自外部的信息自动发布到群里。 这里研究一下如何向微信群…

Docker的项目资源参考

Docker的项目资源包括以下内容&#xff1a; Docker官方网站&#xff1a;https://www.docker.com/ Docker Hub&#xff1a;https://hub.docker.com/ Docker文档&#xff1a;https://docs.docker.com/ Docker GitHub仓库&#xff1a;https://github.com/docker Docker官方博客…

MT6893_天玑 1200芯片规格参数介绍_datasheet规格书

天玑 1200(MT6893)是一款专为旗舰级全新5G芯片&#xff0c;它融合了先进的AI、相机和多媒体技术&#xff0c;为用户带来令人惊叹的体验。采用先进的6纳米制程设计&#xff0c;内置各种先进技术。该芯片采用旗舰级的八核CPU架构设计&#xff0c;支持16GB强大的四通道内存以及双通…

jQuery_03 dom对象和jQuery对象的互相转换

dom对象和jQuery对象 dom对象 jQuery对象 在一个文件中同时存在两种对象 dom对象: 通过js中的document对象获取的对象 或者创建的对象 jQuery对象: 通过jQuery中的函数获取的对象。 为什么使用dom或jQuery对象呢&#xff1f; 目的是 要使用dom对象的函数或者属性 以及呢 要…

DQN算法

DQN算法 教程链接 DataWhale强化学习课程JoyRL https://johnjim0816.com/joyrl-book/#/ch7/main DQN算法 DQN(Deep Q-Network) 主要创新点在于将Q-learning算法中的Q表记录动作价值函数转为引入深度神经网络来近似动作价值函数 Q ( s , a ) Q(s,a) Q(s,a),从而能够处理连续…

【Java 进阶篇】Jedis:让Java与Redis轻松对话的利器

在现代软件开发中&#xff0c;缓存系统是提高系统性能的常见手段之一&#xff0c;而Redis作为一个高性能的缓存数据库&#xff0c;被广泛应用于各类系统。如果你是Java开发者&#xff0c;那么使用Jedis库可以让你轻松地与Redis进行交互。本文将带你深入了解Jedis的快速入门&…

pat实现基于邻接矩阵表示的深度优先遍历[含非递归写法]

文章目录 1.递归2.非递归 1.递归 void DFS(Graph G, int v) {visited[v] 1;printf("%c ", G.vexs[v]);for (int i 0; i < G.vexnum; i) {if (!visited[i] && G.arcs[v][i]) DFS(G, i);} }2.非递归 #include <stack> #include <iostream> …

【间歇振荡器2片555时基仿真】2022-9-24

缘由multisim出现这个应该怎么解决吖&#xff0c;急需解决-嵌入式-CSDN问答 输出一定要有电阻分压才能前后连接控制否则一定报错。

【Web】PhpBypassTrick相关例题wp

目录 ①[NSSCTF 2022 Spring Recruit]babyphp ②[鹤城杯 2021]Middle magic ③[WUSTCTF 2020]朴实无华 ④[SWPUCTF 2022 新生赛]funny_php 明天中期考&#xff0c;先整理些小知识点冷静一下 ①[NSSCTF 2022 Spring Recruit]babyphp payload: a[]1&b1[]1&b2[]2&…

C#,《小白学程序》第二课:数组,循环与排序

1 什么是数组&#xff1f; 数组 Array 是一组数值&#xff08;数 或 值&#xff09;。 int[] a; int[,] b; int[][] c; Anything[] d; 都是数组。 2 排序 排序就是按大小、名字、拼音或你指定的信息进行比较后排队。 排序是数组最基本的功能需求。 3 文本格式 /// <summa…

【C语言】memset函数

memset是C和C编程语言中的一个函数&#xff0c;用于将指定的内存区域设置为特定的值。这个函数的原型在<string.h>&#xff08;对于C&#xff09;或者<cstring>&#xff08;对于C&#xff09;头文件中定义。 函数原型如下&#xff1a; void *memset(void *str, i…

Halcon Solution Guide I basics(4): Blob Analysis(连通性解析)

文章目录 文章专栏前言文章解析开头步骤分析简单案例进阶方案 进阶代码案例crystal&#xff0c;结晶匹配需求分析 文章专栏 Halcon开发 Halcon学习 练习项目gitee仓库 CSDN Major 博主Halcon文章推荐 前言 今天来看第三章内容&#xff0c;既然是零基础&#xff0c;而且我还有大…