2015-05-26 9 views
6

Con questo codice noto, l'utente è portato alla pagina complessiva impostazioni di Android per gli account sul dispositivo:intenti per andare alla pagina delle impostazioni per conto specifico

startActivity(new Intent(Settings.ACTION_SYNC_SETTINGS)); 

sync settings

Esiste un equivalente che porta l'utente direttamente alle impostazioni per un account specifico (vedi sotto screenshot), a condizione che l'account appartenga alla mia applicazione?

specific account sync settings

+0

Questo può aiutare http://stackoverflow.com/questions/4421527/how-can-i-start-android-application-info-screen-programmatically – yrazlik

+0

@bigO Questo porta l'utente alla pagina delle impostazioni dell'app, non a le impostazioni dell'account per quella app.Grazie comunque. – FWeigl

risposta

2

fornito l'account appartiene alla mia domanda

Questo è, a mio avviso, si intende lo sai account type in anticipo. Se è così, quindi seguire è un possibile approccio per gestire il problema.

Innanzitutto, l'app necessita dell'autorizzazione GET_ACCOUNTS.

<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

Poi, se si dà un'occhiata su onActivityCreated() del AccountSyncSettings (l'attività sul tuo secondo screenshot), si noterà che sembra per "account" chiave nel lancio di fascio intento.

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    Bundle arguments = getArguments(); 
    if (arguments == null) { 
     Log.e(TAG, "No arguments provided when starting intent. ACCOUNT_KEY needed."); 
     finish(); 
     return; 
    } 
    mAccount = (Account) arguments.getParcelable(ACCOUNT_KEY); 
    if (!accountExists(mAccount)) { 
     Log.e(TAG, "Account provided does not exist: " + mAccount); 
     finish(); 
     return; 
    } 
    if (Log.isLoggable(TAG, Log.VERBOSE)) { 
     Log.v(TAG, "Got account: " + mAccount); 
    } 
    mUserId.setText(mAccount.name); 
    mProviderId.setText(mAccount.type); 
} 

Ora, sulla base di questo, si può usare qualcosa come segue per lanciare l'attività per conto specifica:

private static final String ACCOUNT_KEY = "account"; 
private static final String ACTION_ACCOUNT_SYNC_SETTINGS = 
     "android.settings.ACCOUNT_SYNC_SETTINGS"; 

... // lots of code 

Account myAccount = null; 
AccountManager accountManager = AccountManager.get(getApplicationContext()); 
Account[] accounts = accountManager.getAccounts(); 
for (Account account : accounts) { 
    if ("com.myTLD.myApp".equals(account.type)) { 
     myAccount = account; 
     break; 
    } 
} 

if (myAccount != null) { 
    Bundle args = new Bundle(); 
    args.putParcelable(ACCOUNT_KEY, myAccount); 

    Intent intent = new Intent(ACTION_ACCOUNT_SYNC_SETTINGS); 
    intent.putExtras(args); 
    startActivity(intent); 
} 

Ci sono, tuttavia, alcune cose da considerare qui:

  • AccountSyncSettings l'implementazione può essere modificata in qualsiasi momento.
  • Il codice precedente non è stato testato in modo approfondito. Infatti, è stato testato solo su un singolo dispositivo di destinazione (Galaxy S5 con Lollipop).
  • "android.settings.ACCOUNT_SYNC_SETTINGS" l'azione potrebbe non essere disponibile su tutti i dispositivi e le versioni di Android. Quindi, salvaguardare possibili fallimenti e cercare azioni alternative.
  • Invece di getAccounts(), è possibile utilizzare lo getAccountsByType("com.myTLD.myApp") e utilizzare semplicemente il primo elemento dell'array restituito se l'utente di destinazione non può avere più di un account su un dispositivo.
  • Se si conosce account name, è possibile che si desideri sfruttare tali informazioni per ottimizzare ulteriormente la clausola if in base alle proprie esigenze.

Spero che questo aiuti.

Problemi correlati