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.