2

Android Webview에서 JS Facebook SDK를 사용하는 Facebook 로그인 버튼을 사용하려고합니다. 그것을 클릭하면 새 페이지를 열고 https://www.facebook.com/dialog/oauth ...로 리디렉션됩니다. 이는 자바 스크립트 코드가있는 빈 페이지입니다. 그리고 웹뷰는 여기 남아 있습니다.Android Webview의 Facebook 로그인 버튼이 빈 페이지로 리디렉션됩니다.

내가 사용 :

webview.getSettings().setJavaScriptEnabled(true); 
webview.getSettings().setAppCacheEnabled(true); 
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 

감사합니다!

답변

2

웹 사이트의 원래 URL로 리디렉션 할 논리를 추가해야합니다. 이 작업을 수행하기 위해

, 먼저 WebViewClient 클래스를 확장하고 방법과 같이 onPageFinished 무시 새로운 자바 클래스를 만들어야합니다

public class CustomWebViewClient extends WebViewClient 
{  
     @Override 
     public void onPageFinished(WebView view, String url) { 

      //https://www.facebook.com/dialog/permissions.request 
      //actually works for me, but I put the URL you say is coming up  
      //blank in there instead, whatever works for you: 
      if(url.startsWith("https://www.facebook.com/dialog/oauth")){ 
       String redirectUrl = "http://www.mydomain.com/MyApp/"; 
       view.loadUrl(redirectUrl); 
       return; 
      } 
      super.onPageFinished(view, url); 
     } 
} 

둘째, 그냥하는 추가하려면 웹보기 : 해당 페이지가 로딩 완료되면

webview.setWebViewClient(new CustomWebViewClient()); 

, 그것은 다시 리디렉션합니다 원래 페이지로

+0

사용자의 Facebook 사용 권한을 얻으려면 어떻게해야합니까? 그래서 내가 원하는 것은 https : //www.facebook.com/dialog/oauth가 아닌 권한 페이지에서 확인 버튼을 누르면 원래 URL로 리디렉션됩니다. –

+0

@jincyabraham 해결책을 찾았습니까? 나는 같은 문제가있다 – Marc

+0

@ Marc 아래 솔루션을 시도 –

2

정확히 그 때 내가 무슨 짓을했는지는 모르지만 문제는 해결되었습니다. 나는 당신에게 코드를 줄 것이다. 내가 말할 수있는 것과 있도록 :

WebView browser,mWebviewPop; 
private void open(){ 
    browser = (WebView)findViewById(R.id.webView1); 
    browser.getSettings().setLoadsImagesAutomatically(true); 
    browser.getSettings().setJavaScriptEnabled(true); 
    browser.getSettings().setAppCacheEnabled(true); 
    browser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
    browser.getSettings().setSupportMultipleWindows(true); 
    browser.setWebViewClient(new MyBrowser()); 
    browser.setWebChromeClient(new MyCustomChromeClient()); 
    mContext=this.getApplicationContext(); 
    browser.loadUrl(target_url); 
    MainActivity.this.progressBar.setProgress(0); 
    browser.setDownloadListener(new DownloadListener() { 
     public void onDownloadStart(String url, String userAgent, 
            String contentDisposition, String mimetype, 
            long contentLength) { 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      startActivity(intent); 
     } 
    }); 
} 

private class MyBrowser extends WebViewClient { 
    String redirectUrl = "MY URL"; 

    private void noInternet() { 
     WebView webview = (WebView) findViewById(R.id.webView1); 
     RelativeLayout tryAgainLayout = (RelativeLayout)findViewById(R.id.tryAgainLayout); 
     RelativeLayout progressLayout = (RelativeLayout)findViewById(R.id.progressLayout); 
     tryAgainLayout.setVisibility(View.VISIBLE); 
     webview.setVisibility(View.GONE); 
     webview.destroy(); 
     progressLayout.setVisibility(View.INVISIBLE); 
    } 


