Android适配 - 跳转应用商店查看应用详情
Android 跳轉手機已安裝的應用市場,APP大多數都會引導用戶去應用市場進行評分或者評論,正常的跳轉協議已經可以滿足大部分手機應用市場,但是在三星、索尼、紅米上也會出現一些不一樣的效果,本文記錄如何適配跳轉。
正常跳轉
/*** 跳轉應用商店.** @param context {@link Context}* @param appPkg 包名* @param marketPkg 應用商店包名* @return {@code true} 跳轉成功 <br> {@code false} 跳轉失敗*/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) {// 如果沒給市場的包名,則系統會彈出市場的列表讓你進行選擇。intent.setPackage(marketPkg);}try {context.startActivity(intent);return true;} catch (Exception ex) {ex.printStackTrace();return false;}}正常跳轉如果手機安裝了多個應用市場,例如:應用寶、360手機助手,則會彈出系統選擇框給用戶進行選擇,用戶也可以勾選是否默認選擇(某些機型是:始終/僅此一次)
三星手機表現異常
上述正常方法未能打開三星的官方應用商店,也就是如果要跳轉三星應用商店則需要單獨適配。正確打開方式如下:
/*** 跳轉三星應用商店* @param context {@link Context}* @param packageName 包名* @return {@code true} 跳轉成功 <br> {@code false} 跳轉失敗*/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;}}索尼手機表現異常
上述正常方法未能打開索尼的官方應用商店-索尼精選,也有人指出索尼并無單獨的應用商店,采用的是Google的Google Play,國內才推出索尼精選。正確的打開方式如下:
/*** 跳轉索尼精選* @param context {@link Context}* @param appId 索尼精選中分配得appId* @return {@code true} 跳轉成功 <br> {@code false} 跳轉失敗*/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;}}跳轉索尼精選,附帶APPID,但是這個值是索尼精選分配的,也就是上傳了索尼精選后的id,例如微信的id是9115。
紅米note2表現異常(未測試)
上述正常方式跳轉應用市場,無論手機是否安裝其他應用市場,均跳轉至小米商店。(本人測試手機紅米4X,屬于正常跳轉)
合適的跳轉方式
由于上述情況多變,但是大多數情況下,正常寫法已經滿足要求。如果想僅僅跳轉應用寶或者小米商店,而不進行系統彈窗選擇,可以直接指定包名,這樣就可以直接跳轉。
/*** 直接跳轉至應用寶** @param context {@link Context}* @param appPkg 包名* @return {@code true} 跳轉成功 <br> {@code false} 跳轉失敗*/public static boolean toQQDownload(Context context, String appPkg) {return toMarket(context, appPkg, "com.tencent.android.qqdownloader");}/*** 直接跳轉至360手機助手** @param context {@link Context}* @param appPkg 包名* @return {@code true} 跳轉成功 <br> {@code false} 跳轉失敗*/public static boolean to360Download(Context context, String appPkg) {return toMarket(context, appPkg, "com.qihoo.appstore");}/*** 直接跳轉至豌豆莢** @param context {@link Context}* @param appPkg 包名* @return {@code true} 跳轉成功 <br> {@code false} 跳轉失敗*/public static boolean toWandoujia(Context context, String appPkg) {return toMarket(context, appPkg, "com.wandoujia.phoenix2");}/*** 直接跳轉至小米應用商店** @param context {@link Context}* @param appPkg 包名* @return {@code true} 跳轉成功 <br> {@code false} 跳轉失敗*/public static boolean toXiaoMi(Context context, String appPkg) {return toMarket(context, appPkg, "com.xiaomi.market");}/*** 直接跳轉至魅族應用商店** @param context {@link Context}* @param appPkg 包名* @return {@code true} 跳轉成功 <br> {@code false} 跳轉失敗*/public static boolean toMeizu(Context context, String appPkg) {return toMarket(context, appPkg, "com.meizu.mstore");}鑒于說上述機型差異,如果想自定義彈窗,那必須檢測手機安裝的應用商店有哪些,檢測方式如下:(未詳細測試)
/*** 檢查已安裝的應用商店* 但是小米商店目前檢測不出,先定義為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;}如何分析適配機型
按照正常的寫法,三星和索尼都無法跳轉。下面將分析方法記錄起來,便于以后還有其他機型要適配時也知道如何進行適配。
Intent跳轉方式分為顯式和隱式,正常跳轉屬于隱式跳轉,正常寫法未跳轉的需要去尋找其應用商店APP的跳轉協議。
1.下載對應的應用商店APK,然后進行反編譯。
2.主要查看AndroidManifest.xml文件,分析跳轉協議。
3.使用jd-gui查看源碼,分析是否會附帶額外參數。
三星應用商店:
AndroidManifest.xml
ContentDetailActivity.java
結合AndroidManifest.xml以及源碼,可以分析出三星的跳轉協議,經測試兩中host都可以成功跳轉,測試機型:三星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
結合AndroidManifest.xml和源碼,很容易得出Action+app_id這個額外參數,但是這樣的跳轉無論app_id傳的是包名還是上架索尼精選后的id,跳轉后都Toast顯示網絡異常。最后按照<data> 得出結果。
測試機型
| 索尼xm50t | 4.3 | 需要單獨適配索尼精選 |
| 三星C5 | 7.1.1 | 需要單獨適配三星應用商店 |
| 紅米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
結論:
本篇記錄如何進行適配應用商店的方法,索尼精選這類在開發過程中也可以不進行適配,視情況而定。
總結
以上是生活随笔為你收集整理的Android适配 - 跳转应用商店查看应用详情的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java自定义异常类以及异常拦截器
- 下一篇: android midi 编辑6,And