简体   繁体   中英

Get the SMS/MMS thread_id from the phone number

I need to get the thread_id of the mms-sms/conversations Android content provider, this is what I have done so far:

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

The problem is that this code create new threads in the content provider, and I don't need that, I just need to return the thread_id if the conversation exists and -1 if it do not exists.

I also tried this code:

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

But this code give me an external NullPointerException in the ContentResolver in some phones, and it works in other:

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)

Use this uri for fetching

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM