Мое требование - добавить контакт в мою пользовательскую учетную запись, и это работает соответственно.
Экран 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.
Любая помощь будет оценена. Спасибо.