Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to hide my custom Acount Manager from Settings UI

My requirement is to add contact to my custom account and this is working accordingly.

The Settings -> + Add account screen shows the list of all applications which provides account management; i.e., my application name is also shown there. However, my requirement is not to display my application on that list.

Here are the classes involved:

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

MainFest

<?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>

Thanks for comment by comment I found that we can't hide custom Account Manager. I was creating Custom Account manager to save contacts in that accounts.becouse I need to save contacts in Device/Phone. If I give Account Name And Type Null than It will save in Device But after removing Gmail Accounts From Acounts Than All Contact will also remove. So please help me how to Save Contacts In device which will not get any affect from gmail accounts.

Any help will be appreciated. Thanks.

like image 404
Cropper Avatar asked Jan 13 '14 10:01

Cropper


2 Answers

Unfortunately, you can't do that.

Every authenticator needs to be on that list, to keep the user aware to all the services he's connected to, allowing him to disconnect anytime with a standard way (not needing to find the disconnect button on a specific app/service).

like image 52
Udinic Avatar answered Oct 02 '22 06:10

Udinic


It is not possible to modify Setting app directly, as said by @shoe rat if you have access or any link to OEM/ROM maker then it might be possible.

like image 43
Ari Avatar answered Oct 02 '22 05:10

Ari