特定号码的SMS消息未显示在其他Android设备上

历览千载书,时时见遗烈。这篇文章主要讲述特定号码的SMS消息未显示在其他Android设备上相关的知识,希望能为你提供帮助。
我正在使用Telephony.Sms库来加载我正在处理的应用程序的已接收和已发送的短信。当我将查询选择设置为null(查询中的第三项)时,它将在我测试的不同类型的手机上显示所有已发送和已接收的短信。

Cursor c = cr.query(Telephony.Sms.CONTENT_URI, null, null, null, null);

但是,当我将它设置为特定号码时,在运行在API 27上的三星S9手机上,它没有显示任何短信。在API 23上的Nexus运行中,它将显示收到的消息,但不会显示列表视图中的已发送消息。在运行在API 22上的华为手机上,它们都正常工作,显示特定号码的已发送和已接收消息。
Cursor c = cr.query(Telephony.Sms.CONTENT_URI, null, sms, null, null);

【特定号码的SMS消息未显示在其他Android设备上】这是检索特定电话号码的已发送和已接收短信的完整代码。
@WithPermissions(permissions = {Manifest.permission.READ_SMS}) public void getAllSms(Context context) { // Number needs to saved in +614 format String phoneNumber = SelectedPhNo; String sms = "address='"+ phoneNumber + "'"; ContentResolver cr = context.getContentResolver(); Cursor c = cr.query(Telephony.Sms.CONTENT_URI, null , null , null , null); // Sms not showing up on Raza's phone int totalSms = 0; String type = null; if(c != null) { totalSms = c.getCount(); if(c.moveToFirst()) { for(int j = 0; j < totalSms; j++) { String smsDate = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.DATE)); String body = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.BODY)); switch(Integer.parseInt(c.getString(c.getColumnIndexOrThrow(Telephony.Sms.TYPE)))) { case Telephony.Sms.MESSAGE_TYPE_INBOX: type = "inbox"; break; case Telephony.Sms.MESSAGE_TYPE_SENT: type = "sent"; break; case Telephony.Sms.MESSAGE_TYPE_OUTBOX: type = "outbox"; break; default: break; }// Convert smsDate to readable format Long date = Long.parseLong(smsDate); // Convert millis value to proper format Date dateVal = new Date(date); SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss dd-MM-yyyy"); dateText = format.format(dateVal); //Toast.makeText(context, "Message present", Toast.LENGTH_SHORT).show(); inboxArrayAdapter.add("Command: " + body + " " + "Date: "+ dateText); // Iterate through the list of SMS messages to be displayed in the listview c.moveToNext(); //Update listview as soon as we receive a new message ((BaseAdapter)inboxmessages.getAdapter()).notifyDataSetChanged(); inboxArrayAdapter.notifyDataSetChanged(); ; } } } else { Toast.makeText(getContext(), "No Messages found for this contact!", Toast.LENGTH_SHORT).show(); } }

答案查询SMS / MMS消息非常棘手,并且在不同的android版本之间以及不同的制造商之间变化很大。
这个应该适用于所有Android K +设备的版本:
HashSet< String> phonesSet = new HashSet< > (); phonesSet.add(phoneNumber); long threadId = Threads.getOrCreateThreadId(context, phonesSet); // get the thread-id of the specific conversation thread Uri threadUri = ContentUris.withAppendedId(Threads.CONTENT_URI, threadId); // get the thread-uriString[] projection = new String[]{MmsSms.TYPE_DISCRIMINATOR_COLUMN, BaseColumns._ID, Conversations.THREAD_ID, Telephony.Sms.ADDRESS, Telephony.Sms.BODY, "sort_index", Telephony.Sms.DATE_SENT, Telephony.Sms.READ, Telephony.Sms.TYPE, Telephony.Sms.STATUS, Telephony.Sms.LOCKED, Telephony.Sms.ERROR_CODE, Telephony.Sms.SEEN}; Cursor cur = getContentResolver().query(threadUri, projection, null, null, null); DatabaseUtils.dumpCursor(cur);

另一答案这是能够在各种Android设备上获取已发送/已接收SMS消息的完整代码解决方案。这已在不同的Android设备(包括华为,Oppo和三星)的API级别22,23,26和28上进行了测试。
public void getAllSms(Context context) { HashSet< String> phoneSet = new HashSet< > (); phoneSet.add(SelectedPhNo); // phoneNumber long threadId = Telephony.Threads.getOrCreateThreadId(context, phoneSet); Uri threadUri = ContentUris.withAppendedId(Telephony.Threads.CONTENT_URI, threadId); String[] projection = new String[] {Telephony.MmsSms.TYPE_DISCRIMINATOR_COLUMN, BaseColumns._ID, Telephony.Sms.Conversations.THREAD_ID, Telephony.Sms.ADDRESS, Telephony.Sms.BODY, "sort_index", Telephony.Sms.DATE_SENT, Telephony.Sms.DATE, Telephony.Sms.READ, Telephony.Sms.TYPE, Telephony.Sms.STATUS, Telephony.Sms.LOCKED, Telephony.Sms.ERROR_CODE, Telephony.Sms.SEEN, Telephony.Sms.Inbox.BODY, Telephony.Sms.Sent.BODY}; Cursor cur = context.getContentResolver().query(threadUri, projection, null, null, "normalized_date desc"); DatabaseUtils.dumpCursor(cur); // Read cursor into an arraylist ArrayList< String> mArrayList = new ArrayList< String> (); int totalSms = cur.getCount(); if(cur.moveToFirst()) { for(int i = 0; i < totalSms; i++) { String body = cur.getString(cur.getColumnIndex(Telephony.Sms.BODY)); String indexDate = cur.getString(cur.getColumnIndex(Telephony.Sms.DATE)); // Convert string to long variable Long date = Long.parseLong(indexDate); // Convert millis value to proper format Date dateVal = new Date(date); //"dd-MMM-yyyy""dd/MM/yyyy" SimpleDateFormat format = new SimpleDateFormat("HH:mm:ssdd-MM-yyyy"); dateText = format.format(dateVal); cur.moveToNext(); inboxArrayAdapter.add("Command: " + body + " " + "Date: " + dateText); } } }


    推荐阅读