解决onelink短链被应用市场拦截的问题
问题
1.Onelink是啥就不说了,你可以去问谷歌
2.需求
问题:国内应用市场自带浏览器会识别onelink短链,跳转到自家应用市场
不跳转手机自带的应用市场,我想跳转到手机上安装的GooglePlay,怎么办?
一般 onelink 地址:https://go.onelink.me/app/…
到了浏览器中会重定向:market://details?id=包名&…
解决方法
1.创建一个webview 控件,调用loadUrl方法
2.创建内部类继承WebViewClient,覆写shouldOverrideUrlLoading
// 针对国内地址被拦截的问题
url?.let {
if(it.contains("market://")){
val startIndex = it.indexOf("=")
val endIndex = it.indexOf("&")
if(startIndex+1 < endIndex){
// 处理一:统一规则,最后到onPageFinished方法中处理
val packageName = it.substring(startIndex+1,endIndex)
val newUrl = "https://play.google.com/store/apps/details?id=$packageName"
view?.loadUrl(newUrl)
// 处理二:直接处理,直接跳转
return true
}
}
}
return super.shouldOverrideUrlLoading(view, url)
3.覆盖 onPageFinished 方法,创建自己的跳转规则
var isFirstLoad = true
if (view.url.contains("play.google.com") && view.url.contains("?id=") && isFirstLoad) {
isFirstLoad = false
// 跳转到应用市场
}else{
// 跳转浏览器下载
}
4.跳转到应用市场
fun startMarket(activity: Activity, url: String?) {
val GOOGLE_PLAY = "com.android.vending"
try {
if ("" == url) return
val packageName = url!!.split("?id=")[1]
//这里开始执行一个应用市场跳转逻辑,默认this为Context上下文对象
val uri = Uri.parse("market://details?id=${packageName}")
val intent = Intent(Intent.ACTION_VIEW, uri)
//跳转到应用市场,非Google Play市场一般情况也实现了这个接口
//存在手机里没安装应用市场的情况,跳转会包异常,做一个接收判断
if (intent.resolveActivity(activity.packageManager) != null) { //可以接收
if (!TextUtils.isEmpty(packageName)) {
intent.setPackage(GOOGLE_PLAY)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
activity.startActivity(intent)
}
} else { //没有应用市场,我们通过浏览器跳转到Google Play
intent.data = Uri.parse(url)
//这里存在一个极端情况就是有些用户浏览器也没有,再判断一次
if (intent.resolveActivity(activity!!.packageManager) != null) { //有浏览器
activity.startActivity(intent)
} else {
Toast.makeText(activity,"You don't have an app market installed, not even a browser!",Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
// 跳转失败了
}
}
5.跳转浏览器下载
private fun toDownLoad(url : String) {
try {
val intent = Intent()
intent.action = "android.intent.action.VIEW"
intent.data = Uri.parse(url)
intent.addCategory(Intent.CATEGORY_BROWSABLE)
startActivity(intent)
} catch (e: Exception) {
e.printStackTrace()
}
}