我在WebView中实现用户身份验证时遇到问题。
正如API文档所说,我需要加载网址" http://example.com/?key=abc"然后用户输入他的登录信息&密码,然后他被重定向到网页" myapp:// token#access_token = 123456"。
我只需要在WebView中加载它并使用" 123456"返回我的应用程序。令牌。第一个问题是WebView不支持自定义协议,它给我一个错误" ERR_UNKNOWN_URL_SCHEME" 。
第二个问题是我不完全了解如何使用页面数据返回我的应用程序。
在 AndroidManifest.xml 中我有:
<activity
android:name="(appname)"
android:label="@string/app_name"
android:configChanges="orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</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"/>
<data
android:scheme="myapp"
android:host="token"/>
</intent-filter>
</activity>
在 Main.java 文件中,我有以下代码:
Intent i = new Intent(Main.this, LoginWebViewActivity.class);
startActivityForResult(i, 1);
并在 LoginWebActivity.java 中,我有以下代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webviewact);
webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://example.com/?key=abc");
}
我看到一个快速解决方案:在外部浏览器中打开此链接,但是,我不明白我的应用程序如何从外部浏览器获取数据。
答案 0 :(得分:1)
您不需要实现自定义方案。您应该将该回调URL传递到网页中,然后通过处理shouldOverrideUrlLoading
来查找并拦截代码中的回调:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("http://myapp/token#access_token=")) {
// Parse the token fom the URL and close the webview
return true;
} else {
return super.shouldOverrideUrlLoading(view, url);
}
}
});
答案 1 :(得分:0)
这不是“网页”:
myapp://token#access_token=123456
这可能是一个URI,如果你正确地执行它,你可以过滤它。您需要使用IntentFilter
实现自己的URI,如下所示:
看到这篇文章:
How to implement my very own URI scheme on Android
编辑:
要解释 - 您正在发送“登录”请求。然后你说你正在“重定向”客户端
myapp://token#access_token=123456
您无法告诉客户“重定向”到非URL网页。 WebView
客户端是“http”客户端 - 它不接受它无法识别的数据方案/ mime类型。所以你的“重定向”失败了。
执行页面请求时,响应应该是URI而不是重定向。您可以解析响应数据以查看是否获得此响应(与登录失败相比),如果您这样做,则可以启动新的活动。就这么简单。
这里有一个答案建议您覆盖shouldOverrideUrlLoading
,这也是可以接受的。在这种情况下,我们假设您正在进行客户端重定向,在这种情况下,此方法将允许您捕获身份验证响应,为您需要的数据解析它,然后您可以启动您想要的任何URL或活动
为了进一步解释,XML数据方案仅对Intent
有用。您的WebView
正在内部响应 - 没有意图发送。您必须获取HTTP响应,解析它,然后广播Intent
以使您的代码部分能够正常工作。