【问题标题】:Intent to go to settings page for specific account打算转到特定帐户的设置页面
【发布时间】:2015-08-07 22:48:53
【问题描述】:

使用以下众所周知的代码,用户被带到设备上帐户的整体 Android 设置页面:

startActivity(new Intent(Settings.ACTION_SYNC_SETTINGS));

如果该帐户属于我的应用程序,是否有一个等效项可以将用户直接带到特定帐户的设置(请参见下面的屏幕截图)?

【问题讨论】:

标签: android android-intent android-settings


【解决方案1】:

如果该帐户属于我的应用程序

那是,我想,你的意思是你提前知道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 实现可能随时更改。
  • 上面的代码没有经过广泛的测试。事实上,它仅在单个目标设备(带有 Lollipop 的 Galaxy S5)上进行了测试。
  • "android.settings.ACCOUNT_SYNC_SETTINGS" 操作可能不适用于所有设备和 Android 版本。因此,请防范可能的故障并寻找替代措施。
  • 如果目标用户在一台设备上不能拥有多个帐户,您实际上可能想要使用 getAccountsByType("com.myTLD.myApp"),而不是 getAccounts(),并且只需使用返回数组中的第一个元素。
  • 如果您知道account name,您可能希望利用该信息进一步调整 if 子句以满足您的需要。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多