历览千载书,时时见遗烈。这篇文章主要讲述特定号码的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);
}
}
}
推荐阅读
- Android Studio Project(UI的底部被切断)
- Android - 突出显示TextView中的单词()
- 带网格标题的Android网格视图
- 使用Material Design在Android Lollipop中的ListView中的活动过渡动画
- 如何解决Visual Studio Form Render异常(可以设计Form类,但不是文件中的第一类)
- 如何在WinForms中使用C#在Windows的System32目录中运行任何可执行文件
- 跨平台与单平台开发-这是你应该知道的
- 如何确定数字在C中是否强
- PHP 7.3提供的主要功能