2017-10-17 133 views
1

我需要在我的android應用程序中使用WebView查看一些網站。而在網站上,可以通過google plus進行登錄。一看幾個教程和結果我有下面的代碼:通過谷歌加在WebView登錄

我的XML文件

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="ua.test.testgoogleauth.MainActivity"> 

    <FrameLayout 
     android:id="@+id/webview_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <WebView 
      android:id="@+id/my_webview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 

    </FrameLayout> 

</RelativeLayout> 

我的活動類:

public class MainActivity extends AppCompatActivity { 

    private FrameLayout webViewFrame; 
    private WebView webViewMain; 
    private WebView webViewWindow; 

    private final String URL = "https://some_url_with_google_auth"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     webViewFrame = (FrameLayout) findViewById(R.id.webview_frame); 
     webViewMain = (WebView) findViewById(R.id.my_webview); 

     webViewMain.setWebViewClient(new CustomWebViewClient()); 
     webViewMain.setWebChromeClient(new CustomWebChromeClient()); 
     webViewMain.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 
     webViewMain.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
     webViewMain.getSettings().setJavaScriptEnabled(true); 
     webViewMain.getSettings().setDomStorageEnabled(true); 
     webViewMain.getSettings().setAppCacheEnabled(false); 
     webViewMain.getSettings().setAllowFileAccess(true); 
     webViewMain.getSettings().setSupportZoom(true); 
     webViewMain.getSettings().setSupportMultipleWindows(true); 
     webViewMain.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); 
     webViewMain.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
     webViewMain.getSettings().setLoadWithOverviewMode(true); 
     webViewMain.getSettings().setUseWideViewPort(true); 
     webViewMain.getSettings().setBuiltInZoomControls(true); 
     webViewMain.getSettings().setDisplayZoomControls(false); 

     webViewMain.loadUrl(URL); 
    } 


    private class CustomWebViewClient extends WebViewClient { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
      return false; 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      return false; 
     } 
    } 

    private class CustomWebChromeClient extends WebChromeClient { 
     @Override 
     public boolean onCreateWindow(WebView view, boolean isDialog, 
             boolean isUserGesture, Message resultMsg) { 
      webViewWindow = new WebView(MainActivity.this); 
      webViewWindow.setVerticalScrollBarEnabled(false); 
      webViewWindow.setHorizontalScrollBarEnabled(false); 
      webViewWindow.setWebViewClient(new CustomWebViewClient()); 
      webViewWindow.getSettings().setJavaScriptEnabled(true); 
      webViewWindow.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
        ViewGroup.LayoutParams.MATCH_PARENT)); 
      webViewFrame.addView(webViewWindow); 
      WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; 
      transport.setWebView(webViewWindow); 
      resultMsg.sendToTarget(); 

      return true; 
     } 

     @Override 
     public void onCloseWindow(WebView window) { 
      webViewFrame.removeView(webViewWindow); 
      webViewWindow = null; 
     } 
    } 

    @Override 
    public void onBackPressed() { 
     if (webViewWindow != null) { 
      webViewFrame.removeView(webViewWindow); 
      webViewWindow = null; 
     } else { 
      super.onBackPressed(); 
     } 
    } 
} 

而且之後一直點擊身份驗證按鈕,我有錯誤:「錯誤:disallowed_useragent「。我閱讀教程,但沒有解決這個問題。 那麼,請幫助我,如何解決這個錯誤?如果我必須使用谷歌加sdk身份驗證,如何發送用戶令牌到webview?還是有另一種解決方案?

+0

我不確定,但我認爲您從webivew配置中缺少用戶代理。按照這個鏈接並添加一個合適的用戶代理到你的web視圖。 https://mobiforge.com/research-analysis/webviews-and-user-agent-strings –

+0

我試圖添加許多變體的useragents,但它不工作:( –

回答

0

如這裏在2016年寫的: https://developers.googleblog.com/2016/08/modernizing-oauth-interactions-in-native-apps.html

In the coming months, we will no longer allow OAuth requests to Google in embedded browsers known as 「web-views」

所以,你必須使用谷歌標誌的API。

+0

嗯......但如果我想使用webview衝浪有些網站使用谷歌身份驗證?有沒有辦法做到這一點?或者,也許我可以使用谷歌身份驗證,然後將用戶令牌給webview進一步處理? –