Нет опции Изменить для моего приложения созданные контакты, экспортированные в родные контакты в телефонной книге - PullRequest
0 голосов
/ 11 июня 2019

Я работаю над приложением, которое позволяет вам создать контакт в приложении, и вы можете экспортировать его в собственную базу данных контактов с помощью поставщика контактов, а также я синхронизирую свои контакты с сервером с помощью моего приложения.

Я использую SyncAdapter для реализации двухсторонней синхронизации контактов. Я создал учетную запись с AccountName и AccountType, используя AuthenticatorService

public class AuthenticationService extends Service {

    private Authenticator mAuthenticator;

    public AuthenticationService() {
        mAuthenticator = new Authenticator(this);
    }


    public class Authenticator extends AbstractAccountAuthenticator {
        // Simple constructor
        public Authenticator(Context context) {
            super(context);
        }
        @Override
        public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
            return null;
        }

        @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 {
            return null;
        }

        @Override
        public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
            return null;
        }

        @Override
        public String getAuthTokenLabel(String authTokenType) {
            return null;
        }

        @Override
        public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
            return null;
        }

        @Override
        public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException {
            return null;
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mAuthenticator.getIBinder();
    }
}

Ниже мой authenticator.xml

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accountType="com.contacts.example"
    android:icon="@drawable/ico_reply_all_svg"
    android:smallIcon="@drawable/ic_launcher_background"
    android:label="@string/app_name"/>

Ниже приведены мои ContactSyncAdapterService

public class ContactSyncService extends Service {

    private static SyncAdapterImpl sSyncAdapter = null;
    private static final Object sSyncAdapterLock = new Object();
    private static Context mContext;
    private static ContentResolver cr;

    private static class SyncAdapterImpl extends AbstractThreadedSyncAdapter {


        public SyncAdapterImpl(Context context,ContentResolver c) {
            super(context, true);
            mContext = context;
            cr = c;
        }

        @Override
        public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
            Log.d("TEST", "onPerformSync Called");
            // run sync with server
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        synchronized (sSyncAdapterLock) {
            if(sSyncAdapter == null) {
                sSyncAdapter = new SyncAdapterImpl(getApplicationContext(), getContentResolver());
            }
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return sSyncAdapter.getSyncAdapterBinder();
    }
}

и syncadapter.xml

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:contentAuthority="com.android.contacts"
    android:accountType="com.contacts.example"
    android:userVisible="true"
    android:supportsUploading="true"
    android:allowParallelSyncs="false"
    android:isAlwaysSyncable="true"/>

Ниже показано, как я экспортирую свои контакты в собственную базу контактов с помощью моего accountNameи accountType

public void addContact() {

        ArrayList<ContentProviderOperation> ops =
                new ArrayList<ContentProviderOperation>();

        int rawContactInsertIndex = ops.size();
        ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
                .withValue(RawContacts.ACCOUNT_TYPE, "com.contacts.example")
                .withValue(RawContacts.ACCOUNT_NAME, "dummyaccount1")
                .withValue(RawContacts.RAW_CONTACT_IS_READ_ONLY, "0")
                .build());

        ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
                .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
                .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
                .withValue(StructuredName.DISPLAY_NAME, "DoomsDay2")
                .withValue(Data.IS_READ_ONLY, 0")
                .build());
        try {
            getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

Ниже приведен код создания учетной записи:

public static Account CreateSyncAccount(Context context) {

        public static final String ACCOUNT_TYPE = "com.contacts.example";
        // The account name
        public static final String ACCOUNT_NAME = "dummyaccount1";
        // Create the account type and default account
        Account newAccount = new Account(
                ACCOUNT_NAME, ACCOUNT_TYPE);
        // Get an instance of the Android account manager
        AccountManager accountManager =
                (AccountManager) context.getSystemService(
                        ACCOUNT_SERVICE);
        /*
         * Add the account and account type, no password or user data
         * If successful, return the Account object, otherwise report an error.
         */
        if (accountManager.addAccountExplicitly(newAccount, null, null)) {
            /*
             * If you don't set android:syncable="true" in
             * in your <provider> element in the manifest,
             * then call context.setIsSyncable(account, AUTHORITY, 1)
             * here.
             */
        } else {
            /*
             * The account exists or some other error occurred. Log this, report it,
             * or handle it internally.
             */
        }
        return newAccount;
    }

Ниже приведена проблема, с которой сталкиваются:

  1. Экспортированный контакт виден вприложение родных контактов.Но я не могу редактировать эти контакты с помощью родного приложения контактов.Просто нет возможности редактировать.В нем говорится, что они доступны только для чтения.
  2. Я хочу отредактировать эти контакты в собственном приложении и запустить syncadapter, чтобы я мог получить эти измененные контакты обратно в мое приложение и, следовательно, на сервер.
  3. Естьэто конкретные OEM?Я пробовал на разных устройствах, но поведение такое же.
  4. Возможно ли это вообще?Мы можем редактировать только те контакты учетной записи, которые добавлены устройством с помощью Добавить учетную запись (как мы добавляем для контактов Google)?

Пожалуйста, помогите мне решить эту проблему !!Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...