Android 如何打开特定帐户的帐户设置?

Android 如何打开特定帐户的帐户设置?,android,Android,我知道,通过帐户管理器,我可以访问设备上的帐户列表 Account[] accounts = AccountManager.get(this).getAccounts(); 我也知道,使用android.settings.ACCOUNT\u SYNC\u settings我可以打开特定帐户的同步设置 Intent in=new Intent("android.settings.ACCOUNT_SYNC_SETTINGS"); in.putExtra("account", accounts[3

我知道,通过帐户管理器,我可以访问设备上的帐户列表

 Account[] accounts = AccountManager.get(this).getAccounts();
我也知道,使用android.settings.ACCOUNT\u SYNC\u settings我可以打开特定帐户的同步设置

Intent in=new Intent("android.settings.ACCOUNT_SYNC_SETTINGS");
in.putExtra("account", accounts[3]);

我想做的是打开特定帐户的“帐户设置”,如下所示:

不是这样的:

一般方法: 棘手的是,Android对帐户的定义非常抽象,因此根据您的使用情况,您将遇到没有这些屏幕或有多个屏幕的帐户。这些屏幕可能根本不像首选项/设置屏幕-它们可以是
帐户
验证器定义的任何活动

一般来说,我认为你可以这样做:

  • 使用
    AccountManager
    getAuthenticatorTypes()
    方法。这 将为您提供所有Authenticator描述。取决于 在您的用例中,您可以选择您关心的AuthenticatorDescription 关于(基于“type”值)并进一步调查。

  • AuthenticatorDescription
    将告诉您
    accountPreferencesId
    定义了“系统的层次结构” 要添加到帐户设置页面的首选项屏幕”。 这又定义了一个“PreferenceScreen xml层次结构 包含可调用以管理的首选项屏幕列表 验证者”。

  • 使用
    accountPreferencesId
    AuthenticatorDescription
    解析所需的
    意图,允许
    将用户导航到它们。XML的外观参考
    比如:
    

  • tl;dr-代码: 这里有一个方法可以找到
    活动
    操作/类并启动它。这并不能解释上面提到的首选项XML中可能定义了多个活动。事实上,它并不能解释很多错误场景,当然可以进行优化,但应该作为一个不错的概念证明和起点:

    //somewhere in your app call this
    //com.android.email works to open the email preferences on my Galaxy s4
    startPreferenceActivity("com.android.email");
    
    private void startPreferenceActivity(String type) {
        AccountManager accountManager = AccountManager.get(this);
        AuthenticatorDescription[] descriptions = accountManager.getAuthenticatorTypes();
        AuthenticatorDescription neededDescription = null;
        for (AuthenticatorDescription description : descriptions) {
            if (description.type.contains(type)) {
                neededDescription = description;
                break;
            }
        }
        if (neededDescription != null) {
            String packageName = neededDescription.packageName;
            int prefsId = neededDescription.accountPreferencesId;
            try {
                Resources resources = getPackageManager().getResourcesForApplication(packageName);
                XmlResourceParser xpp = resources.getLayout(prefsId);
                xpp.next();
                String action = null;
                String targetPackage = packageName; //default to the account pref package name...?
                String targetClass = null;
                int eventType = xpp.getEventType();
                while (eventType != XmlPullParser.END_DOCUMENT) {
                    if (eventType == XmlPullParser.START_TAG) {
                        if (xpp.getName().equals("intent")) {
                            int count = xpp.getAttributeCount();
                            for (int i = 0; i < count; i++) {
                                String name = xpp.getAttributeName(i);
                                if (name.equals("action")) {
                                    action = xpp.getAttributeValue(i);
                                } else if (name.equals("targetPackage")) {
                                    targetPackage = xpp.getAttributeValue(i);
                                } else if (name.equals("targetClass")) {
                                    targetClass = xpp.getAttributeValue(i);
                                }
                            }
                        }
                    }
                    eventType = xpp.next();
                }
                if (action != null) {
                    startActivity(new Intent(action));
                } else if (targetClass != null) {
                    startActivity(new Intent(createPackageContext(targetPackage, Context.CONTEXT_IGNORE_SECURITY), Class.forName(targetClass)));
                }
            } catch (PackageManager.NameNotFoundException e) {
    
            } catch (Exception e) {
    
            }
    
        }
    }
    
    //在应用程序中的某个地方调用此
    //com.android.email用于打开我的Galaxy s4上的电子邮件首选项
    StartReferenceActivity(“com.android.email”);
    私有void startPreferenceActivity(字符串类型){
    AccountManager=AccountManager.get(此);
    AuthenticatorDescription[]descriptions=accountManager.getAuthenticatorTypes();
    AuthenticatorDescription needDescription=null;
    用于(Authenticator描述:描述){
    if(description.type.contains(type)){
    所需描述=描述;
    打破
    }
    }
    if(neededDescription!=null){
    字符串packageName=needdescription.packageName;
    int prefsId=neededDescription.accountPreferencesId;
    试一试{
    Resources=getPackageManager().getResourcesForApplication(packageName);
    XmlResourceParser xpp=resources.getLayout(prefsId);
    xpp.next();
    字符串操作=null;
    字符串targetPackage=packageName;//默认为帐户pref package name。。。?
    字符串targetClass=null;
    int eventType=xpp.getEventType();
    while(eventType!=XmlPullParser.END_文档){
    if(eventType==XmlPullParser.START_标记){
    if(xpp.getName().equals(“intent”)){
    int count=xpp.getAttributeCount();
    for(int i=0;i
    您可能有帐户信息数据库,您可以打开它并为其设计类似样式的表单这可以解决您的问题

    谢谢Sam,我有点理解您的方法,但我在我的设备上使用不同的身份验证程序尝试了您的代码,但没有任何结果,根本没有打开任何首选项(我希望至少能打开
    com.google.android.email
    ,我将其视为Nexus上的验证器,但没有附加任何内容…)@LisaAnne你有没有仔细检查代码以确定失败的地方?嗨,Sam,是的,它似乎没有解决
    操作
    ,因为
    操作
    它得到的某种代码似乎不是任何
    操作
    ,实际上它没有启动任何操作Activity@LisaAnne,你解决这个问题了吗,请告诉我结果?