如何在WebView URL上处理intent://? [英] How to handle intent:// on a webView URL?
问题描述
我目前正在使用webView
开发一个Android应用.在某些urls
上,我需要使用shouldOverrideUrlLoading
方法,这很简单:
I'm currently developing an android app with a webView
. On some urls
I need to use the shouldOverrideUrlLoading
method, which is pretty straight forward :
if(url.startsWith("something")){
//do something
return true;
}
我的问题:
例如,某些URLS
在Google搜索上具有以下URL
方案:
Some URLS
, on google search for example, have the following URL
scheme :
intent://en.m.wikipedia.org/wiki/Test_cricket#Intent;scheme=http;package=org.wikipedia;S.browser_fallback_url=https%3A%2F%2Fwww.google.pt%2Fsearchurl%2Fr.html%23app%3Dorg.wikipedia%26pingbase%3Dhttps%3A%2F%2Fwww.google.pt%2F%26url%3Dhttps%3A%2F%2Fen.m.wikipedia.org%2Fwiki%2FTest_cricket;S.android.intent.extra.REFERRER_NAME=https%3A%2F%2Fwww.google.pt;launchFlags=0x8080000;end
我尝试使用:
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(browserIntent);
但是我得到一个错误:
10-15 15:18:15.546: W/System.err(29086): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=intent://en.m.wikipedia.org/wiki/Test_cricket }
我应该如何处理这种URL
方案?
How should I handle this kind of URL
scheme ?
更新:
在@CommonsWare注释之后,我尝试在Intent
上使用parseUri()
从URL
创建Intent object
,然后尝试startActivity()
,例如:
Following @CommonsWare comments, I've tried using parseUri()
on Intent
to create an Intent object
from the URL
and then try startActivity()
, something like:
Intent myIntent = new Intent().parseUri(url, Intent.URI_INTENT_SCHEME);
startActivity(myIntent);
但是我仍然得到:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://en.m.wikipedia.org/wiki/Test_cricket flg=0x8080000 pkg=org.wikipedia (has extras) }
我可能有错误的说明,或者我无法按照指定的@CommonsWare构造intent
.有关如何构造Intent
的任何提示?
I may have got the instructions wrong or I'm simply unable to construct the intent
as @CommonsWare specified. Any tips on how to construct the Intent
?
推荐答案
Structure of this intent url is described here https://developer.chrome.com/multidevice/android/intents.
因此我们可以在内部WebView中像这样处理它:
So we can handle it in internal WebView like this:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("intent://")) {
try {
Context context = view.getContext();
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
if (intent != null) {
view.stopLoading();
PackageManager packageManager = context.getPackageManager();
ResolveInfo info = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (info != null) {
context.startActivity(intent);
} else {
String fallbackUrl = intent.getStringExtra("browser_fallback_url");
view.loadUrl(fallbackUrl);
// or call external broswer
// Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(fallbackUrl));
// context.startActivity(browserIntent);
}
return true;
}
} catch (URISyntaxException e) {
if (GeneralData.DEBUG) {
Log.e(TAG, "Can't resolve intent://", e);
}
}
}
return false;
}
这篇关于如何在WebView URL上处理intent://?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!