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
risposta
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.
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
È 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.
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
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. –
Controllare il progetto di esempio "auth" nel SDK di Android, che fa esattamente questo.
- 1. Autenticazione Google Cloud Storage
- 2. Autenticazione Android con Google OpenID. Cosa succederà?
- 3. Autenticazione Google javascript
- 4. Autenticazione Google con nodejs
- 5. Autenticazione API Google Drive
- 6. Autenticazione dell'API dati Google
- 7. Autenticazione NTLM in Android
- 8. API Google Realtime senza autenticazione Google
- 9. Python Gdata Autenticazione Google Apps
- 10. Google Reader Problema di autenticazione
- 11. Android console: autenticazione necessaria
- 12. Autenticazione facebook Android
- 13. Autenticazione Siteminder e Android
- 14. autenticazione google/apis/drive_v2 sulla nuova autenticazione di google Drive. Spero anche di evitare la frustrazione con google-api-client
- 15. Cambia utente con Firebase Autenticazione utente Google
- 16. Nome utente dell'API Google Drive + autenticazione password
- 17. Autenticazione richiesta per l'app pubblicata Google Play
- 18. Richiesta Https, autenticazione su Android
- 19. Come richiedere informazioni sull'app da Google Play Store senza autenticazione
- 20. Autenticazione del client su Cloud Endpoint senza accesso all'account Google
- 21. autenticazione di Google con un server back-end richiesto Scopes
- 22. Come risolvere Google Maps "Autenticazione fallita sul server"?
- 23. Errore di accesso all'account Google (autenticazione a due fattori)
- 24. Autenticazione del server back-end di Google Sign-in
- 25. Android Google+ non è in grado di ottenere il codice di autenticazione
- 26. Esiste un modo ufficiale di autenticazione per Google Data API su Android utilizzando gli account AccountManager?
- 27. Autenticazione Firebase non funzionante - msg. "Aggiorna Google Play Services" sull'emulatore (Android)
- 28. Come integrare Google Plus e Facebook Autenticazione insieme nella stessa attività del progetto Android?
- 29. Autenticazione Android Firebase non riuscita: expired_token (token di autenticazione è scaduto)
- 30. Autenticazione Microsoft ISA Server in Android
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. :) –