2011-07-27 7 views
15

Quando si utilizza AccountManager::getAuthTokenByFeatures, viene visualizzata una schermata di richiesta di accesso per consentire all'utente di negare l'accesso all'account. Dopo che un utente consente l'accesso, le chiamate successive (con gli stessi argomenti) restituiscono il token di autenticazione senza richiedere all'utente.Come si impone a AccountManager di mostrare la schermata "Richiesta di accesso" dopo che un utente ha già autorizzato l'accesso?

Come si cancella lo stato per assicurarsi che venga visualizzato il prompt Richiesta di accesso? (Ciò sarebbe utile almeno per scopi di sviluppo, test e dimostrazione.)

risposta

7

L'unica soluzione che ho trovato è quella di cancellare manualmente i dati archiviati negli account di sistema.db. Esegui quanto segue dalla riga di comando per cancellare tutte le concessioni di account sul sistema.

Per l'emulatore:

adb -e shell 'sqlite3 /data/system/accounts.db "delete from grants;"' 

Per un dispositivo (deve essere radicati e avere il binario sqlite3 installato):

adb -d shell 'echo sqlite3 /data/system/accounts.db \"delete from grants\;\" | su' 
+0

eventualmente utile nota per gli altri: potrebbe essere necessario effettuare la scrivibile cartella di sistema, se sqlite3 non è già sul dispositivo, e si bisogno di spingerlo via adb. http://stackoverflow.com/questions/6066030/read-only-file-system-on-android –

+0

Un altro suggerimento: avevo bisogno di chiamare "sqlite" con le virgolette, altrimenti ho ricevuto un errore. Vedi http://stackoverflow.com/questions/13696259/sqlite3-on-android-fails-with-syntax-error-unexpected/13697187#13697187 –

+2

di interesse per coloro che ancora corrono in questo problema più avanti lungo la strada: (1) su Android 4.2 che ha aggiunto il supporto multiutente, il file accounts.db si troverà in una sottodirectory per utente, ad es. /data/system/users/0/accounts.db (2) quando mi sono imbattuto nella necessità di revocare queste autorizzazioni, ho scoperto che la tabella concessioni in /data/system/users/0/accounts.db era vuota. Stavo usando la nuova versione di Google Play Services per ottenere token, e sembrerebbe che memorizzasse le concessioni da qualche altra parte - forse anche nel cloud (!). – Hugh

1

Ho creato un nuovo account che uso per il test. Un nuovo account richiederà sempre la richiesta di accesso. Ricordare di NON consentire l'accesso.

Per verificare la schermata di accesso, modificare la password dell'account da un altro dispositivo/PC.

1

utilizzando Google Play Services:

http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html

Aggiungi https://www.googleapis.com/auth/userinfo.profile alla vostra portata.

Esempio:

String scope="oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile" 

final String token = GoogleAuthUtil.getToken(context, "[email protected]", scope); 

O "forza bruta"

Intent res = new Intent(); 
res.addCategory("account:[email protected]"); 
res.addCategory("scope:oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"); 
res.putExtra("service", "oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"); 
Bundle extra= new Bundle(); 
extra.putString("androidPackageName","com.your.package"); 
res.putExtra("callerExtras",extra); 
res.putExtra("androidPackageName","com.your.package"); 
res.putExtra("authAccount","[email protected]"); 

String mPackage = "com.google.android.gms"; 
String mClass = "com.google.android.gms.auth.TokenActivity"; 
res.setComponent(new ComponentName(mPackage,mClass)); 
startActivityForResult(res,100); 

Ora, quando si revoca l'accesso qui https://accounts.google.com/IssuedAuthSubTokens l'applicazione che si mostra la finestra per il permesso di nuovo nel dispositivo.

0

Nel mio caso quello che dice Benn Sandoval non funziona.

Ho dovuto revocare le autorizzazioni a livello di codice e quindi riconnetterti.

if (googleApiClient != null && !googleApiClient.isConnecting() && googleApiClient.isConnected()){ 

    googleApiClient.clearDefaultAccountAndReconnect(); 
    Plus.AccountApi.revokeAccessAndDisconnect(googleApiClient).setResultCallback(new ResultCallback<Status>() { 
     @Override 
     public void onResult(Status status) { 
      Log.i("google+", "Google+ user access revoked"); 
      googleApiClient.connect(); 
     } 
    }); 
} 

Facendo questo mi è stato sempre chiesto di nuovo per concedere le autorizzazioni a google +

Problemi correlati