2017-10-17 19 views
1

J'ai besoin d'utiliser WebView dans mon application Android pour voir certains sites. Et sur les sites, il est possible d'avoir un login via google plus. A lire plusieurs tutoriels et dans le résultat que j'ai le code suivant:Faire une connexion via google plus dans un WebView

mon fichier 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> 

ma classe d'activité:

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(); 
     } 
    } 
} 

Et toujours après cliquage auth j'ai erreur: « Erreur : disallowed_useragent ". Je lis des tutoriels, mais il n'y a pas de solution à ce problème. Alors, aidez-moi s'il vous plaît, comment résoudre cette erreur? Si je dois utiliser google plus sdk pour auth, comment envoyer un token utilisateur à webview? Ou y a-t-il une autre solution?

+0

Je ne suis pas sûr mais je pense qu'il vous manque l'agent utilisateur de votre configuration webivew. Suivez ce lien et ajoutez un agent utilisateur approprié à votre webview. https://mobiforge.com/research-analysis/webviews-and-user-agent-strings –

+0

J'ai essayé d'ajouter de nombreuses variantes de useragents mais cela ne fonctionne pas :( –

Répondre

0

Comme écrit ici en 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”

Vous devez utiliser Google signe dans api.

+0

Hm ... Mais si je veux utiliser webview pour surfer certains sites avec google auth? Est-il impossible de le faire? Ou peut-être puis-je utiliser google auth puis donner le jeton de l'utilisateur à la webview pour un traitement ultérieur? –