【问题标题】:Contacts API editing Groups联系人 API 编辑组
【发布时间】:2018-02-01 10:20:20
【问题描述】:

我正在尝试编辑组标题和备注,

编辑标题适用于系统组用户创建的组

虽然备注列仅在系统组(例如“联系人”、“朋友”、“家人”、“同事”)时才会保留, 我假设它要么不保存 用户创建的组 的注释,要么在 notes 列 中被 title 列 内容覆盖。 p>

如何在联系人组中使用备注栏?有没有其他方法来存储组的附加信息? 这是我的代码 sn-p:

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

                ContentProviderOperation.Builder op = 
     ContentProviderOperation.newUpdate(ContactsContract.Groups.CONTENT_URI)
                    .withSelection(ContactsContract.Groups._ID + "="+group.getId(), null)
                    .withValue(ContactsContract.Groups.TITLE, group.getTitle());

                HashMap<String, String> notes = group.getNotes();
                if(notes!=null && notes.size()>0){
                    op = op.withValue(ContactsContract.Groups.NOTES, new Gson().toJson(group.getNotes()));
                }

                ops.add(op.build());
                try {
                    getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
                } catch (RemoteException e) {
                    e.printStackTrace();
                } catch (OperationApplicationException e) {
                    e.printStackTrace();
                }

【问题讨论】:

    标签: android contacts android-contacts


    【解决方案1】:

    希望这个解决方案对你有用,似乎对我有用。

    我用过ContentResolver.update()方法。

    我假设它要么不保存用户创建的组的注释,要么不保存注释列中的标题列内容。

    我能够使用以下代码更新用户创建的组的注释。

    如何在联系人组中使用备注栏?

    您可以使用注释列保存任何 TEXT 值,因为它在 sqlite 中定义为 TEXT 类型。见ContactsContract.Groups.NOTES

    (在 Google Pixel XL、Oreo 8.0.0 上测试)

        public class MainActivity extends AppCompatActivity {
    
        private Cursor mCursor;
        private SimpleCursorAdapter adapter;
        private ListView lvGroups;
    
        @Override
        protected void onDestroy() {
            if (mCursor != null)
                mCursor.close();
            super.onDestroy();
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            lvGroups = findViewById(R.id.lvGroups);
            checkAndRequestPermission();
    
        }
    
        private void checkAndRequestPermission() {
            if (PermissionChecker.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PermissionChecker.PERMISSION_GRANTED) {
                loadGroups();
            } else {
                ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS}, 123);
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            boolean isGranted = true;
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] == PermissionChecker.PERMISSION_DENIED)
                    isGranted = false;
            }
            if (isGranted)
                loadGroups();
            else
                ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS},123);
        }
    
        private void loadGroups() {
            mCursor = getContentResolver().query(ContactsContract.Groups.CONTENT_URI,null,ContactsContract.Groups.GROUP_IS_READ_ONLY + " = 0",null, ContactsContract.Groups.TITLE);
    
            adapter = new SimpleCursorAdapter(this, R.layout.contact_group_item, mCursor, new String[] {
                    ContactsContract.Groups.TITLE,
                    ContactsContract.Groups._ID,
                    ContactsContract.Groups.ACCOUNT_NAME,
                    ContactsContract.Groups.ACCOUNT_TYPE,
                    ContactsContract.Groups.AUTO_ADD,
                    ContactsContract.Groups.GROUP_IS_READ_ONLY,
                    ContactsContract.Groups.GROUP_VISIBLE,
                    ContactsContract.Groups.SOURCE_ID,
                    ContactsContract.Groups.NOTES},
                    new int[] {
                            R.id.text1,
                            R.id.text2,R.id.text3, R.id.text4, R.id.text5, R.id.text6, R.id.text7, R.id.text8, R.id.text9}, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
    
            lvGroups.setAdapter(adapter);
    
            lvGroups.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Cursor cursor = adapter.getCursor();
                    cursor.moveToPosition(position);
    
                    int groupId = cursor.getInt(cursor.getColumnIndex(ContactsContract.Groups._ID));
                    ContentValues contentValues = new ContentValues();
                    contentValues.put(ContactsContract.Groups.NOTES,"My test Notes");
                    getContentResolver().update(ContactsContract.Groups.CONTENT_URI, contentValues, ContactsContract.Groups._ID + " = " + groupId, null);
                    adapter.notifyDataSetChanged();
                }
            });
    
        }
    }
    

    【讨论】:

    • 感谢 mate 的努力,但无论您使用 update() 还是 applybatch(),它都会给出完全相同的行为,此外,我注意到它是随机的,对于某些组,它会保留值,而对于其他人它只是重置,也不会将笔记同步到其他设备。
    【解决方案2】:

    NOTES 字段是一个字符串,看起来您正试图为其设置一个 JSON 对象。

    检查这是否适合您:

    if (notes!=null && notes.size()>0) {
        op = op.withValue(ContactsContract.Groups.NOTES, "TEST STRING!");
    }
    

    如果是这样,您需要从JSON 对象中提取您需要的实际字符串,这取决于您的JSON 的格式。

    【讨论】:

    • FYKI new Gson().toJson(group.getNotes()) 返回一个字符串。
    猜你喜欢
    • 2011-03-11
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多