美文网首页
[Point] Android 跳转浏览器

[Point] Android 跳转浏览器

作者: simplehych | 来源:发表于2018-12-14 15:42 被阅读0次

    理想代码如下即可

    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

    分析可能原因

    1. 问题出在 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() {
              //跳转浏览器
          }
    });
    
    1. 检查清单文件 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>
    
    1. 项目中用到了路由,猜测没有获取到 Activity,故新建了 Activity 进行跳转操作,依旧无效。

    2. 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 
    

    相关文章

      网友评论

          本文标题:[Point] Android 跳转浏览器

          本文链接:https://www.haomeiwen.com/subject/pikghqtx.html