[Point] Android 跳转浏览器
2018-12-14 本文已影响0人
simplehych
理想代码如下即可
String url = "http://www.baidu.com";
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(browserIntent);
奔溃日志
android.content.ActivityNotFoundException: No Activity found to handle Intent
原因
url 为非法地址,包含%3A,将其转换为 ' : ' 即可。且必须为 ' http ' 或 ' https ' 开头的字符串
锁定:h5页面传过来的url 存在问题
http%3A//finance.people.com.cn/n1/2018/1213/c1004-30464034.html
解决方式
String decode = URLDecoder.decode(url)
输出结果:http://finance.people.com.cn/n1/2018/1213/c1004-30464034.html
未避免其他异常,建议 try catch
分析可能原因
- 问题出在 WebView JsBridge @JavascriptInterface 方法中,怀疑是否需要主线程或子线程处理,验证无影响
MainHandler.runOnUiThread(new Runnable() {
@Override
public void run() {
//跳转浏览器
}
});
getActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
//跳转浏览器
}
});
new Handler().post(new Runnable() {
@Override
public void run() {
//跳转浏览器
}
});
- 检查清单文件 Activity 配置(name, intent-filter),验证无影响
<activity
android:name="com.peopletech.gov.mvp.ui.activity.GovListActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="${GOV_SCHEME}" />
</intent-filter>
</activity>
-
项目中用到了路由,猜测没有获取到 Activity,故新建了 Activity 进行跳转操作,依旧无效。
-
Android 版本问题,8.0更换了本地浏览器包名,不属于该问题原因
// 8.0以下
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse("https://xxx"); //要跳转的网页
intent.setData(content_url);
intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");
context.startActivity(intent);
//8.0 以上
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse("http://xxx");
intent.setData(content_url);
intent.setClassName("org.chromium.webview_shell","org.chromium.webview_shell.WebViewBrowserActivity");
context.startActivity(intent);
另对 url 进行编解码操作:
String originUrl = "http%3A//finance.people.com.cn/n1/2018/1213/c1004-30464034.html";
String encodeUrl = URLEncoder.encode(originUrl);
String decodeUrl = URLDecoder.decode(originUrl);
String utf8Url = new String(originUrl.getBytes("UTF-8"), "UTF-8");
//结果依次为:
//encodeUrl: http%253A%2F%2Ffinance.people.com.cn%2Fn1%2F2018%2F1213%2Fc1004-30464034.html
//decodeUrl: http://finance.people.com.cn/n1/2018/1213/c1004-30464034.html
//utf8Url: http%3A//finance.people.com.cn/n1/2018/1213/c1004-30464034.html