我要问,什么是手机上已经配置了谷歌帐户验证用户的最佳方式。 我都在看着ClientLogin的第一,但它不是我想要的,因为它要求用户在我的应用程序输入登录/密码。 我可以用OAuth做到这一点,但我应该让用户在浏览器中输入他的凭据,这也是不可取的。 我想使用的AccountManager(我观察到它包含特定帐户的方法getPassword
但它并没有为我工作),如果有可能使用某种方式的AccountManager +的ClientLogin或+的AccountManager OAuth的请告诉我。在结果,我希望有能力与用户谷歌帐号登录不问他的登录/密码(与确认过程的Android设备上),我不知道这是可能的,但如果存在某种方式来实现这个请点我怎么样。 ..的Android:谷歌认证
回答
从feb2010一个计算器问题: Anyway to Authenticate a user using Google Apps in an Android application?
和文章的博客文章: http://javagwt.blogspot.com/2009/12/authenticating-android-app-to-google.html
记住,现在的区别是,谷歌确实两步认证,现在,所以你可能需要修改一些步骤。
我已经阅读过这个...更具体地说,我明白如何使用OAuth机制来完成此操作,该机制是与其他服务(如Twitter)进行身份验证的好方法,但Android帐户已支持Google帐户,并且我想省略用户应输入其凭据并离开的那一步只是确认我的应用程序将使用他的帐户来检索数据...还有什么...我计划不是从应用程序引擎中检索数据,而是从谷歌任务中检索数据 – endryha 2010-11-17 10:51:21
您可以使用的AccountManager编译:
Account[] accounts = accountManager.getAccountsByType("com.google");
然后提取您从返回的列表中选择所需的帐户。 下一步将打电话给AccountManager.getAuthToken
。
一旦你的的authToken,您可以通过调用传递给谷歌的API:
api.setUserToken(token);
,而不是要求用户和密码setUserCredentials。
是的,您可以访问accountManager中的信息并使用注册的Google帐户(例如)验证用户身份,而无需输入密码。
下面的代码是从实例功能混搭通过nick johnson和tencent
开始与你的主要活动:
package com.tg.auth;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class ZAuth02aActivity extends ListActivity {
protected AccountManager accountManager;
protected Intent intent;
String TAG = "TGtracker";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
accountManager = AccountManager.get(getApplicationContext());
Account[] accounts = accountManager.getAccountsByType("com.google");
this.setListAdapter(new ArrayAdapter<Account>(this, R.layout.list_item, accounts));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Account account = (Account)getListView().getItemAtPosition(position);
Intent intent = new Intent(this, AppInfo.class);
intent.putExtra("account", account);
startActivity(intent);
}
}
创建了AppInfo类:
package com.tg.auth;
import org.apache.http.impl.client.DefaultHttpClient;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerFuture;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class AppInfo extends Activity {
DefaultHttpClient http_client = new DefaultHttpClient();
Activity activity;
String TAG = "TGtracker";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app_info);
activity = this;
}
@Override
protected void onResume() {
super.onResume();
//Log.v(TAG, "resuming activity");
AccountManager accountManager = AccountManager.get(getApplicationContext());
//if result is null, you might not have a valid internet connection
Log.i(TAG, "got token, yipee: "+updateToken(accountManager, true));
}
private String updateToken(AccountManager am, boolean invalidateToken) {
String authToken = "null";
try {
Account[] accounts = am.getAccountsByType("com.google");
AccountManagerFuture<Bundle> accountManagerFuture;
if(activity == null){//this is used when calling from an interval thread
accountManagerFuture = am.getAuthToken(accounts[0], "android", false, null, null);
} else {
accountManagerFuture = am.getAuthToken(accounts[0], "android", null, activity, null, null);
}
Bundle authTokenBundle = accountManagerFuture.getResult();
authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN).toString();
Log.v(TAG, "newToken preinvalidate: "+authToken);
if(invalidateToken) {
am.invalidateAuthToken("com.google", authToken);
authToken = updateToken(am, false);
}
} catch (IOException e) {
Log.e(TAG, "the exception was: "+e.toString());
e.printStackTrace();
}
return authToken;
}
}
使用清单文件,有点像这个(必须声明活动+权限):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tg.auth"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"></uses-permission>
<uses-permission android:name="android.permission.GET_ACCOUNTS"></uses-permission>
<uses-permission android:name="android.permission.USE_CREDENTIALS"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".ZAuth02aActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AppInfo"></activity>
</application>
</manifest>
使用尼克·约翰逊的布局文件,您可以下载here
当我尝试此操作时,出现getResult()不能从这一行在主线程上运行:Bundle authTokenBundle = accountManagerFuture.getResult(); 我正在弄清楚为什么以及如何解决这个问题。 – 2013-02-22 08:20:29
检查在Android SDK中的“权威性”示例项目,它正是这么做的。如果你投票给你的问题一个正确的答案
- 1. 谷歌认证
- 2. 谷歌认证的AspNetCore.Identity
- 3. 谷歌认证的困难
- 4. 更改谷歌默认的认证重定向 - C#(谷歌liblary)
- 5. 谷歌Gmail API - 认证
- 6. 没有Passport.js谷歌+认证
- 7. xcode谷歌认证swift 3
- 8. 谷歌认证服务
- 9. Omniauth认证的路线谷歌
- 10. Django的谷歌,OAuth认证错误
- 11. Facebook的SSO,Android和认证对谷歌的App Engine
- 12. 如何保存谷歌认证的会话之间的android
- 13. 谷歌加上通过社交认证在Android的集成?
- 14. 谷歌应用引擎认证
- 15. 谷歌认证使用azure服务
- 16. 谷歌翻译API认证错误
- 17. 谷歌混合协议认证问题
- 18. JIRA登录与谷歌认证
- 19. 网站谷歌认证与火力
- 20. 谷歌网站管理员API认证
- 21. 谷歌联系人认证Java中
- 22. 谷歌云消息认证错误(401)
- 23. Gdata python谷歌应用程序认证
- 24. 斯威夫特 - 谷歌认证
- 25. android谷歌地图API地图不会加载,认证错误
- 26. 默认标记为Android谷歌MAPVIEW?
- 27. 谷歌云translaet - 认证证书是来自不同项目的
- 28. 经由应用程序脚本谷歌认证与谷歌扩展清单
- 29. 火力地堡和谷歌弹出认证不充分验证
- 30. 谷歌验证码验证
将是很好。或者,如果不符合您的需求,请对它们进行评论。使我们,答复者(当时您已做出评论)对我们为帮助您的努力而感到赞赏。 :) – 2012-12-08 13:28:17