标签: contactscontract

Android:从电话号码中检索联系人姓名

我想检索与传入电话号码关联的联系人姓名.当我处理broascastreceiver中的传入号码时,有一个带有传入呼叫者姓名的字符串将极大地帮助我的项目.

我认为这涉及使用sql WHERE子句作为过滤器的查询,但是我是否需要对联系人进行排序?一个例子或提示将是非常有帮助的.

android phone-number contactscontract android-contacts

49
推荐指数
3
解决办法
6万
查看次数

Android联系人在单个数据库查询中显示名称和电话号码?

我正在尝试从本机数据库中获取其显示名称和电话号码(任意或所有)的联系人列表.有许多方法可以通过对手机数据库的多个查询来获取此信息,但这会带来相当大的开销.

这是我一直在研究的查询,但结果却是

Uri uri                = ContactsContract.Contacts.CONTENT_URI;
String[] projection    = new String[] { ContactsContract.Contacts._ID,
                                        ContactsContract.Contacts.DISPLAY_NAME,
                                        ContactsContract.CommonDataKinds.Phone.NUMBER};
String selection       = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'";
String[] selectionArgs = null;
String sortOrder       = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

Cursor people          = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);

int index_id    = people.getColumnIndex(ContactsContract.Contacts._ID);
int indexName   = people.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
int indexNumber = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

people.moveToFirst();
do {
    String _id    = people.getString(index_id);
    String name   = people.getString(indexName);
    String number = people.getString(indexNumber);
    // Do work...
} while (people.moveToNext());
Run Code Online (Sandbox Code Playgroud)

这是由此产生的错误.

E/AndroidRuntime(21549): Caused …
Run Code Online (Sandbox Code Playgroud)

android contacts contactscontract

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

如何加载联系人照片?

我在Android中为联系人加载照片时遇到问题.我已经google了一个答案,但到目前为止已经空了.有没有人有查询联系人,然后加载照片的例子?

因此,给定一个来自一个名为using的Activity结果的contactUri

startActivityForResult(new Intent(Intent.ACTION_PICK,ContactsContract.CommonDataKinds.Phone.CONTENT_URI),PICK_CONTACT_REQUEST) 
Run Code Online (Sandbox Code Playgroud)

是:

内容://com.android.contacts/data/1557

loadContact(..)工作正常.但是,当我调用getPhoto(...)方法时,我得到了照片InputStream的空值.它也令人困惑,因为URI值不同.contactPhotoUri评估为:

内容://com.android.contacts/contacts/1557

请参阅下面代码中的内联注释.

 class ContactAccessor {

    /**
     * Retrieves the contact information.
     */
    public ContactInfo loadContact(ContentResolver contentResolver, Uri contactUri) {

        //contactUri --> content://com.android.contacts/data/1557

        ContactInfo contactInfo = new ContactInfo();

        // Load the display name for the specified person
        Cursor cursor = contentResolver.query(contactUri,
                                            new String[]{Contacts._ID, 
                                                         Contacts.DISPLAY_NAME, 
                                                         Phone.NUMBER,
                                                         Contacts.PHOTO_ID}, null, null, null);
        try {
            if (cursor.moveToFirst()) {
                contactInfo.setId(cursor.getLong(0));
                contactInfo.setDisplayName(cursor.getString(1));
                contactInfo.setPhoneNumber(cursor.getString(2));
            }
        } finally {
            cursor.close();
        }        
        return contactInfo;  // <-- returns info for contact
    }

    public Bitmap …
Run Code Online (Sandbox Code Playgroud)

android contactscontract

43
推荐指数
5
解决办法
8万
查看次数

从android联系人选择器获取联系信息

我正在尝试拨打联系人选择器,将人名,电话和电子邮件发送到字符串中,并使用意图将其发送到另一个活动.到目前为止,这工作:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);  
startActivityForResult(intent, 1);  

// ...

