我正在开发一个使用Login to Gmail的应用程序。我浏览了所有教程,在OAuth 2.0
下标记的stackoverflow问题以及google中可用的文档,最后根据官方文档中提供的指南Google OAuth 2.0
sample。我创建了客户端ID以及已安装应用程序所需的所有内容,例如Android。到目前为止,所有内容都运行正常,我致电WebView
以授予用户权限,之后我在Accesstoken
中获得了4/cR7XXXXXXXXXXXXXXX
WebView
之类的内容,并说出Please copy this code,switch to your application and paste it here
之类的内容1}}。我在这里很困惑,我不知道该怎么做,从Webview
回到我的应用程序。在寻找解决方案大约两天但是,我无法得到我的答案问题。这是我被停止的代码。
Main.java
,其中用户有OptionMenu
登录。当用户点击WebView
打开以输入gmail时。
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Main extends Activity {
public static String REQUEST = "https://accounts.google.com/o/oauth2/auth?"
+ "client_id=XXXXXXXXXXX-gxxxx.apps.googleusercontent.com&"
+ "redirect_uri=urn:ietf:wg:oauth:2.0:oob&"
+ "scope=https://mail.google.com/mail/feed/atom&"
+ "response_type=code&" + "access_type=online";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 0:
if (requestCode != RESULT_OK || data == null) {
return;
}
String token = data.getStringExtra("token");
if (token != null) {
}
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.item1:
Intent intent_obj2 = new Intent(Main.this, Webview.class);
intent_obj2.setData(Uri.parse(REQUEST));
startActivityForResult(intent_obj2, 0);
return true;
}
return super.onOptionsItemSelected(item);
}
}
Webview.java
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.view.Window;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class Webview extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_PROGRESS);
final WebView wb_obj = new WebView(this);
setContentView(wb_obj);
wb_obj.getSettings().setJavaScriptEnabled(true);
Intent intent = getIntent();
if (intent.getData() != null) {
wb_obj.loadUrl(intent.getDataString());
}
wb_obj.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
setProgress(newProgress * 10000);
}
});
wb_obj.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
setTitle(url);
System.out.println(url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
System.out.println("in onPageFinsihed");
/*CookieSyncManager.getInstance().sync();
String s_cookie = CookieManager.getInstance().getCookie(url);
if (s_cookie == null) {
System.out.println(s_cookie);
return;
}else{
String web_title = wb_obj.getTitle().toString();
System.out.println("web tile" + web_title);
if (web_title.equalsIgnoreCase("Request for Permission")) {
} else {
String[] s_webtitle = web_title.split("=", 2);
String access_token = s_webtitle[1].toString();
//System.out.println("Access token" + access_token);
startActivity(new Intent(Webview.this, Main.class));
finish();
}*/
}
});
}
@Override
public void onBackPressed() {
super.onBackPressed();
startActivity(new Intent(Webview.this, Main.class));
}
}
根据Webview.java,我调用了finish()
,以便当前活动被杀死,但这是在这个应用程序中发生的,所以我将在onAcitivityResult()
中获得令牌。请分享您的答案谢谢。
答案 0 :(得分:2)
以下步骤需要登录Google。
1 - 使用以下代码
从您的设备中选择一个帐户public static AccountManager accountManager;
accountManager = AccountManager.get(this);
Account[] accounts = accountManager.getAccountsByType("com.google");
2 - 使用以下代码
从所选帐户获取令牌private void onAccountSelected(final Account account) {
accountManager.getAuthToken(account, AUTH_TOKEN_TYPE, null, this, new AccountManagerCallback<Bundle>() {
public void run(AccountManagerFuture<Bundle> future) {
try {
String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
useToken(account, token);
} catch (OperationCanceledException e) {
onAccessDenied();
} catch (Exception e) {
handleException(e);
}
}
}, null);
}
3 - 现在使用用户帐户和令牌验证令牌。您将能够登录谷歌。
注意: 您将从此处Authentication code获取身份验证完整代码,并在需要时将您的Gmail设置为a / c和令牌。现在您可以使用OAuth进行登录。
4 - 重新登录时,您必须使用以下代码
使令牌无效accountManager.invalidateAuthToken("com.google", token);
5 - 无效后,您必须使用以下代码获取新令牌
String newToken = AccountManager.get(this).getAuthToken(new Account(account, "com.google"),
AUTH_TOKEN_TYPE, true, null, null).getResult().getString(AccountManager.KEY_AUTHTOKEN);
AndroidManifest.xml中的6 - 以下添加使用权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
这就是你所需要的,现在享受。
答案 1 :(得分:-1)
考虑使用“localhost:port”作为重定向uri而不是urn:ietf:wg:oauth:2.0:oob&amp; (有关更多详细信息,请参阅https://developers.google.com/youtube/v3/guides/authentication#installed-apps)并将此URL加载到回调中的webview中: public boolean shouldOverrideUrlLoading(WebView视图,String url)。
答案 2 :(得分:-1)
有关使用OAuth2令牌访问Gmail API的替代方法,您可以考虑以下帖子的答案:OAuth and Java (connecting to GMail)。