Articles of android contentresolver

原始SQLite游标上的registerContentObserver()

我见过的所有使用registerContentObserver()的例子都是通过ContentProvider接口完成的。 但是Cursor有一个registerContentObserver()调用,所以我想也许Android人们已经把一些深层魔法放在一起,当活动结果集中的一行改变时,它允许在SQLite游标上获得更新。 我做错了,或者没有这样的魔法。 这是我正在使用的代码,期望当我点击按钮更新第1行中的值时,我会得到一个onChange()回调。 有任何想法吗? public class MainActivity extends Activity { private static final String DATABASE_NAME = “test.db”; public static final String TAG = “dbtest”; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button make = (Button)findViewById(R.id.btn_make_record); make.setOnClickListener(new OnClickListener() { public void onClick(View v) { MyOpenHelper […]

当为给定的URI调用ContentResolver.notifyChange()时,ContentObservers是否会通知此URI的后代URI?

一个有希望直截了当的问题:当为给定的URI调用ContentResolver.notifyChange() , ContentObserver是否ContentObserver通知此URI的后代 URI? 例如,假设我有一个游标设置来观察特定资源的URI: Uri uriA = Uri.parse(“content://” + AUTHORITY + “/orders/21”); cursor.setNotificationUri(getContext().getContentResolver(), uriA); 然后我通知ContentResolver对此URI的祖先进行更改(例如,因为我删除了所有订单): Uri uriB = Uri.parse(“content://” + AUTHORITY + “/orders”); getContext().getContentResolver().notifyChange(uriB, null); 我的Cursor ,注册观察uriA ,会被通知吗?

我想获得whatsApp profilepicture但只获取名称和contactnumber?

我想获取WhatsApp个人资料图片和编号,但是使用contentResolver我将使用以下代码段获取名称和编号。 private void showContactWhatsApp(){ ContentResolver cr = getContentResolver(); Cursor contactCursor = cr.query( ContactsContract.RawContacts.CONTENT_URI, new String[]{ContactsContract.RawContacts._ID, ContactsContract.RawContacts.CONTACT_ID}, ContactsContract.RawContacts.ACCOUNT_TYPE + “= ?”, new String[]{“com.whatsapp”}, null); ArrayList myWhatsappContacts = new ArrayList(); if (contactCursor != null) { if (contactCursor.getCount() > 0) { if (contactCursor.moveToFirst()) { do { //whatsappContactId for get Number,Name,Id ect… from ContactsContract.CommonDataKinds.Phone String whatsappContactId = contactCursor.getString(contactCursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID)); if […]

我可以使用ContentResolver.query()执行此Android查询吗? (LEFT JOIN和CASE)

我想在Android上执行以下查询(在伪代码中): SELECT C.ID, C.NAME, CASE ISNULL(G.GROUPID,0) = 0 THEN 0 ELSE 1 END INGROUP FROM CONTACTS C LEFT JOIN GROUPMEMBERSHIP G ON G.CONTACTID = C.ID AND G.GROUPID = ? 我希望通过默认的Contacts ContentProvider选择系统通讯录中所有联系人的ID和名称,以及指示联系人是否是组成员的0/1字段? 。 我当然可以很容易地获得所有联系人,然后在我的Adapter类中单独循环并查询成员资格,但我想要执行两个查询,因为一个外部联接查询将产生更好的性能。 我可以使用标准的高级字符串投影和ContentResolver.query()方法吗? 或者这种查询是否需要深入研究更直接的SQL执行?

如何在android中以编程方式删除联系人

我尝试以下代码删除指定号码的联系人: private void removeContact(Context context, String phone) { //context.getContentResolver().delete(Contacts.Phones.CONTENT_URI, phone, null); context.getContentResolver().delete(Contacts.Phones.CONTENT_URI, Contacts.PhonesColumns.NUMBER+”=?”, new String[] {phone}); } 但是我得到了这个例外: java.lang.UnsupportedOperationException: Cannot delete that URL: content://contacts/phones at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:130) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:110) at android.content.ContentProviderProxy.delete(ContentProviderNative.java:362) at android.content.ContentResolver.delete(ContentResolver.java:386) 你能告诉我如何解决我的问题吗? 谢谢。

Android联系人提供商仅获取所有电子邮件的电话联系人

我需要获取所有手机联系人及其电子邮件地址和照片uri: 这就是我在做什么: private void getContacts() { ContentResolver cr = getContentResolver(); Cursor cur = cr.query(Contacts.CONTENT_URI, null, null, null, Contacts.DISPLAY_NAME); if (cur.getCount() > 0) { while (cur.moveToNext()) { // if // (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) // > 0) { Contact contact = new Contact(); String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); Uri uri = getContactPhotoUri(Long.parseLong(id)); // set photoUri contact.setContactPhotoUri(uri); // set name contact.setContactName(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); […]

getContentResolver()如何工作?

我在互联网上观看了有关ContentProvider的课程,演示了如何定义和使用ContentProvider 。 我对使用名为getContentResolver()的方法感到困惑。 这种方法有什么回报? 我的ContentProvider没有实例化,代码只写了getContentProvider().query() 。 我不明白ContentProvider工作原理。

cursor.setNotificationUri()用于什么?

我在本教程中研究了如何使用ContentProviders和Loaders 我怎么看:我们有一个ListView , SimpleCursorAdapter和CursorLoader的Activity 。 我们还实现了ContentProvider 。 在一个Activity我们可以调用getContentResolver().insert(URI, contentValues); 点击按钮。 在我们的ContentProvider实现中,在insert()方法的末尾,我们调用getContentResolver().notifyChange(URI, null); 我们的CursorLoader将收到消息,它应该重新加载数据并更新UI。 此外,如果我们在SimpleCursorAdapter使用FLAG_REGISTER_CONTENT_OBSERVER ,它也将接收消息,并且将调用其onContentChanged()方法。 因此,如果我们插入,更新或删除数据,我们的ListView将会更新。 Activity.startManagingCursor(cursor); 不推荐使用cursor.requery() ,所以我没有看到cursor.setNotificationUri()任何实践意义。 我查看了setNotificationUri()方法的源代码,发现它在方法中调用了mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver) 。 CursorLoader也是这样做的。 最后,游标将接收消息,并在Cursor内部调用以下方法: protected void onChange(boolean selfChange) { synchronized (mSelfObserverLock) { mContentObservable.dispatchChange(selfChange, null); // … } } 但我无法理解这一点。 所以我的问题是: 我们为什么要在ContentProvider实现的query()方法中调用cursor.setNotificationUri() ?

关于如何从URI获取Exif数据的最终答案

这里已经讨论了很多问题,主要是不同的结果,并且由于API的变化和不同types的URI, 没有明确的答案 。 我自己没有答案,但让我们谈谈它。 ExifInterface有一个接受filePath构造函数。 这本身很烦人,因为现在不鼓励依赖路径 – 你应该使用Uri和ContentResolver 。 好。 我们的Uri名为uri可以从onActivityResult的意图中检索出来(如果您使用ACTION_GET_CONTENT从图库中选择图片),或者可以是我们之前拥有的Uri (如果您从相机中选择图片并调用intent.putExtra(MediaStore.EXTRA_OUTPUT, uri) )。 API <19 我们的uri可以有两种不同的模式: 来自相机的Uris大多数都有一个file:// schema。 那些很容易治疗,因为他们坚持这条道路。 你可以调用new ExifInterface(uri.getPath()) ,你就完成了。 来自画廊或其他内容提供商的Uris通常有一个content://界面。 我个人不知道那是什么,但让我发疯。 据我所知,第二种情况应该使用Context.getContentResolver()获得的ContentResolver 。 以下适用于我测试的所有应用程序,无论如何: public static ExifInterface getPictureData(Context context, Uri uri) { String[] uriParts = uri.toString().split(“:”); String path = null; if (uriParts[0].equals(“content”)) { // we can use ContentResolver. // let’s query […]

ContentResolver notifyChange方法是否也通知Uri的细节?

在应用数据期间,我使用了Uri notifyChange 。 比方说我通知content://com.package.my/items 。 我也有详细的Activity ,显示来自content://com.package.my/items/1数据。 Uri被通知的情况下,是否会通知'一般' Uri结果?