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/XXX
Wo XXX
ist die ID der Konversation?
Holen Sie sich eine Liste aller Gespräche
Das einzige, was Sie tun müssen, ist die content://mms-sms/conversations
Uri 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 query
alle Spalten aufrufen und zurückgeben möchten, können Sie sie normalerweise null
als projection
Parameter übergeben. Bei diesem Anbieter ist dies jedoch nicht möglich. Deshalb verwende ich *
.
Jetzt können Sie das Cursor
wie gewohnt durchlaufen . Dies sind die wichtigeren Spalten, die Sie verwenden möchten:
_id
ist die ID der Nachricht. Kapitän offensichtlich zur Rettung? Nicht wirklich. Diese ID kann verwendet werden, um detaillierte Informationen mit entweder content://sms
oder abzurufen content://mms
.
date
Keine Erklärung erforderlich.
thread_id
ist die ID des Gesprächs
body
Der 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 _id
es 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_COLUMN
kann 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 mmsId
Variablen. 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 read
jedoch, 1
ob 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 getMmsText
Methode 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 getMmsImage
Methode 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/addr
Anbieter verwenden, wobei xxx
die 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.db
Datenbank ist Teil der Firmware und für Android-Anwendungen nicht zugänglich. Dercontent://mms-sms/conversations
Inhaltsanbieter ist nicht Teil des SDK und sollte nicht von Android-Anwendungen aufgerufen werden.