Работает над приложением 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 по умолчанию.