介绍
尝试webview中的h5页面跳转到Android原生页面时,遇到了 net::ERR_UNKNOWN_URL_SCHEME的问题;
而浏览器中的h5页面跳转到Android原生页面则正常,而且还弹出了两个应用程序,可能scheme链接和该应用重复了;
解决办法:因为webview只能识别http和https协议,遇到图中这种”android://”开头的自定义协议时就无法识别,便会提示ERR_UNKNOWN_URL_SCHEME这样的错误。
代码
HTML
<a href="android://h5/open?type=1&id=7#fragmentTest">点击跳转到安卓</a>
Android
配置AndroidManifest.xml中的activity,我选择的是h5页面跳转到MainActivity配置页面中;所以在该activity中添加的intent–filter配置,并配置好想要的scheme链接;
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<!--程序入口-->
<action android:name="android.intent.action.MAIN" />
<!--常与action android:name="android.intent.action.MAIN"配合使用,用于表名应用的第一个启动的Activity-->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!--h5跳转app -->
<!--需要添加下面的intent-filter配置-->
<intent-filter>
<!--通过一个应用来显示数据-->
<action android:name="android.intent.action.VIEW" />
<!--默认值,没有该默认值则无法响应隐式意图-->
<category android:name="android.intent.category.DEFAULT" />
<!--该组件可以通过浏览器打开-->
<category android:name="android.intent.category.BROWSABLE" />
<!--android:scheme="android" 用来辨别启动的app-->
<!--android:host="h5" 可以当成是一个域名,这边建议使用应用的包名-->
<!--android:pathPrefix="/open" 参数路径前缀-->
<data android:host="h5" android:pathPrefix="/open" android:scheme="android" /> <!--android://h5/open-->
</intent-filter>
</activity>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
Log.d("test123",""+intent);
String action = intent.getAction();
if (Intent.ACTION_VIEW.equals(action)) { //判断是否是我们指定的 action
Uri uri = intent.getData(); //将String类型的URL转变为URI
if (uri != null) {
String type = uri.getQueryParameter("type"); //获取参数
String id = uri.getQueryParameter("id");
String fragment = uri.getFragment();
Log.d("test123",""+uri);
Log.d("test123",""+type);
Log.d("test123",""+id);
Log.d("test123",""+fragment);
}
}
}
}
webview中配置scheme链接可正常跳转;
即对shouldOverriderUrlLoading方法中的参数 String url进行判断,url.startsWith(“http://”)||url.startsWith(“https://”) 即表示加载的url是 http/https 协议,不对其进行拦截处理,反之则进行拦截处理。
public class WebViewActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview_layout);
webView = findViewById(R.id.wView);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("http://") || url.startsWith("https://")) { //加载的url是http/https协议地址
view.loadUrl(url);
return false; //返回false表示此url默认由系统处理,url未加载完成,会继续往下走
} else { //加载的url是自定义协议地址
try {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
}
});
webView.getSettings().setJavaScriptEnabled(true);//是否允许执行js,默认为false。设置true时,会提醒可能造成XSS漏洞
webView.loadUrl("http://192.168.0.105:8089/test3"); //调用loadUrl方法为WebView加入链接
}
}
实现效果
本文参考
实现h5链接打开Android app
解决webview出现错误net::err_unknown_url_scheme 的问题
WebView出现net::ERR_UNKNOWN_URL_SCHEME错误
Uri详解之——Uri结构与代码提取
原文地址:https://blog.csdn.net/qq_41522141/article/details/124154367
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_48296.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!