Android 如何使用带游标加载程序的LoaderManager获取sms收件箱联系人号码
我正在创建一个简单的短信应用程序,只是为了开始为Android开发。我希望我的收件箱显示联系人姓名,而不是他们的号码 以下代码来自我的onCreate()方法: 然后,在onCreateLoader方法中有以下内容:Android 如何使用带游标加载程序的LoaderManager获取sms收件箱联系人号码,android,sms,android-cursorloader,Android,Sms,Android Cursorloader,我正在创建一个简单的短信应用程序,只是为了开始为Android开发。我希望我的收件箱显示联系人姓名,而不是他们的号码 以下代码来自我的onCreate()方法: 然后,在onCreateLoader方法中有以下内容: public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { if (i == SmsQuery.TOKEN) { // Fetch all SMS messages in th
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
if (i == SmsQuery.TOKEN) {
// Fetch all SMS messages in the inbox, date desc.
return new CursorLoader(this, SmsQuery.CONTENT_URI, SmsQuery.PROJECTION,
null, null, SmsQuery.SORT_ORDER);
}
return null;
}
任何帮助都将不胜感激。谢谢。我使用以下代码:
private class AllSMSLoader implements LoaderManager.LoaderCallbacks<Cursor> {
private Context context;
private AllSMSLoader(Context context) {
this.context = context;
}
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
final String SMS_ALL = "content://sms/";
Uri uri = Uri.parse(SMS_ALL);
String[] projection = new String[]{"_id", "thread_id", "address", "person", "body", "date", "type"};
return new CursorLoader(context, uri, projection, null, null, "date desc");
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
MyLog.v("LoadFinished");
List<SMS> sms_All = new ArrayList<SMS>();
List<String> phoneNumbers = new ArrayList<String>();
while (cursor.moveToNext()) {
String phoneNumber = cursor.getString(cursor.getColumnIndexOrThrow("address"));
MyLog.v(phoneNumber);
int type = cursor.getInt(cursor.getColumnIndexOrThrow("type"));
if ((!phoneNumbers.contains(phoneNumber)) && (type != 3) && (phoneNumber.length()>=1)) {
String name = null;
String person = cursor.getString(cursor.getColumnIndexOrThrow("person"));
String smsContent = cursor.getString(cursor.getColumnIndexOrThrow("body"));
Date date = new Date(Long.parseLong(cursor.getString(cursor.getColumnIndexOrThrow("date"))));
Uri personUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, phoneNumber);
ContentResolver cr = context.getContentResolver();
Cursor localCursor = cr.query(personUri,
new String[]{ContactsContract.Contacts.DISPLAY_NAME},
null, null, null);//use phonenumber find contact name
if (localCursor.getCount() != 0) {
localCursor.moveToFirst();
name = localCursor.getString(localCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
}
MyLog.v("person:" + person + " name:" + name + " phoneNumber:" + phoneNumber);
localCursor.close();
phoneNumbers.add(phoneNumber);
SMS sms = new SMS(name, phoneNumber, smsContent, type, date);
sms_All.add(sms);
}
}
myadapter.notifyDataSetChanged();
//simpleCursorAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
//simpleCursorAdapter.swapCursor(null);
}
}
私有类AllSMSLoader实现LoaderManager.LoaderCallbacks{
私人语境;
专用AllSMSLoader(上下文){
this.context=上下文;
}
@凌驾
公共加载器onCreateLoader(inti,Bundle){
最终字符串SMS_ALL=”content://sms/";
Uri=Uri.parse(SMS\u ALL);
字符串[]投影=新字符串[]{“\u id”,“thread\u id”,“address”,“person”,“body”,“date”,“type”};
返回新的游标装入器(上下文、uri、投影、null、null、“日期描述”);
}
@凌驾
公共void onLoadFinished(加载器游标加载器,游标游标){
MyLog.v(“LoadFinished”);
列出sms_All=new ArrayList();
List phoneNumbers=new ArrayList();
while(cursor.moveToNext()){
String phoneNumber=cursor.getString(cursor.getColumnIndexOrThrow(“地址”);
MyLog.v(电话号码);
int type=cursor.getInt(cursor.getColumnIndexOrThrow(“type”);
如果((!phoneNumbers.contains(phoneNumber))&&&&(type!=3)&&&(phoneNumber.length()>=1)){
字符串名称=null;
字符串person=cursor.getString(cursor.getColumnIndexOrThrow(“person”);
字符串smsContent=cursor.getString(cursor.getColumnIndexOrThrow(“正文”);
日期日期=新日期(Long.parseLong(cursor.getString(cursor.getColumnIndexOrThrow(“日期”)));
Uri personUri=Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT\u FILTER\u Uri,phoneNumber);
ContentResolver cr=context.getContentResolver();
游标localCursor=cr.query(personUri,
新字符串[]{Contacts contract.Contacts.DISPLAY_NAME},
null,null,null);//使用电话号码查找联系人姓名
if(localCursor.getCount()!=0){
localCursor.moveToFirst();
name=localCursor.getString(localCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_name));
}
MyLog.v(“个人:“+person+”姓名:“+name+”电话号码:“+phoneNumber”);
localCursor.close();
电话号码。添加(电话号码);
短信=新短信(姓名、电话号码、短信内容、类型、日期);
sms_All.add(sms);
}
}
myadapter.notifyDataSetChanged();
//simpleCursorAdapter.swapCursor(游标);
}
@凌驾
public void onLoaderReset(加载器游标加载器){
//simpleCursorAdapter.swapCursor(null);
}
}
我使用baseadapter,如果您使用simplecursoradapter,那么最好绑定自定义viewbinder。
simpleCursorAdapter.setViewBinder()//添加自定义viewbinder
希望它对您有用。simpleadapter ex:
simpleCursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int i) {
//get data from curosr
//bind data to your view
return false;
}
});
yourListView.setAdapter(simpleCursorAdapter);
覆盖setViewBinder,它确实得到了我想要的,但是我不知道如何将数据绑定到我的
ListView
。我必须在哪里使用setViewBinder
?或者如何使用BaseAdapter
?谢谢你。我似乎还是没法让它工作;因此,在我的onCreate
中,我定义了我的SimpleCursorAdapter
,如问题中所述。那么,如何将电话号码与列表中的姓名进行交换呢?
private class AllSMSLoader implements LoaderManager.LoaderCallbacks<Cursor> {
private Context context;
private AllSMSLoader(Context context) {
this.context = context;
}
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
final String SMS_ALL = "content://sms/";
Uri uri = Uri.parse(SMS_ALL);
String[] projection = new String[]{"_id", "thread_id", "address", "person", "body", "date", "type"};
return new CursorLoader(context, uri, projection, null, null, "date desc");
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
MyLog.v("LoadFinished");
List<SMS> sms_All = new ArrayList<SMS>();
List<String> phoneNumbers = new ArrayList<String>();
while (cursor.moveToNext()) {
String phoneNumber = cursor.getString(cursor.getColumnIndexOrThrow("address"));
MyLog.v(phoneNumber);
int type = cursor.getInt(cursor.getColumnIndexOrThrow("type"));
if ((!phoneNumbers.contains(phoneNumber)) && (type != 3) && (phoneNumber.length()>=1)) {
String name = null;
String person = cursor.getString(cursor.getColumnIndexOrThrow("person"));
String smsContent = cursor.getString(cursor.getColumnIndexOrThrow("body"));
Date date = new Date(Long.parseLong(cursor.getString(cursor.getColumnIndexOrThrow("date"))));
Uri personUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, phoneNumber);
ContentResolver cr = context.getContentResolver();
Cursor localCursor = cr.query(personUri,
new String[]{ContactsContract.Contacts.DISPLAY_NAME},
null, null, null);//use phonenumber find contact name
if (localCursor.getCount() != 0) {
localCursor.moveToFirst();
name = localCursor.getString(localCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
}
MyLog.v("person:" + person + " name:" + name + " phoneNumber:" + phoneNumber);
localCursor.close();
phoneNumbers.add(phoneNumber);
SMS sms = new SMS(name, phoneNumber, smsContent, type, date);
sms_All.add(sms);
}
}
myadapter.notifyDataSetChanged();
//simpleCursorAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
//simpleCursorAdapter.swapCursor(null);
}
}
simpleCursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int i) {
//get data from curosr
//bind data to your view
return false;
}
});
yourListView.setAdapter(simpleCursorAdapter);