Articles of android contentresolver

如何在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结果?

通过使用Realm库获取光标

我正在使用游标适配器为我的列表视图。 我打算使用内容parsing器来获取游标。 现在我改变了主意,给了它一个学习领域的机会。 我怎样才能通过使用领域获得“光标”对象? 顺便说一句,我也将不胜感激给一些片段来sorting游标。 谢谢。 final class Contact extends RealmObject { private CharSequence mName; public CharSequence getName() { return mName; } public void setName(CharSequence name) { this.mName = name; } } final class ContactListAdapter extends CursorRecyclerViewAdapter<ContactListAdapter.ContactHolder> implements View.OnClickListener { private OnContactClickListener mListener; public ContactListAdapter(Context context, Cursor cursor) { super(context, cursor); } @Override public ContactHolder […]

如何通过ContentResolver在ContentProvider中调用自定义方法,然后访问Bundle?

我有一个自定义方法save()在我想通过ContentResolver调用的自定义ContentProvider类MyContentProvider中。 目标是将一个POJO作为一个Bundle传递给MyContentProvider 。 我正在使用这里提到的和在 这里定义的call方法。 我没有得到任何错误。 该方法只是没有访问。 自定义方法的(缩写)自定义ContentProvider如下所示: public class MyContentProvider extends ContentProvider { public void save() { Log.d("Test method", "called"); } } 我这样称呼它: ContentResolver contentResolver = context.getContentResolver(); Bundle bundle = new Bundle(); bundle.putSerializable("pojo", getPojo()); contentResolver.call(Contracts.CONTENT_URI, "save", null, bundle); 为什么save方法从来没有被调用过,如果我到了这个地步,我怎样才能在save()方法中访问被调用的Uri和Bundle呢? 我无法在SO或网上的任何地方find任何参考。 谢谢您的回答!

如何使FileProvider可用于其他应用程序?

有没有可能有一个FileProvider可用于其他应用程序? 的manifest.xml … <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.myapp.fileprovider" android:exported="true" android:grantUriPermissions="false" android:permission="com.example.filesvisible.permission.READ" > <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filespath" /> </provider> … 从文档 : false:提供程序不适用于其他应用程序。 设置android:exported =“false”来限制对提供者访问你的应用程序。 只有具有与提供者相同的用户ID(UID)的应用程序才能访问它。 我试图设置导出为true,但我得到了这个exceptionUnable to get provider android.support.v4.content.FileProvider: java.lang.SecurityException: Provider must not be exported为什么我不能导出FileProvider?

Android:getContext()。getContentResolver()有时会得到NullPointerException

我想问为什么我们得到这个注释: 方法调用getContext.getContentResolver()可能会产生NullPointerException 为什么它在那里,而不是在程序片段/活动的其他部分? 这个方法已经在谷歌教程中使用 – 这里是链接的ContentProvider代码https://github.com/udacity/Sunshine-Version-2/blob/sunshine_master/app/src/main/java/com/example/android /sunshine/app/data/WeatherProvider.java,即使您仅使用空白活动创build应用程序,并将该方法放在新创build的ContentProvider中,也是如此。 我们应该使用getContext().getContentResolver().notifyChange(uri, null); 外部ContentProvider获取uri通过,然后更新/插入/删除完成notifyChange? 或者也许我们可以修复它?