2010-11-17 11 views
9

Voglio chiedere, qual è il modo migliore per autenticare l'utente con il suo account Google già configurato sul telefono. Ho guardato prima ClientLogin, ma non è quello che voglio perché richiede agli utenti di inserire login/password nella mia applicazione. Posso farlo con OAuth ma dovrei chiedere all'utente di inserire le sue credenziali nel browser anche ciò che non è preferibile. Voglio usare AccountManager (ho osservato che contiene il metodo getPassword per account specifici ma non ha funzionato per me), se è possibile utilizzare in qualche modo AccountManager + ClientLogin o AccountManager + OAuth dimmi per favore. Di conseguenza voglio avere le capacità per accedere con l'account utente di Google senza chiedere il suo login/password (con conferma sul dispositivo Android, ovviamente). Non sono sicuro che sia possibile, ma se esiste un modo per implementare questo per favore indicatemi come. ..Android: autenticazione Google

+0

sarebbe bello se hai votato per una risposta corretta per la tua domanda. o, nel caso in cui nessuno si adatta alle tue esigenze, ha commentato su di loro. ci rende, i rispondenti (hai commentato uno alla volta) si sentono apprezzati per i nostri sforzi per aiutarti. :) –

risposta

0

da una domanda StackOverflow in Feb2010: Anyway to Authenticate a user using Google Apps in an Android application?

e il post articolo del blog: http://javagwt.blogspot.com/2009/12/authenticating-android-app-to-google.html

Ricordate, la differenza ora è che Google fa l'autenticazione a due step ora così potrebbe essere necessario modificare alcuni passaggi.

+0

Ho già letto questo ...per essere più precisi capisco come farlo con il meccanismo OAuth che è un buon modo per autenticarsi con altri servizi come un twitter, ma account Google già supportati nel telefono Android, e voglio omettere quel passaggio in cui l'utente dovrebbe inserire le sue credenziali e lasciare solo conferma che la mia applicazione utilizzerà il suo account per recuperare i dati ... che altro ... ho intenzione di recuperare i dati non dal motore delle app ma dalle attività di google – endryha

3

È possibile utilizzare la configurazione in AccountManager:

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

quindi estrarre l'account che si desidera dalla lista restituita. Il prossimo passo sarebbe chiamare AccountManager.getAuthToken.

Una volta ottenuto l'authToken, puoi passarlo a API di Google chiamando:

api.setUserToken(token); 

in contrasto con le SetUserCredentials che richiedono l'utente e la password.

8

sì, è possibile accedere alle informazioni nell'accountManager e autenticare l'utente utilizzando l'account google registrato (ad esempio) senza inserire la password.

il codice qui sotto è un mix funzionale e partita da esempi da nick johnson e tencent

inizio con la vostra attività principale:

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

creare una classe 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; 
    } 
} 

uso un file manifest, un po 'come questo (deve dichiarare attività + permessi):

<?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> 

utilizzo file di layout di Nick Johnson che è possibile scaricare here

+0

Quando provo questo, ottengo un errore che getResult() non può essere eseguito sul thread principale da questa riga: Bundle authTokenBundle = accountManagerFuture.getResult(); Sto lavorando per capire perché e come risolverlo. –

0

Controllare il progetto di esempio "auth" nel SDK di Android, che fa esattamente questo.

Problemi correlati