Es ist schwierig, eine Dokumentation darüber zu finden, deshalb werde ich hier alle Informationen sammeln, die ich gefunden habe. Wenn Sie in Eile sind oder einfach nicht lesen möchten, springen Sie zum Abschnitt So erhalten Sie Daten aus einer SMS .
Inhalt: // mms-sms / gespräche
Dies ist die URI des MMS- und SMS-Anbieters ... mit der wir die MMS- und SMS-Datenbanken gleichzeitig abfragen und in einem einzigen Thread (sogenannte Konversationen ) mischen können .
Warum ist die URI wichtig? Nun, das ist die Standardmethode, um MMS- und SMS-Nachrichten zu erhalten. Wenn Sie beispielsweise eine SMS empfangen und auf die Benachrichtigungsleiste klicken, wird eine Broadcast-Absicht wie folgt gesendet: content://mms-sms/conversations/XXXWo XXXist die ID der Konversation?
Holen Sie sich eine Liste aller Gespräche
Das einzige, was Sie tun müssen, ist die content://mms-sms/conversationsUri abzufragen :
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);
Hinweis: Wenn Sie queryalle Spalten aufrufen und zurückgeben möchten, können Sie sie normalerweise nullals projectionParameter übergeben. Bei diesem Anbieter ist dies jedoch nicht möglich. Deshalb verwende ich *.
Jetzt können Sie das Cursorwie gewohnt durchlaufen . Dies sind die wichtigeren Spalten, die Sie verwenden möchten:
_idist die ID der Nachricht. Kapitän offensichtlich zur Rettung? Nicht wirklich. Diese ID kann verwendet werden, um detaillierte Informationen mit entweder content://smsoder abzurufen content://mms.
date Keine Erklärung erforderlich.
thread_id ist die ID des Gesprächs
bodyDer Inhalt der letzten SMS zu diesem Gespräch. Wenn es sich um eine MMS handelt, auch wenn sie einen Textteil enthält, ist dies der Fall null.
Hinweis: Wenn Sie eine Abfrage durchführen content://mms-sms/conversations, wird eine Liste verschiedener Konversationen zurückgegeben, bei denen _ides sich um die letzte SMS oder MMS in jeder Konversation handelt. Wenn Sie abfragen content://mms-sms/conversations/xxx, wird jede SMS und / oder MMS in der Konversation zurückgegeben, deren ID lautet xxx.
So unterscheiden Sie zwischen SMS und MMS
Normalerweise möchten Sie wissen, welche Art von Nachricht Sie bearbeiten. Die Dokumentation sagt:
Eine virtuelle Spalte
MmsSms.TYPE_DISCRIMINATOR_COLUMNkann in der Projektion für eine Abfrage angefordert werden. Sein Wert ist entweder "mms" oder "sms", abhängig davon, ob die durch die Zeile dargestellte Nachricht eine MMS-Nachricht oder eine SMS-Nachricht ist.
Ich denke, es bezieht sich auf diese Variable ... aber ich konnte es nicht zum Laufen bringen. Wenn Sie haben, sagen Sie mir bitte, wie oder bearbeiten Sie diesen Beitrag.
Bisher habe ich das getan und es scheint zu funktionieren, aber es muss bessere Wege geben:
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());
}
So erhalten Sie Daten aus einer SMS
Sie haben also die ID der SMS und müssen dann nur noch Folgendes tun:
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"));
Wie erhalte ich Daten aus MMS-Daten?
MMS sind etwas anders. Sie können aus verschiedenen Teilen (Text, Audio, Bilder usw.) bestehen. Hier erfahren Sie, wie Sie jede Art von Daten separat abrufen.
Nehmen wir also an, wir haben die MMS-ID in der mmsIdVariablen. Detaillierte Informationen zu dieser MMS erhalten Sie über den content://mms/Anbieter:
Uri uri = Uri.parse("content://mms/");
String selection = "_id = " + mmsId;
Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
Die einzige interessante Spalte ist readjedoch, 1ob die Nachricht bereits gelesen wurde.
So erhalten Sie Textinhalte von MMS
Hier müssen wir verwenden content://mms/part... zum Beispiel:
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());
}
Es könnte verschiedene Textteile enthalten ... aber normalerweise ist es nur einer. Wenn Sie also die Schleife entfernen möchten, funktioniert dies meistens. So sieht die getMmsTextMethode aus:
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();
}
So erhalten Sie ein Bild von MMS
Es ist dasselbe wie das Erhalten des Textteils ... der einzige Unterschied besteht darin, dass Sie nach einem anderen MIME-Typ suchen:
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());
}
So sieht die getMmsImageMethode aus:
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;
}
So erhalten Sie die Absenderadresse
Sie müssen den content://mms/xxx/addrAnbieter verwenden, wobei xxxdie ID der MMS lautet:
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;
}
Abschließende Gedanken
- Ich kann nicht verstehen, warum Google mit diesen Tausenden von Millionen Dollar keinen Studenten oder eine andere Person bezahlt, um diese API zu dokumentieren. Sie müssen den Quellcode überprüfen, um zu wissen, wie er funktioniert, und was noch schlimmer ist, sie machen die in den Spalten der Datenbank verwendeten Konstanten nicht öffentlich, daher müssen wir sie manuell schreiben.
- Für andere Arten von Daten in einer MMS können Sie dieselbe Idee anwenden, die Sie oben gelernt haben. Es geht nur darum, den MIME-Typ zu kennen.
mmssms.dbDatenbank ist Teil der Firmware und für Android-Anwendungen nicht zugänglich. Dercontent://mms-sms/conversationsInhaltsanbieter ist nicht Teil des SDK und sollte nicht von Android-Anwendungen aufgerufen werden.