标签: 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});
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个例外:

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)
Run Code Online (Sandbox Code Playgroud)

你能告诉我如何解决我的问题吗?

谢谢.

android android-contentresolver android-contacts

24
推荐指数
4
解决办法
4万
查看次数

cursor.setNotificationUri()用于什么?

我在本教程中研究了如何使用ContentProviders和加载器

我是怎么看的:我们有一个ActivityListView,SimpleCursorAdapterCursorLoader.我们也实施ContentProvider.

Activity我们可以调用getContentResolver().insert(URI, contentValues);通过点击一个按钮.

在我们的实现中ContentProvider,在insert()方法结束时,我们调用getContentResolver().notifyChange(URI, null);并且我们CursorLoader将收到消息,它应该重新加载数据并更新UI.此外,如果我们FLAG_REGISTER_CONTENT_OBSERVERSimpleCursorAdapter其中使用它也将接收消息并且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);
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

但我无法理解这一点.

所以我的问题是:我们为什么要叫cursor.setNotificationUri()query()我们的方法ContentProvider实现?

database android cursor android-contentresolver android-contentprovider

23
推荐指数
2
解决办法
9403
查看次数

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)));

                // get the phone number
                Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null);
                while (pCur.moveToNext()) {

                    // …
Run Code Online (Sandbox Code Playgroud)

performance android android-contentresolver android-contentprovider android-contacts

22
推荐指数
1
解决办法
1万
查看次数

getContentResolver()如何工作?

ContentProvider在互联网上观看了一个关于如何定义和使用a 的课程ContentProvider.

我对使用名为的方法感到困惑getContentResolver().这种方法有什么回报?

ContentProvider没有实例,代码就是这样写的getContentProvider().query().

我不明白是怎么ContentProvider运作的.

android android-contentresolver

22
推荐指数
1
解决办法
3万
查看次数

我可以使用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 = ?
Run Code Online (Sandbox Code Playgroud)

我希望通过默认的Contacts ContentProvider选择系统通讯录中所有联系人的ID和名称,以及指示联系人是否是组成员的0/1字段?.

我当然可以很容易地获得所有联系人,然后在我的Adapter类中循环遍历并分别查询成员资格,但我想要执行两个查询,因为一个外部联接查询会产生更好的性能.

我可以使用标准的高级字符串投影和ContentResolver.query()方法吗?或者这种查询是否需要深入研究更直接的SQL执行?

sql android left-join android-contentresolver android-contacts

21
推荐指数
2
解决办法
2万
查看次数

我想获得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<String> 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 (whatsappContactId != null) {
                        //Get Data from ContactsContract.CommonDataKinds.Phone of Specific CONTACT_ID
                        Cursor whatsAppContactCursor = cr.query(
                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
                                        ContactsContract.CommonDataKinds.Phone.NUMBER,
                                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME},
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", …
Run Code Online (Sandbox Code Playgroud)

android android-contentresolver whatsapp

20
推荐指数
1
解决办法
820
查看次数

将视频插入MediaStore

我正在尝试插入视频MediaStore,就像使用此方法存储图像一样:

MediaStore.Images.Media.insertImage(getContentResolver(), imagePath, null, null)
Run Code Online (Sandbox Code Playgroud)

由于没有类似的方法MediaStore.Video.Media,我尝试做的是插入一条记录MediaStore.Video.Media.EXTERNAL_CONTENT_URI,然后将文件复制到目的地,如下所示:

ContentValues values = new ContentValues();
values.put(MediaStore.Video.Media.TITLE, "Title1");
values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
values.put(MediaStore.Video.Media.DATA, videoPath);
Uri uri = cr.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);

try {
    OutputStream os = cr.openOutputStream(uri);
    ...
    ...
} (FileNotFoundException e) {
    cr.delete(uri, null, null);
}
Run Code Online (Sandbox Code Playgroud)

uri返回的non-null的形式content://media/external/video/media/{id},这似乎是正确的.

但是当cr.openOutputStream(uri);被激活时,会FileNotFoundException被抛出.

最后一点类似于Image.Media.insertImage查看其源代码所做的操作.

顺便说一句,我确实得到了WRITE_EXTERNAL_STORAGE许可.另外,我正在测试4.3和4.4.

video android mediastore android-contentresolver

18
推荐指数
1
解决办法
2100
查看次数

如何从Android获取whatsapp联系人?

我试图通过电话获得whatsapp联系,我得到whatsapp联系的总数,但是从RawContacts如何获得whatsapp我不知道的号码和名称.我试图找到解决方案,但无法得到确切的解决方案.请帮我.

我把我的代码放在下面.

ContentResolver cr = context.getContentResolver();

Cursor c = cr.query(
                        ContactsContract.RawContacts.CONTENT_URI,
                        new String[] { ContactsContract.RawContacts.CONTACT_ID, ContactsContract.RawContacts.DISPLAY_NAME_PRIMARY },
                        ContactsContract.RawContacts.ACCOUNT_TYPE + "= ?",
                        new String[] { "com.whatsapp" },
                        null);

                ArrayList<String> myWhatsappContacts = new ArrayList<>();

                String projection[] = { ContactsContract.CommonDataKinds.Phone.NUMBER };

                if(c != null) {
                    if (c.getCount() > 0) {
                        while (c.moveToNext()) {

                            String whatsappContactId = c.getString(c.getColumnIndex(ContactsContract.RawContacts.Data._ID));

                            Cursor dataCursor = cr.query(
                                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                    projection,
                                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                                    new String[]{whatsappContactId}, null);
                            // You can also read RawContacts.CONTACT_ID to read the
                            // …
Run Code Online (Sandbox Code Playgroud)

android contacts android-contentresolver android-contacts whatsapp

17
推荐指数
1
解决办法
9712
查看次数

原始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 oh = new MyOpenHelper(v.getContext());
                SQLiteDatabase wdb = oh.getWritableDatabase();
                ContentValues cv = new ContentValues();
                cv.put("value", String.valueOf(System.currentTimeMillis()));
                if (wdb.insert(MyOpenHelper.TABLE_NAME, null, cv) …
Run Code Online (Sandbox Code Playgroud)

database sqlite android android-contentresolver

16
推荐指数
2
解决办法
9097
查看次数

如何解决多个内容提供商?

我创建了两个内容提供程序,它们在同一个SQLite数据库的两个不同的表上工作.它们共享的单个实例SQLiteOpenHelper作为阿里Serghini的职位描述.每个内容提供商的注册AndroidManifest.xml如下.

<provider
    android:name=".contentprovider.PostsContentProvider"
    android:authorities="com.example.myapp.provider"
    android:exported="false"
    android:multiprocess="true" >
</provider>
<provider
    android:name=".contentprovider.CommentsContentProvider"
    android:authorities="com.example.myapp.provider"
    android:exported="false"
    android:multiprocess="true" >
</provider>
Run Code Online (Sandbox Code Playgroud)

每个内容提供商定义所需的内容URI并提供UriMatcher.

public class PostsProvider extends BaseContentProvider {

    private static final UriMatcher sUriMatcher = buildUriMatcher();
    private static final int POSTS = 100;
    private static final int POST_ID = 101;

    private static UriMatcher buildUriMatcher() {
        final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
        final String authority = CustomContract.CONTENT_AUTHORITY;
        matcher.addURI(authority, DatabaseProperties.TABLE_NAME_POSTS, POSTS);
        matcher.addURI(authority, DatabaseProperties.TABLE_NAME_POSTS + "/#", POST_ID);
        return matcher;
    }
Run Code Online (Sandbox Code Playgroud)

...

public …
Run Code Online (Sandbox Code Playgroud)

android uri android-contentresolver android-contentprovider

16
推荐指数
1
解决办法
9757
查看次数