Знайти документацію з цього приводу досить складно, тому я зберу тут всю інформацію, яку знайшов. Якщо ви поспішаєте або просто не любите читати, перейдіть до розділу Як отримати дані із SMS .
вміст: // mms-sms / бесіди
Це URI постачальника послуг MMS та SMS ..., що дозволяє нам запитувати бази даних MMS та SMS одночасно та змішувати їх в одному потоці (що називається розмовами ).
Чому URI важливий? Ну, це стандартний спосіб отримання MMS та SMS-повідомлень; наприклад, коли ви отримуєте SMS і клацаєте на панелі сповіщень, він надсилає намір трансляції, такий як:, content://mms-sms/conversations/XXXде XXXідентифікатор розмови.
Отримайте список усіх бесід
Єдине, що вам потрібно зробити, це запитати content://mms-sms/conversationsUri:
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Зміст останнього SMS у цій розмові. Якщо це 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", залежно від того, чи є повідомлення, представлене рядком, 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)) {
} else {
}
} 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"));
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) {
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
Це те саме, що отримання текстової частини ... єдина різниця полягає в тому, що ви будете шукати інший тип mime:
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.
mmssms.dbданих є частиною мікропрограми та не доступна програмам Android. Постачальникcontent://mms-sms/conversationsвмісту не є частиною SDK і не повинен бути доступним для програм Android.