SMS-сообщения с определенного номера не отображаются на других устройствах Android - PullRequest
0 голосов
/ 18 апреля 2019

Я использую библиотеку Telephony.Sms для загрузки полученных и отправленных смс-сообщений для приложения, над которым я работаю. Когда я установлю выбор запроса на ноль (третий элемент в запросе), он будет показывать все отправленные и полученные смс-сообщения на разных типах телефонов, на которых я тестировал.

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

Но когда я установил его на определенный номер, на телефоне Samsung S9, работающем по API 27, он не показывает никаких смс-сообщений. В Nexus, работающем по API 23, он будет отображать полученные сообщения, но не отправленные сообщения в виде списка. На телефоне Huawei, работающем по 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 + "\n" + "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();
        }
    }

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Запрос сообщений 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);
0 голосов
/ 24 апреля 2019

Это полное решение кода, позволяющее получать отправленные / полученные SMS-сообщения на различных устройствах Android. Это было протестировано на уровне API 22, 23, 26 и 28 на различных устройствах Android, включая Huawei, Oppo и Samsung.

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 + "\n" + "Date: " + dateText);
         }
    }
}
...