猿问
下载APP

让Facebook登录使用Android Webview

让Facebook登录使用Android Webview

我只是想在Android上的WebView上实现facebook登录。问题是我单击HTML页面上的facebook按钮并在Facebook对话框中插入用户名和密码。网址重定向只是给了我一个黑页。

   @Overridepublic void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    WebView webview = new WebView(this);        
    webview.setWebChromeClient(new WebChromeClient());  
    webview.getSettings().setPluginState(PluginState.ON);
    webview.getSettings().setJavaScriptEnabled(true); 
    webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
    webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webview.setWebViewClient(new WebViewClient());
    webview.loadUrl("http://peoplehunt.crowdscanner.com/hunt"); 
    setContentView(webview);

这是我的HTML页面上的Facebook常规JavaScript API,当点击facebook按钮时会调用此函数。

$("#login_facebook").click(function() {

                    FB.login(function(response) {
                            //This function should be called
                            if (response.authResponse) {
                            FB.api('/me?fields=name,email,picture,id&type=large', function(response) {
                                    //console.log("email "+response.email);
                                    $("#submitHandle").hide();
                                    $("#loader").show();
                                    //console.log('Good to see you, ' + response.picture + '.');
                                    var theUsername = response.name;
                                    theUsername = theUsername.replace(/ /g, '_')+"_"+response.id+"@meetforeal.com";
                                    //console.log(theUsername);
                                    $("input[name=email]").val(encodeURIComponent(response.email));
                                    $("input[name=lastName]").val(encodeURIComponent(response.name));
                                      });

有关如何在Facebook对话框页面上重定向后获得响应的任何想法?谢谢。


斯蒂芬大帝
浏览 60回答 3
3回答

慕莱坞森

我在Android应用程序上遇到了同样的问题。问题的原因是FB登录javascript在新窗口中打开一个新页面。然后它尝试关闭它并在登录成功后发回一些javascript auth代码。WebView通常只是“单一窗口”,因此无法返回,因此空白屏幕。请遵循我的工作代码中的流动示例。<FrameLayout&nbsp;xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#0099cc"tools:context=".MyActivity"&nbsp;android:id="@+id/webview_frame"><WebView &nbsp;&nbsp;&nbsp;&nbsp;android:id="@+id/webview" &nbsp;&nbsp;&nbsp;&nbsp;android:layout_width="fill_parent" &nbsp;&nbsp;&nbsp;&nbsp;android:layout_height="fill_parent"/>ID“webview”的Webview是我内容的主视图。以下是我的活动代码。public&nbsp;class&nbsp;MyActivity&nbsp;extends&nbsp;Activity&nbsp;{/*&nbsp;URL&nbsp;saved&nbsp;to&nbsp;be&nbsp;loaded&nbsp;after&nbsp;fb&nbsp;login&nbsp;*/private&nbsp;static&nbsp;final&nbsp;String&nbsp;target_url="http://www.example.com";private&nbsp;static&nbsp;final&nbsp;String&nbsp;target_url_prefix="www.example.com";private&nbsp;Context&nbsp;mContext;private&nbsp;WebView&nbsp;mWebview;private&nbsp;WebView&nbsp;mWebviewPop;private&nbsp;FrameLayout&nbsp;mContainer;private&nbsp;long&nbsp;mLastBackPressTime&nbsp;=&nbsp;0;private&nbsp;Toast&nbsp;mToast;@Overrideprotected&nbsp;void&nbsp;onCreate(Bundle&nbsp;savedInstanceState)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;super.onCreate(savedInstanceState); &nbsp;&nbsp;&nbsp;&nbsp;setContentView(R.layout.activity_urimalo); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;final&nbsp;View&nbsp;controlsView&nbsp;= &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;findViewById(R.id.fullscreen_content_controls); &nbsp;&nbsp;&nbsp;&nbsp;CookieManager&nbsp;cookieManager&nbsp;=&nbsp;CookieManager.getInstance();&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;cookieManager.setAcceptCookie(true);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;mWebview&nbsp;=&nbsp;(WebView)&nbsp;findViewById(R.id.webview); &nbsp;&nbsp;&nbsp;&nbsp;//mWebviewPop&nbsp;=&nbsp;(WebView)&nbsp;findViewById(R.id.webviewPop); &nbsp;&nbsp;&nbsp;&nbsp;mContainer&nbsp;=&nbsp;(FrameLayout)&nbsp;findViewById(R.id.webview_frame); &nbsp;&nbsp;&nbsp;&nbsp;WebSettings&nbsp;webSettings&nbsp;=&nbsp;mWebview.getSettings(); &nbsp;&nbsp;&nbsp;&nbsp;webSettings.setJavaScriptEnabled(true); &nbsp;&nbsp;&nbsp;&nbsp;webSettings.setAppCacheEnabled(true); &nbsp;&nbsp;&nbsp;&nbsp;webSettings.setJavaScriptCanOpenWindowsAutomatically(true); &nbsp;&nbsp;&nbsp;&nbsp;webSettings.setSupportMultipleWindows(true); &nbsp;&nbsp;&nbsp;&nbsp;mWebview.setWebViewClient(new&nbsp;UriWebViewClient()); &nbsp;&nbsp;&nbsp;&nbsp;mWebview.setWebChromeClient(new&nbsp;UriChromeClient()); &nbsp;&nbsp;&nbsp;&nbsp;mWebview.loadUrl(target_url); &nbsp;&nbsp;&nbsp;&nbsp;mContext=this.getApplicationContext();}private&nbsp;class&nbsp;UriWebViewClient&nbsp;extends&nbsp;WebViewClient&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;shouldOverrideUrlLoading(WebView&nbsp;view,&nbsp;String&nbsp;url)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;host&nbsp;=&nbsp;Uri.parse(url).getHost(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Log.d("shouldOverrideUrlLoading",&nbsp;url); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(host.equals(target_url_prefix))&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;is&nbsp;my&nbsp;web&nbsp;site,&nbsp;so&nbsp;do&nbsp;not&nbsp;override;&nbsp;let&nbsp;my&nbsp;WebView&nbsp;load &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;the&nbsp;page &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(mWebviewPop!=null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebviewPop.setVisibility(View.GONE); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mContainer.removeView(mWebviewPop); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebviewPop=null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(host.equals("m.facebook.com")) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Otherwise,&nbsp;the&nbsp;link&nbsp;is&nbsp;not&nbsp;for&nbsp;a&nbsp;page&nbsp;on&nbsp;my&nbsp;site,&nbsp;so&nbsp;launch &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;another&nbsp;Activity&nbsp;that&nbsp;handles&nbsp;URLs &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Intent&nbsp;intent&nbsp;=&nbsp;new&nbsp;Intent(Intent.ACTION_VIEW,&nbsp;Uri.parse(url)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startActivity(intent); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onReceivedSslError(WebView&nbsp;view,&nbsp;SslErrorHandler&nbsp;handler, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SslError&nbsp;error)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d("onReceivedSslError",&nbsp;"onReceivedSslError"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//super.onReceivedSslError(view,&nbsp;handler,&nbsp;error); &nbsp;&nbsp;&nbsp;&nbsp;}}class&nbsp;UriChromeClient&nbsp;extends&nbsp;WebChromeClient&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;onCreateWindow(WebView&nbsp;view,&nbsp;boolean&nbsp;isDialog, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;isUserGesture,&nbsp;Message&nbsp;resultMsg)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebviewPop&nbsp;=&nbsp;new&nbsp;WebView(mContext); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebviewPop.setVerticalScrollBarEnabled(false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebviewPop.setHorizontalScrollBarEnabled(false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebviewPop.setWebViewClient(new&nbsp;UriWebViewClient()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebviewPop.getSettings().setJavaScriptEnabled(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebviewPop.getSettings().setSavePassword(false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebviewPop.setLayoutParams(new&nbsp;FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ViewGroup.LayoutParams.MATCH_PARENT)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mContainer.addView(mWebviewPop); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebView.WebViewTransport&nbsp;transport&nbsp;=&nbsp;(WebView.WebViewTransport)&nbsp;resultMsg.obj; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transport.setWebView(mWebviewPop); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultMsg.sendToTarget(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onCloseWindow(WebView&nbsp;window)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d("onCloseWindow",&nbsp;"called"); &nbsp;&nbsp;&nbsp;&nbsp;}}}这个问题的关键是onCreateWindow。创建一个新窗口并将其插入到框架布局中,并在成功时将其删除。我在shouldOverrideUrlLoading添加了删除。

隔江千里

这是一个示例Android项目:&nbsp;Github:Android_Popup_Webview_handler_example这是一个Android Studio项目,展示了如何在Android Webview中处理弹出窗口。大多数开源浏览器不支持打开弹出窗口。弹出窗口在许多网站(例如,www.feedly.com)中使用的OAuth登录中尤其重要。此项目中的弹出窗口在对话框中打开,可以通过关闭按钮或按Back或者弹出窗口自行关闭(如大多数登录身份验证流程中发生的情况)来解除。

慕仰8121524

覆盖shouldOverrideUrlLoading()你的WebViewClient。在shouldOverrideUrlLoading&nbsp;这里搜索。此外,还有一个参数可以传递给Facebook的登录API;&nbsp;我认为这是redirect_uri。这应该可以帮助您识别登录成功的时间,并且在您的情况下shouldOVerrideUrlLoading(),您只需要检测正在加载的URL,如果它是您指定的redirect_uri,那么只需在该方法中返回true并关闭webview或者您想要的任何内容登录成功。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答