Android Telephony.Sms API для чтения / записи / удаления всех записей SMS, а не только отправленных и входящих - PullRequest
1 голос
/ 13 марта 2019

Работает над приложением Android, которое получает SMS-сообщения на устройстве с помощью этого кода;

    public void refreshSmsSent() {
    ContentResolver contentResolver = getContentResolver();
    arrayAdapter.clear();
    Cursor c = contentResolver.query(Telephony.Sms.Sent.CONTENT_URI, // Official CONTENT_URI from docs
            new String[] { Telephony.Sms.Sent.ADDRESS, Telephony.Sms.Sent.BODY, Telephony.Sms.Sent._ID, Telephony.Sms.Sent.ERROR_CODE, Telephony.Sms.Sent.TYPE }, // Select body text
            null,
            null,
            Telephony.Sms.Sent.DEFAULT_SORT_ORDER); // Default sort order
    int totalSMS = c.getCount();
    if (c.moveToFirst()) {
        for (int i = 0; i < totalSMS; i++) {
            String str = "To: " + c.getString(0) +
                    "\n" + c.getString(1) + "\n" + c.getString(2) + "\n" + c.getString(3) + "\n" + c.getString(4) + "\n";
            arrayAdapter.add(str);
            c.moveToNext();
        }
    } else {
    Toast.makeText(this, "Nothing here..!", Toast.LENGTH_SHORT).show();
    }
    c.close();
}

Это прекрасно работает для Telephony.Sms.Sent и Telephony.Sms.Inbox, но я не могу ничего вернутьиспользуя тот же код с Telephony.Sms.Outbox или Telephony.Sms.Draft

Я думаю, что у меня есть необходимые разрешения в манифесте;

<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

Вопрос: В идеале я хотел бы получитьвсе записи SMS на устройстве и обработка (например, удаление, повторная отправка) каждой из них в моем собственном коде ... есть ли способ, который я могу использовать для получения всех SMS-сообщений на устройстве за один раз, используя один запрос ...?

Днем позже ... некоторый прогресс ... этот код, использующий Telephony.Sms, получает все записи Отправлено и Входящие в одном запросе ...

    public void refreshSmsAll() {
    ContentResolver contentResolver = getContentResolver();
    arrayAdapter.clear();
    Cursor c = contentResolver.query(Telephony.Sms.CONTENT_URI, // Official CONTENT_URI from docs
            new String[] { Telephony.Sms.ADDRESS, Telephony.Sms.BODY, Telephony.Sms.TYPE, Telephony.Sms.ERROR_CODE, Telephony.Sms._ID }, // Select body text
            null,
            null,
            Telephony.Sms.Draft.DEFAULT_SORT_ORDER); // Default sort order
    int totalSMS = c.getCount();
    if (c.moveToFirst()) {
        for (int i = 0; i < totalSMS; i++) {
            String str = "X: " + c.getString(0) +
                    "\n" + c.getString(1) + "\n" + c.getString(2) + "\n" + c.getString(3) + "\n" + c.getString(4) + "\n";
            arrayAdapter.add(str);
            c.moveToNext();
        }
    } else {
Toast.makeText(this, "Nothing here..!", Toast.LENGTH_SHORT).show();
    }
    c.close();
}

Однако, чего он не получаетэто Исходящие и Черновик ... любые идеи, кто-нибудь ..?

Еще 2 часа спустя ... получение где-то с удалением сейчас ...

    public void onDeleteMsg(View view) {
    ContentResolver contentResolver = getContentResolver();
    boolean isSmsDeleted = false;
    try {
        contentResolver.delete(Telephony.Sms.CONTENT_URI, "_id=?",new String[] { "371" });
        isSmsDeleted = true;
        Toast.makeText(this, "Deleted..!", Toast.LENGTH_SHORT).show();
    } catch (Exception ex) {
        isSmsDeleted = false;
        Toast.makeText(this, "NOT Deleted..!", Toast.LENGTH_SHORT).show();
    }
}

Работает, только если мое приложение смсэто значение по умолчанию, что хорошо, так что это означает, что я должен вставлять и удалять сообщения в базе данных смс myself ..!

    public void onInsertMsg(View view) {
    ContentResolver contentResolver = getContentResolver();
    ContentValues values = new ContentValues();
    values.put(Telephony.Sms.ADDRESS, "123456789");
    values.put(Telephony.Sms.BODY, "The message");
    values.put(Telephony.Sms.TYPE, "2");
    boolean isSmsDeleted = false;
    try {
        contentResolver.insert(Telephony.Sms.CONTENT_URI,values);
        Toast.makeText(this, "Inserted..!", Toast.LENGTH_SHORT).show();
    } catch (Exception ex) {
        Toast.makeText(this, "NOT Inserted..!", Toast.LENGTH_SHORT).show();
    }
}

Сценарий. Наряду с большим количеством полученных / отправленных смс, я создал черновик сообщения и принудительно отправил сообщение с ошибкой, которое не появилось ни в одном запросе.

Интересно, что если я принудительно повторно отправлю сообщение об ошибке, оно появляется в запросе Sent на время повторной попытки, то его нет.

I'mпредполагая, что все, что я вижу в стандартном приложении обмена сообщениями для устройства, должно быть доступно для моего "домашнего" приложения, понимая, что могут быть некоторые ограничения в зависимости от того, какое из них является приложением SMS по умолчанию.

1 Ответ

0 голосов
/ 13 марта 2019

вы используете неправильные классы для получения смс.

Если вам нужно использовать эти классы для получения соответствующей информации:

Telephony.Sms.Inbox.CONTENT_URI - For Inbox message
Telephony.Sms.Sent.CONTENT_URI - For sent messages .

Ссылка: https://developer.android.com/reference/android/provider/Telephony.Sms.

Мой код Github для получения входящих SMS: https://github.com/meajay/SampleSmsApp/blob/master/app/src/main/java/assignment/com/smsapplication/utils/SmsAPI.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...