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,你解决这个问题了吗,请告诉我结果?