-1

我有一個短信傳入電話號碼123456。我想用Intent在服務中打開傳入電話號碼的SMS消息。我嘗試了兩種方式,但他們給不滿意結果在閱讀模式Android 5.0中無法閱讀短信?

第一種方式:

 Intent smsIntent = new Intent(Intent.ACTION_MAIN); 
     smsIntent.addCategory(Intent.CATEGORY_DEFAULT); 
     smsIntent.setType("vnd.android-dir/mms-sms"); 
     smsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(smsIntent); 

的方式只打開短信列表。我們必須查看列表中的傳入電話,並需要一個步驟才能打開傳入的SMS電話的內容。我想忽略這一步。這意味着它會直接轉到收到的短信電話號碼的內容。

方式二:

 Intent smsIntent = new Intent(Intent.ACTION_VIEW); 
     smsIntent.setType("vnd.android-dir/mms-sms"); 
     smsIntent.putExtra("address", SMSphoneNumber); 
     smsIntent.putExtra("sms_body",SMSBody); 
     smsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(smsIntent); 

這樣可以讀取傳入的短信電話號碼的細節,但它在發送模式。我想在閱讀模式下閱讀短信。

如何在Android L中執行此操作?謝謝大家

這個問題與How to open SMS intent to read (not send) message?有關。不同的是爲兩種情況提供源代碼:一種是閱讀模式(第一種),需要多一步,另一種是發送模式。

更新:這是什麼方式我得到的短信來電號碼

public class SMSReceiver extends BroadcastReceiver { 
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(SMS_RECEIVED)) { 
        Bundle extras = intent.getExtras(); 
        SmsMessage[] smgs = null; 
        String infoSender = ""; 
        String infoSMS = ""; 

        if (extras != null) { 
         // Retrieve the sms message received 
         Object[] pdus = (Object[]) extras.get("pdus"); 
         smgs = new SmsMessage[pdus.length]; 

         for (int i = 0; i < smgs.length; i++) { 
          smgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
          infoSender += smgs[i].getOriginatingAddress(); 
          if (smgs[i].getMessageBody()!=null) 
           infoSMS += smgs[i].getMessageBody().toString(); 
          else 
           infoSMS += "."; 
         } 
         Toast.makeText(context, "Phone in SMSReceiver is -" + infoSender + "Body is" + infoSMS, Toast.LENGTH_SHORT).show(); 
        } 
     } 
    } 

} 
+0

你的問題不清楚。你想獲得數字和消息正文,並過濾一個特定的數字? –

+0

我已經有了BroadcastReceiver的號碼和身體。我只想在閱讀模式下打開傳入電話號碼的短信。 – Jame

+1

可能重複[如何打開SMS意圖閱讀(不發送)消息?](http://stackoverflow.com/questions/39678042/how-to-open-sms-intent-to-read-not-send-消息) –

回答

1

如果你想打開的默認應用程序,那麼你也將需要您收到的郵件的線程ID的消息。你可以做的是查詢信息數據庫,並使用你的邏輯獲得線程ID,然後使用下面的意圖打開 -

Intent intent = new Intent(Intent.ACTION_VIEW); 

intent.setData(Uri.parse("content://mms-sms/conversations/" + sms.getThreadId())); 
mContext.startActivity(intent); 
+0

'sms'是什麼?這在Android中是錯誤的 – Jame

+0

sms是一個存儲線程ID的自定義對象。在你的情況下,你必須查詢數據庫並獲取最新消息的線程ID。你需要爲此開發你的邏輯。 – Gautam

+0

我從http://stackoverflow.com/questions/30260877/restore-sms-create-thread-if-not-exists得到了線程ID,但是,結果與我的第二種方法類似。它進入發送模式,而不是閱讀模式 – Jame

0

這是我的回答與@Gautam支持。 首先,我們通過使用代碼

public static long getThreadId(Context context, String phoneNumber) { 
     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[]{phoneNumber}, "date DESC"); 
     long threadId=0; 
     while (cursor.moveToNext()) { 
      threadId = cursor.getLong(cursor.getColumnIndex("thread_id")); 
     } 
     cursor.close(); 
     return threadId; 
    } 

thread_id得到一個短信thread_id,就可以顯示在閱讀模式下短信內容如下:

 long thread_id= getThreadId(getApplicationContext(), SMSphoneNumber); 
     Log.d(TAG,"==========THREAD ID"+String.valueOf(thread_id)+"========="); 
     smsIntent.setData(Uri.parse("content://mms-sms/conversations/" + thread_id)); 
     smsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     getApplicationContext().startActivity(smsIntent); 

希望它可以幫助別人