在阅读模式Android 5.0中无法读取短信?

时间:2016-09-26 11:49:23

标签: android android-intent android-service android-5.0-lollipop android-sms

我有一个短信来电号123456。我想使用Intent打开服务中传入电话号码的SMS消息。我尝试了两种方法,但是它们给出了不满意的结果

第一种方式:

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

}

2 个答案:

答案 0 :(得分:1)

如果要在默认应用程序中打开消息,则需要收到消息的线程ID。您可以做的是查询消息db并使用您的逻辑获取线程ID,然后使用以下intent打开它 -

Intent intent = new Intent(Intent.ACTION_VIEW);

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

答案 1 :(得分:0)

这是我在@Gautam支持下的答案。 首先,我们必须使用代码

获取SMS的thread_id
 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,我们可以在阅读模式下显示短信内容,如下所示:

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

希望有人帮助