@Override  
public void onActivityResult(int reqCode, int resultCode, Intent data) {  
    super.onActivityResult(reqCode, resultCode, data);  
    if (resultCode == Activity.RESULT_OK) {  
        Uri contactData = data.getData();  
        Cursor c =  managedQuery(contactData, null, null, null, null);  
        if (c.moveToFirst()) {  
            String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));  
            Intent intent = new Intent(CurrentActivity.this, NewActivity.class);  
            intent.putExtra("name", name);  
            startActivityForResult(intent, 0);  
        }  
    }  
}
Run Code Online (Sandbox Code Playgroud)

但如果我加入:

String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
Run Code Online (Sandbox Code Playgroud)

它强行关闭

也许是获得他们号码的另一种方式?

android contacts google-contacts-api contactscontract

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

如何让我的Contacts ContentObserver for ContactsContract检测添加,更新或删除的联系人?

我能够得到一个通用通知"联系人数据库发生了变化",但我想知道插入,更新或删除的特定记录.以下是注册并获取onChange通知的代码.不幸的是,它并不具体,这使得我的处理功能详尽且效率低下.

这是代码存根:

            if ((mNativeContactsObserver == null) && (mHandler == null)) {
            mHandler = new Handler(this.getMainLooper()) {
            };
            mNativeContactsObserver = new ContentObserver(mHandler) {
                @Override
                public void onChange(boolean selfChange) {
                    super.onChange(selfChange);

                    Bundle data = null;
                    Message message = mHandler.obtainMessage();
                    if (message != null) {
                        data = message.getData();
                        if (data != null) {
                            Logs.d(TAG, "Message = [" + message.toString() + "] data=[" + data.toString() + "]");
                            Logs.d(TAG, "Contents = [" + message.describeContents() + "]");
                        }
                    }

                    if (!selfChange) {
                        final Account accountListen = …
Run Code Online (Sandbox Code Playgroud)

android crud contactscontract contentobserver

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

COLLATE LOCALIZED ASC代表什么?

private Cursor getContacts()
    {
        // Run query
        Uri uri = ContactsContract.Contacts.CONTENT_URI;
        String[] projection = new String[] {
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME
        };
        String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" +
                (mShowInvisible ? "0" : "1") + "'";
        String[] selectionArgs = null;
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

        return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
    }
Run Code Online (Sandbox Code Playgroud)

什么COLLATE LOCALIZED ASC代表什么?

java sqlite android contactscontract

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

联系人与原始联系人有什么区别?

我有一个"转储"实用程序,我用它来研究ContactsContract,因为我没有在文档中得到它.当我转储联系人时,它会计算表中的263条记录,但是,我的设备上的联系人应用程序列出了我有244条("显示244个联系人".)

有人可以解释这种差异吗?

我的Sprint LG的联系人应用程序为我同步的每个帐户都有显示选项,我已经进入并检查了所有帐户,因此不应该进行任何过滤.

我在该实用程序中使用的主要URI是:

    Uri uriRawContacts = ContactsContract.RawContacts.CONTENT_URI;
    String[] projection = new String [] {
            ContactsContract.RawContactsEntity._ID,
            ContactsContract.RawContactsEntity.CONTACT_ID,
            ContactsContract.RawContactsEntity.DELETED,
            ContactsContract.RawContactsEntity.AGGREGATION_MODE,
    };
    Cursor cursorRaw = cr.query(uriRawContacts, projection, null, null, null);
    DumpCursor.dumpAnyCursor(getApplicationContext(), "RawContacts", cr, cursorRaw, ",");
Run Code Online (Sandbox Code Playgroud)

接下来是(对于上面的查询中的每个_ID):

                long rawContactId = Long.parseLong(anyCursor.getString(anyCursor.getColumnIndex(RawContacts.CONTACT_ID)));

                Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
                 Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY);

                 Log.d(TAG, "rawContactUri: " + rawContactUri.toString());
                 Log.d(TAG, "entityUri: " + entityUri.toString());

                 Cursor c = cr.query(entityUri, new String[] { RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1 }, null, null, null);
Run Code Online (Sandbox Code Playgroud)

然后我遍历第一个查询,显示我的投影中的所有列,然后,使用第一个查询循环中的_ID字段,我发出第二个查询并转储其所有列.

为方便起见,答案中的子弹转换到此处: 有关详细说明,请参阅参考.更具体地说,建议您阅读有关聚合规则的内容. 参考:点击此处查看随后的原始引用文本

  • 联系人数据库分为3个表联系人,原始联系人和数据. …

android contacts contactscontract rawcontacts

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

如何在一个SQLite查询中获取联系人ID,电子邮件,电话号码?联系人Android优化

我希望至少使用一个电话号码获取所有联系人,我也想要每个联系人的所有电话号码和所有电子邮件.

当前代码:

// To get All Contacts having atleast one phone number.

Uri uri = ContactsContract.Contacts.CONTENT_URI;
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " > ?";
String[] selectionArgs = new String[] {"0"};
Cursor cu = applicationContext.getContentResolver().query(uri, 
                null, selection, selectionArgs, null);

// For getting All Phone Numbers and Emails further queries : 
while(cu.moveToNext()){
String id = cu.getString(cu.getColumnIndex(ContactsContract.Contacts._ID));


 // To get Phone Numbers of Contact
    Cursor pCur = context.getContentResolver().query(
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,  null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?",
 new String[]{id}, null);

// To get Email ids of Contact
Cursor …
Run Code Online (Sandbox Code Playgroud)

sqlite android contactscontract android-contacts

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

隐式联接列如何与Android联系人数据一起使用?

我正在查询ContactsContract.Data表格以查找电话记录.

我创建一个新的时出错CursorLoader:

java.lang.IllegalArgumentException: Invalid column deleted
Run Code Online (Sandbox Code Playgroud)

我的代码:

import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Data;

...

String[] projection = {
    Phone.DELETED,
    Phone.LOOKUP_KEY,
    Phone.NUMBER,
    Phone.TYPE,
    Phone.LABEL,
    Data.MIMETYPE,
    Data.DISPLAY_NAME_PRIMARY
};

// "mimetype = ? AND deleted = ?"
String selection = Data.MIMETYPE + " = ? AND " Phone.DELETED + " = ?";  
String[] args = {Phone.CONTENT_ITEM_TYPE, "0"};

return new CursorLoader(
    this,
    Data.CONTENT_URI,
    projection,
    selection,
    args,
    null);
Run Code Online (Sandbox Code Playgroud)

知道为什么Phone.DELETED列不包含在游标中吗?该文档不说-

来自关联原始联系人的某些列也可通过隐式联接获得.

android contacts contactscontract android-contentprovider android-contacts

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

修改联系信息

我正在尝试插入和更新现有联系人的一条信息,因此我创建了一个示例应用程序以开发功能.我希望我的示例应用程序执行的操作是插入(或者如果存在)更新联系人的电子邮件地址.

我正在通过系统Intent选择一个联系人,如下所示:

    startActivityForResult(new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI), PICK_CONTACT_REQUEST);
Run Code Online (Sandbox Code Playgroud)

返回的URI是Contact(RawContact?)的URI,它被选中并以这种形式出现: content://com.android.contacts/contacts/lookup/0r2-2A90214945/2.

我可以通过执行以下代码来撤回所有Data(RawContact?)项目:

Cursor cursor = contentResolver.query(mContactUri, null, null, null, null);
try {
    if (cursor.moveToFirst()) {
        for(int i=0; i < cursor.getColumnCount(); i++) {
            String message = cursor.getColumnName(i);
            Log.v("", message);
        }
    }
} finally {
    cursor.close();
}
Run Code Online (Sandbox Code Playgroud)

从这里我应该能够确定联系人是否已经有一个CommonDataTypes.Email Data成员:

cursor.getColumnIndex(CommonDataKinds.Email.CONTENT_ITEM_TYPE) != -1;
Run Code Online (Sandbox Code Playgroud)

然后执行以下的任一个InsertUpdate所述数据:

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

ops.add(ContentProviderOperation.newInsert(mContactUri)
    .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
    .withValue(Email.DISPLAY_NAME, "somebody@android.com")
    .withValue(Email.TYPE, Email.TYPE_HOME)
    .build()); …
Run Code Online (Sandbox Code Playgroud)

android contactscontract android-contacts

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