2015-05-26 74 views
6

用下面的衆所周知的代碼,用戶被引導到整個Android設置頁面的設備上的帳戶:意圖去設置頁面特定帳戶

startActivity(new Intent(Settings.ACTION_SYNC_SETTINGS)); 

sync settings

是否有等同於使用戶直接訪問特定帳戶的設置(請參閱下面的截圖),前提是該帳戶屬於我的應用程序?

specific account sync settings

+0

這可能有助於http://stackoverflow.com/questions/4421527/how-can-i-start-android-application-info-screen-programmatically – yrazlik

+0

@bigO這將用戶帶到應用程序的設置頁面,而不是反正該應用程序的帳戶設置。謝謝。 – FWeigl

回答

2

提供的帳戶屬於我的應用程序

那是,我想,你的意思是你事先知道account type。如果是這樣,那麼以下是解決問題的一種可能方法。

首先,該應用需要GET_ACCOUNTS權限。

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

然後,如果你採取的AccountSyncSettings(你的第二個屏幕的活動)onActivityCreated()一看,你會發現,它看起來在啓動意圖束"account"關鍵。

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

現在,基於這一點,你可以使用的東西如下推出針對特定帳戶活動:

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

有,但是,幾件事情需要考慮:

  • AccountSyncSettings實現可能隨時發生變化。
  • 上面的代碼沒有被廣泛測試。事實上,它僅在單個目標設備(Galaxy S5 with Lollipop)上進行了測試。
  • "android.settings.ACCOUNT_SYNC_SETTINGS"操作可能不適用於Android的所有設備和版本。因此,要防範可能的失敗並尋找替代性措施。
  • 而不是getAccounts(),如果目標用戶在設備上不能有多個帳戶,則實際上可能需要使用getAccountsByType("com.myTLD.myApp"),並簡單地使用返回數組中的第一個元素。
  • 如果您知道account name,您可能希望利用該信息進一步調整if子句以符合您的需求。

希望這有助於。