Трудно найти документацию по этому поводу, поэтому я соберу здесь всю информацию, которую нашел. Если вы спешите или просто не любите читать, перейдите к разделу Как получить данные из раздела SMS .
содержание: // MMS-SMS / разговоры
Это URI поставщика Mms и SMS ..., который позволяет нам одновременно запрашивать базы данных MMS и SMS и смешивать их в одном потоке (которые называются * 1009). * разговоры ).
Почему важен URI? Ну, это стандартный способ получения сообщений MMS и SMS; например, когда вы получите SMS и нажмете на панель уведомлений, он отправит сообщение о трансляции, например: content://mms-sms/conversations/XXX
, где XXX
- идентификатор разговора.
Получить список всех разговоров
Единственное, что вам нужно сделать, это запросить content://mms-sms/conversations
Uri:
ContentResolver contentResolver = getContentResolver();
final String[] projection = new String[]{"*"};
Uri uri = Uri.parse("content://mms-sms/conversations/");
Cursor query = contentResolver.query(uri, projection, null, null, null);
Примечание: обычно, когда вы вызываете query
и хотите вернуть все столбцы, вы можете передать null
в качестве параметра projection
. Однако вы не можете сделать это с этим провайдером, поэтому я использую *
.
Теперь вы можете перебирать Cursor
как обычно. Вот наиболее важные столбцы, которые вы хотели бы использовать:
_id
- идентификатор сообщения. Капитан очевиден для спасения? Не совсем. Этот идентификатор можно использовать для получения подробной информации, используя content://sms
или content://mms
.
date
объяснений не требуется.
thread_id
- идентификатор разговора
body
Содержание последнего СМС в этом разговоре. Если это MMS, даже если оно имеет текстовую часть, это будет null
.
Примечание: , если вы запросите content://mms-sms/conversations
, он вернет список различных разговоров, для которых _id
является последним SMS или MMS в каждом разговоре. Если вы запросите content://mms-sms/conversations/xxx
, он вернет каждое SMS и / или MMS в разговоре с идентификатором xxx
.
Как различить SMS и MMS
Обычно вы хотите знать, какой тип сообщения вы обрабатываете. Документация гласит:
Виртуальный столбец,
MmsSms.TYPE_DISCRIMINATOR_COLUMN
, май
быть запрошенным в прогнозе для
запрос. Его значение либо "ммс", либо
"смс", в зависимости от того,
сообщение, представленное строкой, является
MMS-сообщение или SMS-сообщение,
соответственно.
Я думаю, что это относится к этой переменной ... однако я не смог заставить ее работать. Если у вас есть, пожалуйста, сообщите мне, как или отредактировать этот пост.
Пока что это то, что я сделал, и, похоже, это работает, но должны быть лучшие способы:
ContentResolver contentResolver = getContentResolver();
final String[] projection = new String[]{"_id", "ct_t"};
Uri uri = Uri.parse("content://mms-sms/conversations/");
Cursor query = contentResolver.query(uri, projection, null, null, null);
if (query.moveToFirst()) {
do {
String string = query.getString(query.getColumnIndex("ct_t"));
if ("application/vnd.wap.multipart.related".equals(string)) {
// it's MMS
} else {
// it's SMS
}
} while (query.moveToNext());
}
Как получить данные из SMS
Итак, у вас есть идентификатор SMS, тогда единственное, что вам нужно сделать, это:
String selection = "_id = "+id;
Uri uri = Uri.parse("content://sms");
Cursor cursor = contentResolver.query(uri, null, selection, null, null);
String phone = cursor.getString(cursor.getColumnIndex("address"));
int type = cursor.getInt(cursor.getColumnIndex("type"));// 2 = sent, etc.
String date = cursor.getString(cursor.getColumnIndex("date"));
String body = cursor.getString(cursor.getColumnIndex("body"));
Как получить данные из данных MMS?
MMS немного отличаются. Они могут быть построены с различными частями (текст, аудио, изображения и т. Д.); поэтому здесь будет показано, как получить каждый тип данных отдельно.
Итак, давайте предположим, что у нас есть идентификатор MMS в переменной mmsId
. Мы можем получить подробную информацию об этом MMS с помощью поставщика content://mms/
:
Uri uri = Uri.parse("content://mms/");
String selection = "_id = " + mmsId;
Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
Однако, единственный интересный столбец - это read
, который равен 1
, если сообщение уже прочитано.
Как получить текстовый контент из MMS
Здесь мы должны использовать content://mms/part
... например:
String selectionPart = "mid=" + mmsId;
Uri uri = Uri.parse("content://mms/part");
Cursor cursor = getContentResolver().query(uri, null,
selectionPart, null, null);
if (cursor.moveToFirst()) {
do {
String partId = cursor.getString(cursor.getColumnIndex("_id"));
String type = cursor.getString(cursor.getColumnIndex("ct"));
if ("text/plain".equals(type)) {
String data = cursor.getString(cursor.getColumnIndex("_data"));
String body;
if (data != null) {
// implementation of this method below
body = getMmsText(partId);
} else {
body = cursor.getString(cursor.getColumnIndex("text"));
}
}
} while (cursor.moveToNext());
}
Он может содержать разные части текста ... но обычно это будет только один. Так что если вы хотите удалить цикл, он будет работать большую часть времени. Вот как выглядит метод getMmsText
:
private String getMmsText(String id) {
Uri partURI = Uri.parse("content://mms/part/" + id);
InputStream is = null;
StringBuilder sb = new StringBuilder();
try {
is = getContentResolver().openInputStream(partURI);
if (is != null) {
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
BufferedReader reader = new BufferedReader(isr);
String temp = reader.readLine();
while (temp != null) {
sb.append(temp);
temp = reader.readLine();
}
}
} catch (IOException e) {}
finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {}
}
}
return sb.toString();
}
Как получить изображение из MMS
Это то же самое, что получить текстовую часть ... единственное отличие в том, что вы будете искать другой тип пантомимы:
String selectionPart = "mid=" + mmsId;
Uri uri = Uri.parse("content://mms/part");
Cursor cPart = getContentResolver().query(uri, null,
selectionPart, null, null);
if (cPart.moveToFirst()) {
do {
String partId = cPart.getString(cPart.getColumnIndex("_id"));
String type = cPart.getString(cPart.getColumnIndex("ct"));
if ("image/jpeg".equals(type) || "image/bmp".equals(type) ||
"image/gif".equals(type) || "image/jpg".equals(type) ||
"image/png".equals(type)) {
Bitmap bitmap = getMmsImage(partId);
}
} while (cPart.moveToNext());
}
Вот как выглядит метод getMmsImage
:
private Bitmap getMmsImage(String _id) {
Uri partURI = Uri.parse("content://mms/part/" + _id);
InputStream is = null;
Bitmap bitmap = null;
try {
is = getContentResolver().openInputStream(partURI);
bitmap = BitmapFactory.decodeStream(is);
} catch (IOException e) {}
finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {}
}
}
return bitmap;
}
Как получить адрес отправителя
Вам нужно будет использовать провайдера content://mms/xxx/addr
, где xxx
- это идентификатор MMS:
private String getAddressNumber(int id) {
String selectionAdd = new String("msg_id=" + id);
String uriStr = MessageFormat.format("content://mms/{0}/addr", id);
Uri uriAddress = Uri.parse(uriStr);
Cursor cAdd = getContentResolver().query(uriAddress, null,
selectionAdd, null, null);
String name = null;
if (cAdd.moveToFirst()) {
do {
String number = cAdd.getString(cAdd.getColumnIndex("address"));
if (number != null) {
try {
Long.parseLong(number.replace("-", ""));
name = number;
} catch (NumberFormatException nfe) {
if (name == null) {
name = number;
}
}
}
} while (cAdd.moveToNext());
}
if (cAdd != null) {
cAdd.close();
}
return name;
}
Заключительные мысли
- Не могу понять, почему Google с этими тысячами миллионов долларов не платит ни студенту, ни кому-либо еще за документирование этого API. Вы должны проверить исходный код, чтобы узнать, как он работает, и, что еще хуже, они не публикуют те константы, которые используются в столбцах базы данных, поэтому мы должны написать их вручную.
- Для других видов данных внутри MMS вы можете применить ту же идею, что и выше ... это просто вопрос знания типа mime.