Il est assez difficile de trouver de la documentation à ce sujet, je vais donc rassembler ici toutes les informations que j'ai trouvées. Si vous êtes pressé ou si vous n'aimez pas lire, passez directement à l'adresse suivante Comment obtenir des données à partir d'un SMS section.
contenu://mms-sms/conversations
Il s'agit de l'URI de la Fournisseur de MMS et de SMS ... qui nous permet d'interroger les bases de données MMS et SMS en même temps, et de les mélanger dans un seul thread (qui sont appelés conversations ).
Pourquoi l'URI est-il important ? Eh bien, c'est la manière standard de recevoir des MMS et des SMS ; par exemple, lorsque vous recevez un SMS et que vous cliquez sur la barre de notification, celle-ci envoie une intention de diffusion comme celle-ci : content://mms-sms/conversations/XXX
où XXX
est l'identifiant de la conversation.
Obtenir une liste de toutes les conversations
La seule chose que vous devez faire est d'interroger le site Web de la Commission européenne. 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);
Note : En général, quand vous appelez query
et que vous voulez retourner toutes les colonnes, vous pouvez passer null
comme le projection
paramètre. Cependant, vous ne pouvez pas le faire avec ce fournisseur, c'est pourquoi j'utilise le paramètre *
.
Maintenant vous pouvez boucler à travers le Cursor
comme d'habitude. Ce sont les colonnes les plus importantes que vous voudrez utiliser :
-
_id
est l'identifiant du message. Le capitaine évident à la rescousse ? Pas vraiment. Cet identifiant peut être utilisé pour récupérer des informations détaillées en utilisant soit content://sms
ou content://mms
.
-
date
aucune explication n'est nécessaire.
-
thread_id
est l'ID de la conversation
-
body
Le contenu du dernier SMS de cette conversation. S'il s'agit d'un MMS, même s'il a une partie texte, ce sera null
.
Note : si vous interrogez content://mms-sms/conversations
il retournera une liste de différentes conversations dont _id
est le dernier SMS ou MMS de chaque conversation. Si vous interrogez content://mms-sms/conversations/xxx
il retournera chaque SMS et/ou MMS sur la conversation dont l'ID est xxx
.
Comment faire la différence entre les SMS et les MMS
En général, vous voudrez savoir quel type de message vous traitez. La documentation le dit :
Une colonne virtuelle, MmsSms.TYPE_DISCRIMINATOR_COLUMN
peut être demandée dans la projection d'une requête. Sa valeur est soit "mms", soit "sms", selon que le message message représenté par la ligne est un message message MMS ou un message SMS, respectivement.
Je pense qu'il s'agit de cette variable ... mais je n'ai pas réussi à le faire fonctionner. Si vous l'avez fait, dites-moi comment ou modifiez ce message.
Jusqu'à présent, c'est ce que j'ai fait et cela semble fonctionner, mais il doit y avoir de meilleures méthodes :
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());
}
Comment obtenir des données à partir d'un SMS
Donc vous avez l'ID du SMS, alors la seule chose que vous avez à faire est :
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"));
Comment récupérer les données d'un MMS ?
Les MMS sont un peu différents. Ils peuvent être constitués de différentes parties (texte, audio, images, etc.). Nous allons donc voir comment récupérer chaque type de données séparément.
Supposons que nous ayons l'identifiant du MMS dans le champ mmsId
variable. Nous pouvons obtenir des informations détaillées sur ce MMS en utilisant la variable content://mms/
fournisseur :
Uri uri = Uri.parse("content://mms/");
String selection = "_id = " + mmsId;
Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
Cependant, la seule colonne intéressante est read
qui est 1
si le message a déjà été lu.
Comment récupérer le contenu textuel d'un MMS
Ici, nous devons utiliser content://mms/part
... par exemple :
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());
}
Elle peut contenir différentes parties de texte... mais en général, il n'y en a qu'une seule. Ainsi, si vous voulez supprimer la boucle, cela fonctionnera la plupart du temps. Voici comment la getMmsText
ressemble à une méthode :
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();
}
Comment obtenir une image à partir d'un MMS
C'est la même chose que de récupérer la partie texte... la seule différence est que vous chercherez un type de mime différent :
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());
}
C'est ainsi que le getMmsImage
ressemble à une méthode :
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;
}
Comment obtenir l'adresse de l'expéditeur
Vous devrez utiliser le content://mms/xxx/addr
où xxx
est l'identifiant du 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;
}
Dernières réflexions
- Je ne comprends pas pourquoi Google, avec ces milliers de millions de dollars, ne paie pas un étudiant ou quelqu'un d'autre pour documenter cette API. Vous devez vérifier le code source pour savoir comment cela fonctionne et, ce qui est pire, ils ne rendent pas publiques les constantes utilisées dans les colonnes de la base de données, nous devons donc les écrire manuellement.
- Pour d'autres types de données dans un MMS, vous pouvez appliquer la même idée que ci-dessus... il s'agit simplement de connaître le type de mime.
0 votes
La base de données
mmssms.db
fait partie du micrologiciel et n'est pas accessible par les applications Android. Le fournisseur de contenucontent://mms-sms/conversations
ne fait pas partie du SDK et ne doit pas être accédé par les applications Android.0 votes
Je fais quelque chose de similaire ICI! stackoverflow.com/questions/11556633/…