目录
在官方淘宝开放平台查询打开淘宝APP文档,未果。各处查找资料,其中参考了《应用内打开京东、淘宝指定商品或店铺页面》;发现未安装淘宝app时在WebView中打开网页无法下载,其中参考了《三种方式让 Android WebView 支持文件下载》。在写下这边博文之前,始终觉得这种非官方打开方式存在一定隐患,比如官方需要参数发生改变导致我们Intent.setData()中的uri参数不满足官方要求,各位有更好的方式请评论处留言。
准备工作
- 店铺id或商品id
- 淘宝app包名:com.taobao.taobao
- 淘宝app展示店铺uri:taobao://shop.m.taobao.com/shop/shop_index.htm?shop_id=%1$s
- 淘宝app展示商品uri:taobao://item.taobao.com/item.htm?id=%1$s
- webView展示店铺uri:https://shop.m.taobao.com/shop/shop_index.htm?shop_id=%1$s
- webView展示商品uri:https://item.taobao.com/item.htm?id=%1$
逻辑
- 检测本地是否安装淘宝app
- 安装则打开淘宝app,否则打开webView
具体实现
- 判断本地是否安装淘宝客户端
/** * 检测该包名所对应的应用是否存在 * * @param packageName * @return */ private static boolean checkPackage(String packageName) { return new File("/data/data/" + packageName).exists(); }
其中packageName传入值为淘宝app包名(即com.taobao.taobao)
-
根据判断打开淘宝app或webView
/** * @param activityOrFragment * @param taoBaoShopId 淘宝店铺id * @param taoBaoGoodsId 淘宝商品id * @param reqCode */ private static void openTaobao(ComponentCallbacks activityOrFragment, String taoBaoShopId, String taoBaoGoodsId, int reqCode) { boolean shopEmpty = taoBaoShopId == null || TextUtil.isEmpty(taoBaoShopId); boolean goodsEmpty = taoBaoGoodsId == null && TextUtil.isEmpty(taoBaoGoodsId); if (shopEmpty && goodsEmpty) { return; } Context context = null; //获取Context if (activityOrFragment instanceof Activity) { context = (Activity) activityOrFragment; } else if (activityOrFragment instanceof Fragment) { context = ((Fragment) activityOrFragment).getContext(); } else if (activityOrFragment instanceof android.app.Fragment) { context = ((android.app.Fragment) activityOrFragment).getActivity(); } if (checkPackage2(MyApp.getContext().getString(R.string.taobao_package_name))) { // Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); String uriString; if (taoBaoShopId != null && TextUtil.isEmpty(taoBaoShopId)) { uriString = MyApp.getContext().getString(R.string.taobao_app_shop, taoBaoShopId); } else { uriString = MyApp.getContext().getString(R.string.taobao_app_goods, taoBaoGoodsId); } Uri uri = Uri.parse(uriString); intent.setData(uri); if (context == null) { return; } //跳转 if (activityOrFragment instanceof Activity) { ((Activity) activityOrFragment).startActivityForResult(intent, reqCode); } else if (activityOrFragment instanceof Fragment) { ((Fragment) activityOrFragment).startActivityForResult(intent, reqCode); } else if (activityOrFragment instanceof android.app.Fragment) { ((android.app.Fragment) activityOrFragment).startActivityForResult(intent, reqCode); } } else { String uriString; if (taoBaoShopId != null && TextUtil.isEmpty(taoBaoShopId)) { uriString = MyApp.getContext().getString(R.string.taobao_web_shop, taoBaoShopId); } else { uriString = MyApp.getContext().getString(R.string.taobao_web_goods, taoBaoGoodsId); } MallDetailActivity.startActivity(activityOrFragment, uriString, reqCode); } }
-
调用
/** * 查看淘宝商铺 * * @param activityOrFragment * @param taoBaoShopId * @param reqCode */ public static void openShopInTaobao(ComponentCallbacks activityOrFragment, String taoBaoShopId, int reqCode) { openTaobao(activityOrFragment, taoBaoShopId, null, reqCode); } /** * 查看淘宝商品 * * @param activityOrFragment * @param taoBaoGoodsId * @param reqCode */ public static void openGoodsInTaobao(ComponentCallbacks activityOrFragment, String taoBaoGoodsId, int reqCode) { openTaobao(activityOrFragment, null, taoBaoGoodsId, reqCode); }
-
用到资源
<string name="taobao_app_shop">taobao://shop.m.taobao.com/shop/shop_index.htm?shop_id=%1$s</string> <string name="taobao_app_goods">taobao://item.taobao.com/item.htm?id=%1$s</string> <string name="taobao_web_shop">https://shop.m.taobao.com/shop/shop_index.htm?shop_id=%1$s</string> <string name="taobao_web_goods">https://item.taobao.com/item.htm?id=%1$s</string> <string name="taobao_package_name">com.taobao.taobao</string>