bra*_*all 7 java android android-contentresolver contactscontract
赏金奖励 - 奖金将奖励给从填充Telephony.Sms.Inbox.PERSON值到相关Contact仅使用ContractsContact表格的答案.
我正在申请中以标准方式阅读短信:
final String[] projection = {Telephony.Sms.Inbox.BODY,
Telephony.Sms.Inbox.ADDRESS,
Telephony.Sms.Inbox.READ,
Telephony.Sms.Inbox.DATE,
Telephony.Sms.Inbox.PERSON};
final Cursor cursor = ctx.getContentResolver().query(Telephony.Sms.Inbox.CONTENT_URI,
projection, null, null, Telephony.Sms.Inbox.DEFAULT_SORT_ORDER);
Run Code Online (Sandbox Code Playgroud)
填充时,从索引返回Telephony.Sms.Inbox.PERSON的id与弃用的id相关,Contacts.People._ID可用于通过以下方式查询更多联系人信息:
final String[] projection = {Contacts.People.DISPLAY_NAME};
final String[] selectionArgs = {contactId};
final Cursor cursor = ctx.getContentResolver().query(Contacts.People.CONTENT_URI,
projection, Contacts.People._ID + " = ?", selectionArgs, null);
Run Code Online (Sandbox Code Playgroud)
为什么相对较新的Telephony API使用弃用表而不是ContactsContract?
Telephony.Sms.Inbox.PERSON文档说明:
类型:INTEGER(对内容中的项目的引用://联系人/人)
我试过(但并不奇怪吗?)在任何ContactsContractid字段中找到id的映射都没有成功,所以我不得不使用弃用的API来解决我需要快速执行的查询.
这样的查询包括搜索特定联系人的消息,我只有这个名字.联系人可能有多个号码,这些号码的格式可能不正确,无法匹配Telephony.Sms.Inbox.ADDRESS条目......
从数字到联系人时,使用和ContactsContract.PhoneLookup的解决方法不是世界末日,但我仍然觉得我必须在这里遗漏一些东西?Telephony.Sms.Inbox.ADDRESS
这是我用来获取"Joe Bloggs"消息的过程.
1)查询ContactsContract表以确认设备上存在Joe Bloggs名称的联系人 - 或者如果联系人实际列为"Joe 博客 ",则获得近似匹配.
2)使用确认的名称,我查询已弃用的Contact.People表以通过以下方式获取联系人的所有关联ID:
final String selection = Contacts.People.DISPLAY_NAME + " LIKE ?";
final String[] projection = {Contacts.People.DISPLAY_NAME,
Contacts.People._ID};
final String[] selectionArgs = {contactName};
final Cursor cursor = ctx.getContentResolver().query(Contacts.People.CONTENT_URI,
projection, selection, selectionArgs, null);
Run Code Online (Sandbox Code Playgroud)
3)使用已弃用的联系人ID列表,我查询消息表如下:
final String[] referredArgs = new String[contactIdArray.size()];
for (int i = 0; i < contactIdArray.size(); i++) {
referredArgs[i] = contactIdArray.get(i);
}
final String referredSelection = Telephony.Sms.Inbox.PERSON + " IN "
+ "(" + TextUtils.join(",", referredArgs) + ")";
final String[] projection = {Telephony.Sms.Inbox.BODY,
Telephony.Sms.Inbox.ADDRESS,
Telephony.Sms.Inbox.READ,
Telephony.Sms.Inbox.DATE,
Telephony.Sms.Inbox.PERSON};
final Cursor cursor = ctx.getContentResolver().query(Telephony.Sms.Inbox.CONTENT_URI,
projection, referredSelection, null, Telephony.Sms.Inbox.DEFAULT_SORT_ORDER);
Run Code Online (Sandbox Code Playgroud)
我希望有人会告诉我,我要绕过这里的房子,并且使用当前的API有一个更明显的解决方案.我不认为使用 优化的解决方案迭代整个消息表ContactsContract.PhoneLookup .
提前致谢.
小智 -1
我不明白你的担忧,但我正在从事类似的项目,这里是基本代码,以及用于获取和显示消息的基本、重要的列:
ContentResolver contentResolver = getContentResolver();
final String[] projection = new String[]{"*"};
Cursor SMSL = contentResolver.query(Telephony.Sms.CONTENT_URI, projection, null, null, "date ASC");
int msgscount = SMSL.getCount();
if (msgscount>0) {
msgs = new String[SMSL.getCount()][msgs_column_count];
int i = 0;
while (SMSL.moveToNext()) {
progress.setProgress(i);
msgs[i][0] = SMSL.getString(SMSL.getColumnIndex("address"));
msgs[i][1] = SMSL.getString(SMSL.getColumnIndex("date_sent"));
msgs[i][2] = SMSL.getString(SMSL.getColumnIndex("date"));
msgs[i][3] = SMSL.getString(SMSL.getColumnIndex("type"));
msgs[i][4] = SMSL.getString(SMSL.getColumnIndex("body"));
msgs[i][5] = SMSL.getString(SMSL.getColumnIndex("read"));
if (SMSL.getString(SMSL.getColumnIndex("service_center")) != null){
msgs[i][6] = SMSL.getString(SMSL.getColumnIndex("service_center"));
}else{
msgs[i][6] = "";
}
i++;
}
SMSL.close();
}else{
msgs = new String[0][0];
Toast.makeText(getApplicationContext(),"No messages found!",Toast.LENGTH_LONG).show();
}
Run Code Online (Sandbox Code Playgroud)
如果您需要任何帮助或获取消息,请告诉我。
| 归档时间: |
|
| 查看次数: |
582 次 |
| 最近记录: |