Android 如何使用带游标加载程序的LoaderManager获取sms收件箱联系人号码

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

我正在创建一个简单的短信应用程序,只是为了开始为Android开发。我希望我的收件箱显示联系人姓名,而不是他们的号码

以下代码来自我的onCreate()方法:

然后,在onCreateLoader方法中有以下内容:

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