Как скрыть свой пользовательский менеджер учетных записей из пользовательского интерфейса настроек

Мое требование - добавить контакт в мою пользовательскую учетную запись, и это работает соответственно.

Экран Settings -> + Add account показывает список всех приложений, обеспечивающих управление учетными записями; т. е. там также отображается имя моего приложения. Однако мое требование состоит в том, чтобы не отображать мое приложение в этом списке.

Вот задействованные классы:

AccountManagerActivity.java

public class AccountManagerActivity extends AccountAuthenticatorActivity {
EditText etName, etPhone;
Button btnSave;
String strName, strPhone;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    etName = (EditText) findViewById(R.id.etName);
    etPhone = (EditText) findViewById(R.id.etPhone);
    btnSave = (Button) findViewById(R.id.btnSave);
    btnSave.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if (etName.getText().toString() == null|| etName.getText().toString().equalsIgnoreCase("")|| etPhone.getText().toString() == null|| etPhone.getText().toString().equalsIgnoreCase("")) 
            {
                Toast.makeText(getApplicationContext(),"Enter Name And Phone", Toast.LENGTH_LONG).show();
            } 
            else 
            {
                strName = etName.getText().toString();
                strPhone = etPhone.getText().toString();
                addContact();
                etName.setText("");
                etPhone.setText("");
                Toast.makeText(getApplicationContext(), "Contact Added",Toast.LENGTH_LONG).show();
            }
        }
    });


    AccountManager manager = AccountManager.get(this);

    String accountName = "Contact";
    String password = "NULL";
    String accountType = "com.example.contact";

    final Account account = new Account(accountName, accountType);
    manager.addAccountExplicitly(account, password, null);

    final Intent intent = new Intent();
    intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, accountName);
    intent.putExtra(AccountManager.KEY_ACCOUNTS, accountName);
    intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, accountType);
    intent.putExtra(AccountManager.KEY_AUTHTOKEN, accountType);
    this.setAccountAuthenticatorResult(intent.getExtras());
    this.setResult(RESULT_OK, intent);

}


private void addContact() {
    // TODO Auto-generated method stub

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    int rawContactInsertIndex = ops.size();
    ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
            .withValue(RawContacts.SYNC1, null)
            .withValue(RawContacts.SYNC2, null)
            .withValue(RawContacts.SYNC3, null)
            .withValue(RawContacts.SYNC4, null)
            .withValue(RawContacts.ACCOUNT_TYPE,  "com.example.contact")
            .withValue(RawContacts.ACCOUNT_NAME, "contact").build());
    ops.add(ContentProviderOperation
            .newInsert(Data.CONTENT_URI)
            .withValueBackReference(Data.RAW_CONTACT_ID,
                    rawContactInsertIndex)
            .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
            .withValue(Data.SYNC1, null).withValue(Data.SYNC2, null)
            .withValue(Data.SYNC3, null).withValue(Data.SYNC4, null)
            .withValue(StructuredName.DISPLAY_NAME, strName) // Name of the
                                                                // person
            .build());
    ops.add(ContentProviderOperation
            .newInsert(Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,
                    rawContactInsertIndex)
            .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
            .withValue(Phone.NUMBER, strPhone) // Number of the person
            .withValue(Phone.TYPE, Phone.TYPE_MOBILE).build()); // Type of
                                                                // mobile
                                                                // number
    try {
        ContentProviderResult[] res = getContentResolver().applyBatch(
                ContactsContract.AUTHORITY, ops);
    } catch (RemoteException e) {
        Log.e("RemoteException", "" + e);
    } catch (OperationApplicationException e) {
        Log.e("OperationApplicationException", "" + e);
    }
}

}

AccountAuthenticator.java

public class AccountAuthenticator extends AbstractAccountAuthenticator {
private Context mContext;

public AccountAuthenticator(Context context) {
    super(context);
    mContext = context;
    // TODO Auto-generated constructor stub
}

@Override
public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options)
        throws NetworkErrorException {

    return null;
}

@Override
public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
    // TODO Auto-generated method stub
    return null;
}

@Override
public String getAuthTokenLabel(String authTokenType) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
    // TODO Auto-generated method stub
    return null;
}
 }

AuthenticationService.java

public class AuthenticationService extends Service {
   @Override
   public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
       return new AccountAuthenticator(this).getIBinder();
   }
}

Главный фестиваль

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.examples.AccountManager" android:versionCode="1" android:versionName="1.0">

<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_SYNC_STATS" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.READ_SOCIAL_STREAM" />
<uses-permission android:name="android.permission.WRITE_SOCIAL_STREAM" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
    <activity android:name="com.examples.AccountManager.AccountManagerActivity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:name="com.examples.AccountManager.core.AuthenticationService" android:process=":auth">
        <intent-filter>
            <action android:name="android.accounts.AccountAuthenticator" />
        </intent-filter>
        <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator" /> 
    </service> 
</application>
</manifest>

Спасибо за комментарий за комментарием. Я обнаружил, что мы не можем скрыть пользовательский менеджер учетных записей. Я создавал менеджер пользовательских учетных записей, чтобы сохранять контакты в этих учетных записях. Потому что мне нужно сохранять контакты на устройстве/телефоне. Если я укажу имя учетной записи и тип Null, он будет сохранен на устройстве. Но после удаления учетных записей Gmail из учетных записей все контакты также будут удалены. Поэтому, пожалуйста, помогите мне, как сохранить контакты на устройстве, которое не повлияет на учетные записи gmail.

Любая помощь будет оценена. Спасибо.


person Cropper    schedule 13.01.2014    source источник
comment
Я удивлюсь, если это возможно.   -  person CommonsWare    schedule 29.05.2014
comment
Если только вы не работаете с производителем OEM / ПЗУ и не имеете доступа к прямому изменению источника приложения «Настройки».   -  person ozbek    schedule 02.06.2014
comment
Это невозможно сделать, если только вы не используете собственное ПЗУ. Просто подумайте, что вы создадите большую дыру в безопасности системы.   -  person JAC    schedule 03.06.2014
comment
Пожалуйста, помогите мне сохранить контакты в устройстве/телефоне. Если я укажу имя учетной записи и тип Null, он будет сохранен на устройстве. Но после удаления учетных записей Gmail из учетных записей все контакты также будут удалены.   -  person Cropper    schedule 03.06.2014


Ответы (2)


Невозможно изменить приложение «Настройка» напрямую, как сказал @shoe rat, если у вас есть доступ или какая-либо ссылка на производителя OEM / ROM, тогда это может быть возможно.

person Ari    schedule 03.06.2014

К сожалению, вы не можете этого сделать.

Каждый аутентификатор должен быть в этом списке, чтобы держать пользователя в курсе всех служб, к которым он подключен, позволяя ему отключиться в любое время стандартным способом (без необходимости находить кнопку отключения в конкретном приложении/службе).

person Udinic    schedule 30.05.2014
comment
как указано в ссылке developer.android.com/reference/android/accounts/ некоторые учетные записи видны указанному пакету. Я хочу знать, как создать такой тип учетной записи. - person Cropper; 05.09.2014