从电话号码获取SMS / MMS thread_id

时间:2014-06-09 07:44:01

标签: android android-contentprovider

我需要获取mms-sms / conversations Android内容提供商的thread_id,这是我到目前为止所做的:

    public long findThreadIdFromPhoneNumber(Context context, PhoneNumber phoneNumber) {
    Uri.Builder uriBuilder = Uri.withAppendedPath(Uri.parse(CONTENT_SMSMMS+"/"), "threadID").buildUpon();
    // phoneNumber.msisdn() return the String phone number 
    uriBuilder.appendQueryParameter("recipient", phoneNumber.msisdn());

    long threadId = -1L;
    Cursor cursor = null;
    try {
        cursor = context.getContentResolver().query(
                uriBuilder.build(),
                new String[] { Contacts._ID },
                null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            threadId = cursor.getLong(0);
        }
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
    return threadId;
}

问题是这段代码在内容提供商中创建新线程,我不需要,我只需要在会话存在时返回thread_id,如果不存在则返回-1 。

我也试过这段代码:

    public long findThreadIdFromPhoneNumber(Context context, PhoneNumber phoneNumber) {
    long threadId = -1L;
    Cursor cursor = null;
    try {
        if (context==null || context.getContentResolver()==null || phoneNumber==null || phoneNumber.msisdn()==null) 
            return threadId; 
        cursor = context.getContentResolver().query(
            Uri.parse(CONTENT_SMSMMS_CONVERSATIONS), 
            // phoneNumber.msisdn() return the String phone number 
            null, "address='"+phoneNumber.msisdn()+"' ",  
            null, null
        );
        if (cursor != null && cursor.moveToFirst()) {
            if (cursor.getColumnIndex("thread_id")>=0)
                threadId = cursor.getLong(cursor.getColumnIndex("thread_id"));
        }
    } catch (Exception e) {
        e.printStackTrace();
        String number = (phoneNumber!=null && phoneNumber.msisdn()!=null) ? phoneNumber.msisdn() : "";
        Logcat.e("Error during findThreadIdFromPhoneNumber for "+number+": "+e.getMessage(), e);
        return threadId; 
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
    return threadId;
}

但是这段代码在某些手机的NullPointerException中为我提供了一个外部ContentResolver,而且它在其他手机中有效:

java.lang.NullPointerException
at android.os.Parcel.readException(Parcel.java:1437)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:385)
at android.content.ContentResolver.query(ContentResolver.java:417)
at android.content.ContentResolver.query(ContentResolver.java:360)
at com.mypackage.android.sms.SmsMmsManager.findThreadIdFromPhoneNumber(SmsMmsManager.java:115)

2 个答案:

答案 0 :(得分:1)

使用此uri获取

ContentResolver cr = context.getContentResolver();
    Cursor pCur = cr.query(
            Uri.parse("content://mms-sms/canonical-addresses"), new String[]{"_id"},
            "address" + " = ?",
            new String[]{your_address}, null);

    String thread_id = null;

    if (pCur != null) {
        if (pCur.getCount() != 0) {
            pCur.moveToNext();
            thread_id = pCur.getString(pCur.getColumnIndex("_id"));
        }
        pCur.close();
    }

答案 1 :(得分:1)

 public MessageObjects getSms2(Context context , String number) {

    ContentResolver contentResolver = context.getContentResolver();
    Uri uri = Uri.parse("content://sms/");

    Cursor cursor = contentResolver.query(uri, null, "thread_id IS NOT NULL) GROUP BY (thread_id AND address=?", new String[]{number}, "date DESC");

    String displayName;
    String formattedDate = "";
    String photoUri = null;
    MessageObjects contct = new MessageObjects();
    while (cursor.moveToNext()) {
        displayName = "";
        long key = cursor.getLong(cursor.getColumnIndex("_id"));
        long threadId = cursor.getLong(cursor.getColumnIndex("thread_id"));
        String address = cursor.getString(cursor.getColumnIndex("address")); // phone #
        long date = cursor.getLong(cursor.getColumnIndex("date"));
        Date callDayTime = new Date(Long.valueOf(date));
        String body = cursor.getString(cursor.getColumnIndex("body"));
        String person = cursor.getString(cursor.getColumnIndex("person"));

        contct.setThreadId(threadId);
        contct.setNumber(address);

        contct.setTime(date);
        contct.setMsg(body);
        contct.setPerson(displayName);


    }
    cursor.close();
    return contct;
}