Android自定义Scheme解析方法
/**
* 解析Uri
*/
fun urlDecodeAction(schemeUri: Uri): Map<String, Any> {
// [scheme]://[host][:port]/[path]?[query]
// scheme: 协议名称(由开发人员自定义)(必要,其他都是可选)
// host: 域名
// port:端口
// path: 页面路径
// query: 请求参数
// 示例: jrzfve://www.jrzf.com/outlink?platform=jrgjApp&target=publish¶ms={"shareId": "c4ae43d8"}
Log.d("caowj", "解析Scheme URL:$schemeUri")
val scheme: String? = schemeUri.scheme
val host: String? = schemeUri.host
val path: String? = schemeUri.path
val paramsMap = parseUrlParames(schemeUri.toString())
scheme?.let { paramsMap["scheme"] = it }
host?.let { paramsMap["host"] = it }
path?.let { paramsMap["path"] = it }
// // Uri解析单个参数
// val platform = schemeUri.getQueryParameter("platform")
// val target = schemeUri.getQueryParameter("target")
// val jsonParams = schemeUri.getQueryParameter("params")
// Log.w("caowj", "platform=$platform\ntarget=$target\nparams= $jsonParams")
return paramsMap
}
/**
* 获得url中的所有参数(url中?后面的部分)
* @param schemeUrl
* @return
*/
private fun parseUrlParames(schemeUrl: String): MutableMap<String, Any> {
var url = schemeUrl
val map: MutableMap<String, Any> = HashMap()
try {
val charset = "utf-8"
url = URLDecoder.decode(url, charset)
if (url.indexOf('?') != -1) {
val paramsStr = url.substring(url.indexOf('?') + 1)
val keyValues = paramsStr.split("&".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()
for (i in keyValues.indices) {
val key = keyValues[i].substring(0, keyValues[i].indexOf("="))
val value = keyValues[i].substring(keyValues[i].indexOf("=") + 1)
map[key] = value
}
}
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
return map
}