Gir*_*h M 1 java android android-webview oauth-2.0 google-oauth2
我是android开发的新手。尝试在Android网络视图中集成FB和Google+登录。FB登录正常。但是Google登录名不允许登录。我提到了一些链接,但无法成功。
问题是在Gmail中提供了用户名和密码后,我的网站未登录
Google登录无法正常运行的Android Webview应用
Google登录无法正常运行的Android Webview应用
private class MyCustomWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
String host = Uri.parse(url).getHost();
Log.d("Loading URL", url);
if (host.equals(target_url_prefix)) {
// This is my web site, so do not override; let my WebView load
// the page
if (mWebviewPop != null) {
mWebviewPop.setVisibility(View.GONE);
mContainer.removeView(mWebviewPop);
mWebviewPop = null;
}
return false;
}
if (host.contains("m.facebook.com") || host.contains("facebook.co")
|| host.contains("google.co")
|| host.contains("www.facebook.com")
|| host.contains(".google.com")
|| host.contains(".google")
|| host.contains("accounts.google.com/signin/oauth/consent")
|| host.contains("accounts.youtube.com")
|| host.contains("accounts.google.com")
|| host.contains("accounts.google.co.in")
|| host.contains("www.accounts.google.com")
|| host.contains("oauth.googleusercontent.com")
|| host.contains("content.googleapis.com")
|| host.contains("ssl.gstatic.com")
// || host.contains("https://accounts.google.com/signin/oauth/consent")
) {
return false;
}
// Otherwise, the link is not for a page on my site, so launch
// another Activity that handles URLs
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
Log.d("onReceivedSslError", "onReceivedSslError");
super.onReceivedSslError(view, handler, error);
}
@Override
public void onPageFinished(WebView view, String url) {
if (url.startsWith("https://m.facebook.com/v2.7/dialog/oauth")
) {
if (mWebviewPop != null) {
mWebviewPop.setVisibility(View.GONE);
mContainer.removeView(mWebviewPop);
mWebviewPop = null;
}
view.loadUrl("https://www.cbazaar.com");
return;
}
super.onPageFinished(view, url);
}
}
private class UriWebChromeClient 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 MyCustomWebViewClient());
mWebviewPop.setWebChromeClient(new UriWebChromeClient());
mWebviewPop.getSettings().setJavaScriptEnabled(true);
mWebviewPop.clearHistory();
mWebviewPop.clearFormData();
mWebviewPop.clearCache(true);
mWebviewPop.getSettings().setSavePassword(true);
mWebviewPop.getSettings().setSaveFormData(true);
mWebviewPop.getSettings().setUserAgentString(USER_AGENT_FAKE);
builder = new AlertDialog.Builder(MainActivity.this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT).create();
builder.setTitle("");
builder.setView(mWebviewPop);
builder.setButton("close", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
mWebviewPop.destroy();
dialog.dismiss();
}
});
builder.show();
builder.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
/* CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.setAcceptThirdPartyCookies(mWebviewPop,true);
}
*/
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(mWebviewPop);
resultMsg.sendToTarget();
return true;
}
@Override
public void onCloseWindow(WebView window) {
try {
mWebviewPop.destroy();
} catch (Exception e) {
}
try {
builder.dismiss();
} catch (Exception e) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
sum*_*156 19
您必须创建一个自定义 webchromeclient 并处理来自 webview 的弹出窗口。每当需要从网站弹出窗口时,您都必须将其加载到警报对话框中。
public class WebViewActivity extends AppCompatActivity {
private WebView webViewPopUp;
private AlertDialog builder;
private Context globalContext;
private String url = "https://www.bellyfulstore.com/";
private WebView webView;
private String userAgent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
webView = findViewById(R.id.webView);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl(url);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
// Set User Agent
userAgent = System.getProperty("http.agent");
webSettings.setUserAgentString(userAgent + "yourAppName");
// Enable Cookies
CookieManager.getInstance().setAcceptCookie(true);
if(android.os.Build.VERSION.SDK_INT >= 21)
CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
// Handle Popups
webView.setWebChromeClient(new CustomChromeClient());
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(true);
globalContext = this.getApplicationContext();
// WebView Tweaks
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setAppCacheEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSettings.setUseWideViewPort(true);
webSettings.setSaveFormData(true);
webSettings.setEnableSmoothTransition(true);
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
findViewById(R.id.progressBar).setVisibility(View.VISIBLE);
}
public void onPageFinished(WebView view, String url) {
// do your stuff here
findViewById(R.id.progressBar).setVisibility(View.GONE);
}
});
}
class CustomChromeClient extends WebChromeClient {
@Override
public boolean onCreateWindow(WebView view, boolean isDialog,
boolean isUserGesture, Message resultMsg) {
webViewPopUp = new WebView(globalContext);
webViewPopUp.setVerticalScrollBarEnabled(false);
webViewPopUp.setHorizontalScrollBarEnabled(false);
webViewPopUp.setWebChromeClient(new CustomChromeClient());
webViewPopUp.getSettings().setJavaScriptEnabled(true);
webViewPopUp.getSettings().setSaveFormData(true);
webViewPopUp.getSettings().setEnableSmoothTransition(true);
webViewPopUp.getSettings().setUserAgentString(userAgent + "yourAppName");
// pop the webview with alert dialog
builder = new AlertDialog.Builder(WebViewActivity.this).create();
builder.setTitle("");
builder.setView(webViewPopUp);
builder.setButton("Close", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
webViewPopUp.destroy();
dialog.dismiss();
}
});
builder.show();
builder.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
if(android.os.Build.VERSION.SDK_INT >= 21) {
cookieManager.setAcceptThirdPartyCookies(webViewPopUp, true);
cookieManager.setAcceptThirdPartyCookies(webView, true);
}
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(webViewPopUp);
resultMsg.sendToTarget();
return true;
}
@Override
public void onCloseWindow(WebView window) {
//Toast.makeText(contextPop,"onCloseWindow called",Toast.LENGTH_SHORT).show();
try {
webViewPopUp.destroy();
} catch (Exception e) {
Log.d("Destroyed with Error ", e.getStackTrace().toString());
}
try {
builder.dismiss();
} catch (Exception e) {
Log.d("Dismissed with Error: ", e.getStackTrace().toString());
}
}
}
@Override
public void onBackPressed() {
if (webView!=null){
if (webView.canGoBack()){
webView.goBack();
return;
}
}
super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)
}
Google不允许使用WebView的默认实现。因此,您需要为WebView设置自定义User-Agent:
webView.getSettings().setUserAgentString("YourAppName");
Run Code Online (Sandbox Code Playgroud)
您可以使用任何字符串代替YourAppName。
迟到的答案,但将来可能会帮助某人。
实际上,Google 会阻止通过嵌入式浏览器发出的 OAuth 请求。所以你可以在你的代码中写一些类似的东西:
public static final String USER_AGENT = "Mozilla/5.0 (Linux; Android 4.1.1; Galaxy Nexus Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19";
mWebView.getSettings().setUserAgentString(USER_AGENT);
Run Code Online (Sandbox Code Playgroud)
或者你可以这样做:
mWebView.getSettings().setUserAgentString("yourAppName");
Run Code Online (Sandbox Code Playgroud)
你应该可以使用谷歌登录。
| 归档时间: |
|
| 查看次数: |
4740 次 |
| 最近记录: |