    public void visible(){ 
     WebView webview = (WebView) findViewById(R.id.webView1); 
     RelativeLayout tryAgainLayout = (RelativeLayout)findViewById(R.id.tryAgainLayout); 
     RelativeLayout progressLayout = (RelativeLayout)findViewById(R.id.progressLayout); 
     tryAgainLayout.setVisibility(View.INVISIBLE); 
     webview.setVisibility(View.INVISIBLE); 
     progressLayout.setVisibility(View.VISIBLE); 
    } 

    public void unvisible(){ 
     WebView webview = (WebView) findViewById(R.id.webView1); 
     RelativeLayout tryAgainLayout = (RelativeLayout)findViewById(R.id.tryAgainLayout); 
     RelativeLayout progressLayout = (RelativeLayout)findViewById(R.id.progressLayout); 
     tryAgainLayout.setVisibility(View.INVISIBLE); 
     webview.setVisibility(View.VISIBLE); 
     progressLayout.setVisibility(View.INVISIBLE); 
    } 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     String host = Uri.parse(url).getHost(); 
     if (host.equals(target_url_prefix)) 
     { 
      if(mWebviewPop!=null) 
      { 
       mWebviewPop.setVisibility(View.GONE); 
       baseLayout.removeView(mWebviewPop); 
       mWebviewPop=null; 
      } 
      return false; 
     } 

     if(host.equals("m.facebook.com")) 
     { 
      return false; 
     } 
     view.loadUrl(url); 
     return true; 
    } 

    @Override 
    public void onReceivedError(WebView view, int errorCode, 
           String description, String failingUrl) { 
     noInternet(); 
    } 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     visible(); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     unvisible(); 
     System.out.println("\n" +view.getUrl()); 
     if(url.startsWith("https://m.facebook.com/v2.1/dialog/oauth")){ 
      if(mWebviewPop!=null) 
      { 
       mWebviewPop.setVisibility(View.GONE); 
       baseLayout.removeView(mWebviewPop); 
       mWebviewPop=null; 
      } 
      view.loadUrl(redirectUrl); 
      return; 
     } 
     super.onPageFinished(view, url); 
    } 
} 

private class MyCustomChromeClient extends WebChromeClient 
{ 

    @Override 
    public boolean onCreateWindow(WebView view, boolean isDialog, 
            boolean isUserGesture, Message resultMsg) { 
     mWebviewPop = new WebView(mContext); 
     mWebviewPop.setVerticalScrollBarEnabled(false); 
     mWebviewPop.setHorizontalScrollBarEnabled(false); 
     mWebviewPop.setWebViewClient(new MyBrowser()); 
     mWebviewPop.getSettings().setJavaScriptEnabled(true); 
     mWebviewPop.getSettings().setSavePassword(false); 
     mWebviewPop.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
       ViewGroup.LayoutParams.MATCH_PARENT)); 
     baseLayout.addView(mWebviewPop); 
     WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; 
     transport.setWebView(mWebviewPop); 
     resultMsg.sendToTarget(); 

     return true; 
    } 

    @Override 
    public void onCloseWindow(WebView window) { 
    } 

    @Override 
    public void onProgressChanged(WebView view, int newProgress) { 
     MainActivity.this.setValue(newProgress); 
     super.onProgressChanged(view, newProgress); 
    } 
} 
+0

감사합니다. 내 코드 같아. 'url.startsWith ("https://m.facebook.com/v2.1/dialog/oauth")'가 어떻게 권한 대화 상자를 닫지 않는지 이해할 수 없습니다. 나는 그것을 시도 할 것이다. – Marc

0

확인을 찾아보십시오, 여기에 무슨 일이 일어나고 있는지 "가 OAuth를 작동하기위한 두 개의"방법 "이며, 하나는 팝업처럼 ("페이지를 aparent에 "다시 전화 것입니다 로그 인 "이 사라지거나 로그인 페이지로 리디렉션 될 수 있습니다. 성공 또는 실패 (체인 포워드의 종류) 후에 다른 URL (비 팝업 스타일)로 리디렉션 될 수 있습니다. 불행하게도 WebView는 "부모 페이지로의 콜백"스타일에 적합하지 않으므로 두 번째 WebView (여기에서 jincy의 답변 또는 this 참조)와 같은 일부 속임수를 수행해야합니다.

관련 문제