Android适配 - 跳转应用商店查看应用详情
Android 跳轉(zhuǎn)手機(jī)已安裝的應(yīng)用市場(chǎng),APP大多數(shù)都會(huì)引導(dǎo)用戶去應(yīng)用市場(chǎng)進(jìn)行評(píng)分或者評(píng)論,正常的跳轉(zhuǎn)協(xié)議已經(jīng)可以滿足大部分手機(jī)應(yīng)用市場(chǎng),但是在三星、索尼、紅米上也會(huì)出現(xiàn)一些不一樣的效果,本文記錄如何適配跳轉(zhuǎn)。
正常跳轉(zhuǎn)
/*** 跳轉(zhuǎn)應(yīng)用商店.** @param context {@link Context}* @param appPkg 包名* @param marketPkg 應(yīng)用商店包名* @return {@code true} 跳轉(zhuǎn)成功 <br> {@code false} 跳轉(zhuǎn)失敗*/public static boolean toMarket(Context context, String appPkg, String marketPkg) {Uri uri = Uri.parse("market://details?id=" + appPkg);Intent intent = new Intent(Intent.ACTION_VIEW, uri);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (marketPkg != null) {// 如果沒給市場(chǎng)的包名,則系統(tǒng)會(huì)彈出市場(chǎng)的列表讓你進(jìn)行選擇。intent.setPackage(marketPkg);}try {context.startActivity(intent);return true;} catch (Exception ex) {ex.printStackTrace();return false;}}正常跳轉(zhuǎn)如果手機(jī)安裝了多個(gè)應(yīng)用市場(chǎng),例如:應(yīng)用寶、360手機(jī)助手,則會(huì)彈出系統(tǒng)選擇框給用戶進(jìn)行選擇,用戶也可以勾選是否默認(rèn)選擇(某些機(jī)型是:始終/僅此一次)
三星手機(jī)表現(xiàn)異常
上述正常方法未能打開三星的官方應(yīng)用商店,也就是如果要跳轉(zhuǎn)三星應(yīng)用商店則需要單獨(dú)適配。正確打開方式如下:
/*** 跳轉(zhuǎn)三星應(yīng)用商店* @param context {@link Context}* @param packageName 包名* @return {@code true} 跳轉(zhuǎn)成功 <br> {@code false} 跳轉(zhuǎn)失敗*/public static boolean goToSamsungMarket(Context context, String packageName) {Uri uri = Uri.parse("http://www.samsungapps.com/appquery/appDetail.as?appId=" + packageName); // Uri uri = Uri.parse("http://apps.samsung.com/appquery/appDetail.as?appId=" + packageName);Intent intent = new Intent(Intent.ACTION_VIEW, uri);intent.setPackage("com.sec.android.app.samsungapps");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);try {context.startActivity(intent);return true;} catch (ActivityNotFoundException e) {e.printStackTrace();return false;}}索尼手機(jī)表現(xiàn)異常
上述正常方法未能打開索尼的官方應(yīng)用商店-索尼精選,也有人指出索尼并無單獨(dú)的應(yīng)用商店,采用的是Google的Google Play,國(guó)內(nèi)才推出索尼精選。正確的打開方式如下:
/*** 跳轉(zhuǎn)索尼精選* @param context {@link Context}* @param appId 索尼精選中分配得appId* @return {@code true} 跳轉(zhuǎn)成功 <br> {@code false} 跳轉(zhuǎn)失敗*/public static boolean goToSonyMarket(Context context, String appId) {Uri uri = Uri.parse("http://m.sonyselect.cn/" + appId);Intent intent = new Intent(Intent.ACTION_VIEW, uri); // Intent intent = new Intent(); // intent.setAction("com.sonymobile.playnowchina.android.action.NOTIFICATION_APP_DETAIL_PAGE"); // intent.setAction("com.sonymobile.playnowchina.android.action.APP_DETAIL_PAGE"); // intent.putExtra("app_id", 9115);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);try {context.startActivity(intent);return true;} catch (Exception ex) {ex.printStackTrace();return false;}}跳轉(zhuǎn)索尼精選,附帶APPID,但是這個(gè)值是索尼精選分配的,也就是上傳了索尼精選后的id,例如微信的id是9115。
紅米note2表現(xiàn)異常(未測(cè)試)
上述正常方式跳轉(zhuǎn)應(yīng)用市場(chǎng),無論手機(jī)是否安裝其他應(yīng)用市場(chǎng),均跳轉(zhuǎn)至小米商店。(本人測(cè)試手機(jī)紅米4X,屬于正常跳轉(zhuǎn))
合適的跳轉(zhuǎn)方式
由于上述情況多變,但是大多數(shù)情況下,正常寫法已經(jīng)滿足要求。如果想僅僅跳轉(zhuǎn)應(yīng)用寶或者小米商店,而不進(jìn)行系統(tǒng)彈窗選擇,可以直接指定包名,這樣就可以直接跳轉(zhuǎn)。
/*** 直接跳轉(zhuǎn)至應(yīng)用寶** @param context {@link Context}* @param appPkg 包名* @return {@code true} 跳轉(zhuǎn)成功 <br> {@code false} 跳轉(zhuǎn)失敗*/public static boolean toQQDownload(Context context, String appPkg) {return toMarket(context, appPkg, "com.tencent.android.qqdownloader");}/*** 直接跳轉(zhuǎn)至360手機(jī)助手** @param context {@link Context}* @param appPkg 包名* @return {@code true} 跳轉(zhuǎn)成功 <br> {@code false} 跳轉(zhuǎn)失敗*/public static boolean to360Download(Context context, String appPkg) {return toMarket(context, appPkg, "com.qihoo.appstore");}/*** 直接跳轉(zhuǎn)至豌豆莢** @param context {@link Context}* @param appPkg 包名* @return {@code true} 跳轉(zhuǎn)成功 <br> {@code false} 跳轉(zhuǎn)失敗*/public static boolean toWandoujia(Context context, String appPkg) {return toMarket(context, appPkg, "com.wandoujia.phoenix2");}/*** 直接跳轉(zhuǎn)至小米應(yīng)用商店** @param context {@link Context}* @param appPkg 包名* @return {@code true} 跳轉(zhuǎn)成功 <br> {@code false} 跳轉(zhuǎn)失敗*/public static boolean toXiaoMi(Context context, String appPkg) {return toMarket(context, appPkg, "com.xiaomi.market");}/*** 直接跳轉(zhuǎn)至魅族應(yīng)用商店** @param context {@link Context}* @param appPkg 包名* @return {@code true} 跳轉(zhuǎn)成功 <br> {@code false} 跳轉(zhuǎn)失敗*/public static boolean toMeizu(Context context, String appPkg) {return toMarket(context, appPkg, "com.meizu.mstore");}鑒于說上述機(jī)型差異,如果想自定義彈窗,那必須檢測(cè)手機(jī)安裝的應(yīng)用商店有哪些,檢測(cè)方式如下:(未詳細(xì)測(cè)試)
/*** 檢查已安裝的應(yīng)用商店* 但是小米商店目前檢測(cè)不出,先定義為bug** @param context {@link Context}* @return 返回包名列表*/public static List<String> checkMarket(Context context) {List<String> packageNames = new ArrayList<>();Intent intent = new Intent();intent.setAction("android.intent.action.MAIN");intent.addCategory("android.intent.category.APP_MARKET");PackageManager pm = context.getPackageManager();List<ResolveInfo> infos = pm.queryIntentActivities(intent, 0);int size = infos.size();for (int i = 0; i < size; i++) {ActivityInfo activityInfo = infos.get(i).activityInfo;String packageName = activityInfo.packageName;Log.d(TAG, "packageName : " + packageName);packageNames.add(packageName);}return packageNames;}如何分析適配機(jī)型
按照正常的寫法,三星和索尼都無法跳轉(zhuǎn)。下面將分析方法記錄起來,便于以后還有其他機(jī)型要適配時(shí)也知道如何進(jìn)行適配。
Intent跳轉(zhuǎn)方式分為顯式和隱式,正常跳轉(zhuǎn)屬于隱式跳轉(zhuǎn),正常寫法未跳轉(zhuǎn)的需要去尋找其應(yīng)用商店APP的跳轉(zhuǎn)協(xié)議。
1.下載對(duì)應(yīng)的應(yīng)用商店APK,然后進(jìn)行反編譯。
2.主要查看AndroidManifest.xml文件,分析跳轉(zhuǎn)協(xié)議。
3.使用jd-gui查看源碼,分析是否會(huì)附帶額外參數(shù)。
三星應(yīng)用商店:
AndroidManifest.xml
ContentDetailActivity.java
結(jié)合AndroidManifest.xml以及源碼,可以分析出三星的跳轉(zhuǎn)協(xié)議,經(jīng)測(cè)試兩中host都可以成功跳轉(zhuǎn),測(cè)試機(jī)型:三星C5,Android 7.1.1。
索尼精選
<activity android:alwaysRetainTaskState="true" android:clearTaskOnLaunch="false" android:configChanges="fontScale|keyboard|keyboardHidden|locale|screenLayout|uiMode" android:name="com.sonyericsson.playnowchina.android.phone.AppDetailActivity" android:screenOrientation="portrait"><intent-filter><category android:name="android.intent.category.BROWSABLE"/><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><data android:host="m.sonyselect.cn" android:scheme="http"/></intent-filter><intent-filter><action android:name="com.sonymobile.playnowchina.android.action.NOTIFICATION_APP_DETAIL_PAGE"/><category android:name="android.intent.category.DEFAULT"/></intent-filter><intent-filter><action android:name="com.sonymobile.playnowchina.android.action.APP_DETAIL_PAGE"/><category android:name="android.intent.category.DEFAULT"/></intent-filter></activity>AppDetailActivity.java
結(jié)合AndroidManifest.xml和源碼,很容易得出Action+app_id這個(gè)額外參數(shù),但是這樣的跳轉(zhuǎn)無論app_id傳的是包名還是上架索尼精選后的id,跳轉(zhuǎn)后都Toast顯示網(wǎng)絡(luò)異常。最后按照<data> 得出結(jié)果。
測(cè)試機(jī)型
| 索尼xm50t | 4.3 | 需要單獨(dú)適配索尼精選 |
| 三星C5 | 7.1.1 | 需要單獨(dú)適配三星應(yīng)用商店 |
| 紅米4X | 7.1.2,MIUI 9 | 正常 |
| 華為Mate8 | 7.0,EMUI 5.0.1 | 正常 |
| 魅族note3 | 7.0,flyme 6.2.0.1 | 正常 |
| OPPOA37m | 5.1,ColorOs 3.0 | 正常 |
源碼
https://github.com/scauzhangpeng/Sample/blob/master/util/src/main/java/com/xyz/util/MarketUtil.java
結(jié)論:
本篇記錄如何進(jìn)行適配應(yīng)用商店的方法,索尼精選這類在開發(fā)過程中也可以不進(jìn)行適配,視情況而定。
總結(jié)
以上是生活随笔為你收集整理的Android适配 - 跳转应用商店查看应用详情的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java自定义异常类以及异常拦截器
- 下一篇: 法院触摸屏查询软件