【问题标题】:Get the SMS/MMS thread_id from the phone number从电话号码中获取 SMS/MMS thread_id
【发布时间】:2014-06-09 07:44:00
【问题描述】:

我需要获取 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;
}

但是这段代码在某些手机的ContentResolver 中给了我一个外部NullPointerException,它在其他手机中也可以使用:

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)

【问题讨论】:

    标签: android android-contentprovider


    【解决方案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();
        }
    

    【讨论】:

      【解决方案2】:
       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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        相关资源
        最近更新 更多