特定号码的SMS消息未显示在其他Android设备上
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了特定号码的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);
这是检索特定电话号码的已发送和已接收短信的完整代码。
@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-uri
String[] 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:ss dd-MM-yyyy");
dateText = format.format(dateVal);
cur.moveToNext();
inboxArrayAdapter.add("Command: " + body + "
" + "Date: " + dateText);
}
}
}
以上是关于特定号码的SMS消息未显示在其他Android设备上的主要内容,如果未能解决你的问题,请参考以下文章
在 4.4.4 上从 android 中删除 SMS(删除后受影响的行 = 0(零))