我想检索与传入电话号码关联的联系人姓名.当我处理broascastreceiver中的传入号码时,有一个带有传入呼叫者姓名的字符串将极大地帮助我的项目.
我认为这涉及使用sql WHERE子句作为过滤器的查询,但是我是否需要对联系人进行排序?一个例子或提示将是非常有帮助的.
我正在尝试从本机数据库中获取其显示名称和电话号码(任意或所有)的联系人列表.有许多方法可以通过对手机数据库的多个查询来获取此信息,但这会带来相当大的开销.
这是我一直在研究的查询,但结果却是
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中为联系人加载照片时遇到问题.我已经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) 我正在尝试拨打联系人选择器,将人名,电话和电子邮件发送到字符串中,并使用意图将其发送到另一个活动.到目前为止,这工作:
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)
它强行关闭
也许是获得他们号码的另一种方式?
我能够得到一个通用通知"联系人数据库发生了变化",但我想知道插入,更新或删除的特定记录.以下是注册并获取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) 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
代表什么?
我有一个"转储"实用程序,我用它来研究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个表联系人,原始联系人和数据. …
我希望至少使用一个电话号码获取所有联系人,我也想要每个联系人的所有电话号码和所有电子邮件.
当前代码:
// 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) 我正在查询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
我正在尝试插入和更新现有联系人的一条信息,因此我创建了一个示例应用程序以开发功能.我希望我的示例应用程序执行的操作是插入(或者如果存在)更新联系人的电子邮件地址.
我正在通过系统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)
然后执行以下的任一个Insert
或Update
所述数据:
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 ×10
contactscontract ×10
contacts ×4
sqlite ×2
crud ×1
java ×1
phone-number ×1
rawcontacts ×1