Знайти документацію з цього приводу досить складно, тому я зберу тут всю інформацію, яку знайшов. Якщо ви поспішаєте або просто не любите читати, перейдіть до розділу Як отримати дані із SMS .
вміст: // mms-sms / бесіди
Це URI постачальника послуг MMS та SMS ..., що дозволяє нам запитувати бази даних MMS та SMS одночасно та змішувати їх в одному потоці (що називається розмовами ).
Чому 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
Зміст останнього 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.