2010-11-17 107 views
9

我要问,什么是手机上已经配置了谷歌帐户验证用户的最佳方式。 我都在看着ClientLogin的第一,但它不是我想要的,因为它要求用户在我的应用程序输入登录/密码。 我可以用OAuth做到这一点,但我应该让用户在浏览器中输入他的凭据,这也是不可取的。 我想使用的AccountManager(我观察到它包含特定帐户的方法getPassword但它并没有为我工作),如果有可能使用某种方式的AccountManager +的ClientLogin或+的AccountManager OAuth的请告诉我。在结果,我希望有能力与用户谷歌帐号登录不问他的登录/密码(与确认过程的Android设备上),我不知道这是可能的,但如果存在某种方式来实现这个请点我怎么样。 ..的Android:谷歌认证

+0

将是很好。或者,如果不符合您的需求,请对它们进行评论。使我们,答复者(当时您已做出评论)对我们为帮助您的努力而感到赞赏。 :) – 2012-12-08 13:28:17

回答

0

从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

记住,现在的区别是,谷歌确实两步认证,现在,所以你可能需要修改一些步骤。

+0

我已经阅读过这个...更具体地说,我明白如何使用OAuth机制来完成此操作,该机制是与其他服务(如Twitter)进行身份验证的好方法,但Android帐户已支持Google帐户,并且我想省略用户应输入其凭据并离开的那一步只是确认我的应用程序将使用他的帐户来检索数据...还有什么...我计划不是从应用程序引擎中检索数据,而是从谷歌任务中检索数据 – endryha 2010-11-17 10:51:21

3

您可以使用的AccountManager编译:

Account[] accounts = accountManager.getAccountsByType("com.google"); 

然后提取您从返回的列表中选择所需的帐户。 下一步将打电话给AccountManager.getAuthToken

一旦你的的authToken,您可以通过调用传递给谷歌的API:

api.setUserToken(token); 

,而不是要求用户和密码setUserCredentials。

8

是的,您可以访问accountManager中的信息并使用注册的Google帐户(例如)验证用户身份,而无需输入密码。

下面的代码是从实例功能混搭通过nick johnsontencent

开始与你的主要活动:

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

+0

当我尝试此操作时,出现getResult()不能从这一行在主线程上运行:Bundle authTokenBundle = accountManagerFuture.getResult(); 我正在弄清楚为什么以及如何解决这个问题。 – 2013-02-22 08:20:29

0

检查在Android SDK中的“权威性”示例项目,它正是这么做的。如果你投票给你的问题一个正确的答案