Chcę zapytać, jaki jest najlepszy sposób uwierzytelnienia użytkownika za pomocą jego konta Google już skonfigurowanego w telefonie. Najpierw zajrzałem do ClientLogin, ale to nie jest to, czego chcę, ponieważ wymaga od użytkowników wprowadzenia loginu/hasła w mojej aplikacji. Mogę to zrobić za pomocą OAuth, ale tam powinienem poprosić użytkownika o podanie swoich danych uwierzytelniających w przeglądarce, co nie jest również korzystne. Chcę używać AccountManager (zauważyłem, że zawiera on metodę getPassword
dla konkretnego konta, ale nie zadziałało to dla mnie), jeśli możliwe jest użycie jakoś AccountManager + ClientLogin lub AccountManager + OAuth, proszę mi powiedzieć. W rezultacie chcę mieć możliwości logowania się do konta użytkownika Google bez pytania o jego login/hasło (z potwierdzeniem na urządzeniu z Androidem oczywiście). Nie jestem pewien, czy jest to możliwe, ale jeśli istnieje jakiś sposób na jego wdrożenie, proszę wskazać mi, jak to zrobić. ..Android: uwierzytelnianie Google
Odpowiedz
od a stackoverflow pytanie w feb2010: Anyway to Authenticate a user using Google Apps in an Android application?
i postu blogu: http://javagwt.blogspot.com/2009/12/authenticating-android-app-to-google.html
Pamiętaj, że różnica jest teraz, że Google robi uwierzytelnianie dwuetapowe teraz więc może trzeba zmodyfikuj niektóre kroki.
Przeczytałem to już ...dokładniej rozumiem, jak to zrobić za pomocą mechanizmu OAuth, który jest dobrym sposobem uwierzytelnienia się z innymi usługami, takimi jak twitter, ale kontami Google już obsługiwanymi w telefonie z Androidem, i chcę anulować ten krok, w którym użytkownik powinien wprowadzić swoje dane uwierzytelniające i odejść tylko potwierdzenie, że moja aplikacja użyje jego konta do pobrania danych ... co jeszcze ... Planuję odzyskać dane nie z silnika aplikacji, ale z zadań Google – endryha
Możesz skorzystać z wbudowanych w AccountManager:
Account[] accounts = accountManager.getAccountsByType("com.google");
Następnie wyciąg z konta, które chcesz od zwracanej listy. Następnym krokiem będzie wywołanie AccountManager.getAuthToken
.
Gdy masz authToken, można przekazać je do API Google pod numerem:
api.setUserToken(token);
w przeciwieństwie do setUserCredentials, które wymagają od użytkownika i hasło.
Tak, można uzyskać dostęp do informacji w accountManager i uwierzytelnić użytkownika za pomocą zarejestrowanego konta Google (na przykład) bez jej wprowadzenia hasła.
poniższy kod jest funkcjonalnie mieszać i łączyć z przykładów przez nick johnson i tencent
początek swojej głównej działalności:
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);
}
}
stworzyć klasę 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;
}
}
korzystania plik manifestu, w pewnym sensie (musi zadeklarować aktywności + uprawnienia):
<?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>
użycie plików layout Nick Johnson, że można pobrać here
Kiedy próbuję tego, pojawia się błąd, że getResult() nie może uruchom na głównym wątku z tej linii: Bundle authTokenBundle = accountManagerFuture.getResult(); Pracuję nad ustaleniem, dlaczego i jak rozwiązać ten problem. –
Sprawdź "auth" przykładowy projekt w Android SDK, robi dokładnie to.
- 1. Google AppEngine: niestandardowe uwierzytelnianie
- 2. Uwierzytelnianie Siteminder i Android
- 3. Uwierzytelnianie interfejsu API Dysk Google
- 4. Uwierzytelnianie na platformie chmurowej Google
- 5. Uwierzytelnianie interfejsu API danych Google
- 6. Gdata python Uwierzytelnianie aplikacji Google
- 7. Uwierzytelnianie NTLM w systemie Android
- 8. Uwierzytelnianie konta usługi Google z trybu macierzystego
- 9. Uwierzytelnianie za pomocą Google przy użyciu OpenOAuthProvider
- 10. Uwierzytelnianie i autoryzacja Google wśród ich aplikacji
- 11. Jak naprawić Mapy Google "Uwierzytelnianie nie powiodło się na serwerze"?
- 12. jak android downloadManager zrobić podstawowe uwierzytelnianie http
- 13. Uwierzytelnianie serwera Microsoft ISA w systemie Android
- 14. Uwierzytelnianie Androida za pomocą Google OpenID. Co następne?
- 15. Uwierzytelnianie i uwierzytelnianie Vaadin
- 16. Jak zintegrować Google Plus i uwierzytelnianie Facebooka w ramach tej samej aktywności projektu Android?
- 17. Android google translate API
- 18. Uwierzytelnianie Passport.js nie działa
- 19. Uwierzytelnianie za pomocą interfejsu API Google za pomocą konta AccountManager
- 20. Niestandardowe uwierzytelnianie dla Google Cloud Endpoints (zamiast OAuth2)
- 21. Uwierzytelnianie w aplikacji Google Engine z urządzenia z systemem iOS
- 22. uwierzytelnianie OAuth 2.0 (google api) z aplikacji komputerowej WPF?
- 23. Uwierzytelnianie konta usługi Google Cloud na obrazie dokowanego
- 24. Jak zintegrować uwierzytelnianie firebase z punktami końcowymi silnika aplikacji Google
- 25. Android API dla Google Drive?
- 26. Android Google Analytics i wymiary
- 27. Google Analytics Android nie działa
- 28. Android Google Fit onConnectionFailed() SIGN_IN_REQUIRED
- 29. Android Google Analytics błędach integracja
- 30. Android - Google Map nie wyświetla
byłoby miło, gdybyś głosował na poprawną odpowiedź na swoje pytanie. lub, jeśli nikt nie odpowiada twoim potrzebom, skomentował je. sprawia, że my, respondenci (skomentowałeś w tym czasie) czujemy się docenieni za nasze wysiłki, aby ci pomóc. :) –