Android obtient des sms de la boîte de réception, manière optimisée de lire tous les messages et de les grouper
Salut suis mise en œuvre d'une Application SMS, maintenant je suis en mesure de récupérer tous les messages avec leurs infos de contact comme nom d'affichage, photo uri.. et je suis de les afficher dans une liste personnalisée où sur l'élément, cliquez sur vous emmène à discussions. Voici mon problèmes est le moment de prendre de synchroniser tous ces messages,
- J'ai besoin pour optimiser ce temps.
- Chaque fois que j'envoie un nouveau message dans la discussion de la vue et de revenir à la récente chats j'ai besoin de mettre à jour uniquement le point, pas toute la liste.
Voici mon code:
ReadSMS.java:
public class ReadSMS {
ArrayList<HashMap<Contact, ArrayList<OneComment>>> recentChats;
Application _context;
public ReadSMS(Application context) {
this._context = context;
this.recentChats = ((ChatApplication) _context).getChats();
}
public ArrayList<HashMap<Contact, ArrayList<OneComment>>> getSMS() {
//Init
ArrayList<SmsMsg> smsMsgs = new ArrayList<SmsMsg>();
TreeSet<Integer> threadIds = new TreeSet<Integer>();
Uri mSmsinboxQueryUri = Uri.parse("content://sms");
Cursor cursor = _context.getContentResolver().query(
mSmsinboxQueryUri,
new String[] { "_id", "thread_id", "address", "date", "body",
"type" }, null, null, null);
String[] columns = new String[] { "address", "thread_id", "date",
"body", "type" };
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
SmsMsg smsMsg = new SmsMsg();
String address = null, displayName = null, date = null, msg = null, type = null, threadId = null;
Uri photoUri = null;
threadId = cursor.getString(cursor.getColumnIndex(columns[1]));
type = cursor.getString(cursor.getColumnIndex(columns[4]));
if (Integer.parseInt(type) == 1 || Integer.parseInt(type) == 2) {
address = cursor.getString(cursor
.getColumnIndex(columns[0]));
if (address.length() > 0) {
String[] contactData = getContactByNumber(address);
if (contactData != null) {
displayName = contactData[0];
if (contactData[1] != null)
photoUri = Uri.parse(contactData[1]);
}
} else
address = null;
date = cursor.getString(cursor.getColumnIndex(columns[2]));
msg = cursor.getString(cursor.getColumnIndex(columns[3]));
smsMsg.setDisplayName(displayName);
smsMsg.setThreadId(threadId);
smsMsg.setAddress(address);
smsMsg.setPhotoUri(photoUri);
smsMsg.setDate(date);
smsMsg.setMsg(msg);
smsMsg.setType(type);
//Log.e("SMS-inbox", "\n\nNAME: " + displayName
//+ "\nTHREAD_ID: " + threadId + "\nNUMBER: "
//+ address + "\nPHOTO_URI: " + photoUri + "\nTIME: "
//+ date + "\nMESSAGE: " + msg + "\nTYPE: " + type);
smsMsgs.add(smsMsg);
//Add threadId to Tree
threadIds.add(Integer.parseInt(threadId));
}
}
for (int threadId : threadIds) {
HashMap<Contact, ArrayList<OneComment>> oneChat = new HashMap<Contact, ArrayList<OneComment>>();
Contact con = new Contact();
ArrayList<OneComment> oneDisc = new ArrayList<OneComment>();
for (SmsMsg smsMsg : smsMsgs) {
if (Integer.parseInt(smsMsg.getThreadId()) == threadId) {
con.setContactName(smsMsg.getDisplayName());
con.setContactNumber(smsMsg.getAddress());
con.setContactPhotoUri(smsMsg.getPhotoUri());
if (Integer.parseInt(smsMsg.getType()) == 1)
oneDisc.add(0, new OneComment(true,
smsMsg.getMsg(), smsMsg.getDisplayName(),
smsMsg.getDate(), false));
else if (Integer.parseInt(smsMsg.getType()) == 2)
oneDisc.add(0,
new OneComment(false, smsMsg.getMsg(),
"Me", smsMsg.getDate(), false));
}
}
oneChat.put(con, oneDisc);
//add at pos 0
recentChats.add(0, oneChat);
}
}
return recentChats;
}
public String[] getContactByNumber(final String number) {
String[] data = new String[2];
try {
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
Uri.encode(number));
Cursor cur = _context.getContentResolver().query(uri,
new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup._ID },
null, null, null);
if (cur.moveToFirst()) {
int nameIdx = cur.getColumnIndex(PhoneLookup.DISPLAY_NAME);
data[0] = cur.getString(nameIdx);
String contactId = cur.getString(cur
.getColumnIndex(PhoneLookup._ID));
Uri photoUri = getContactPhotoUri(Long.parseLong(contactId));
if (photoUri != null)
data[1] = photoUri.toString();
else
data[1] = null;
cur.close();
return data;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public Uri getContactPhotoUri(long contactId) {
Uri photoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI,
contactId);
photoUri = Uri.withAppendedPath(photoUri,
Contacts.Photo.CONTENT_DIRECTORY);
return photoUri;
}
}
SmsMsg.java POJO:
public class SmsMsg {
private String address = null;
private String displayName = null;
private String threadId = null;
private String date = null;
private String msg = null;
private String type = null;
Uri photoUri = null;
public Uri getPhotoUri() {
return photoUri;
}
public void setPhotoUri(Uri photoUri) {
this.photoUri = photoUri;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getThreadId() {
return threadId;
}
public void setThreadId(String threadId) {
this.threadId = threadId;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
source d'informationauteur sukarno
Vous devez vous connecter pour publier un commentaire.
POJO de stockage n'est pas une bonne approche car ceux-ci sont tenus de rester dans la mémoire de tous les temps, ou bien être rechargé causant de la douleur et de la lenteur.
Dans ce cas, vous devez créer un Service qui met à jour une base de données sqlite, et à le présenter comme un ContentProvider. La db sqlite ne doit contenir que la structure qui n'est pas fourni par Android, c'est à dire votre Contact/Threads hiérarchie, et toutes les données qui vous pouvez afficher dans votre liste, comme le texte du message le plus récent.
Ce fil a une discussion sur la façon de détecter les nouveaux SMS Message d'arrivée/envoie, que ce soit à partir de votre application ou d'une autre, ce qui est probablement ce que vous voulez vraiment, plutôt que de simplement détecter que l'utilisateur a posté un message à partir de votre propre application. Le Service doit effectuer cette tâche, l'INTERFACE de l'Activité doit observer le ContentProvider.
De côté: je me demande comment l'utilisateur envoyer un message à un contact à qui ils n'ont pas encore envoyé un message depuis votre liste contient uniquement les contacts qui ils ont envoyé des messages.
Vous pourriez avoir besoin de fournir plus de détails quant à la façon dont vous vous approchez vers la direction, en particulier la façon dont de nombreuses activités vous sont avoir (il semble comme il y en a deux).
En supposant que il y en a deux, dans la Première Activité, n'essayez pas d'attraper chaque message juste obtenir toutes les thread_Ids et adresses.
Alors que l'utilisateur clique sur un des éléments de la liste, puis d'exécuter d'autres thread pour lire tous les messages appartient à ce thread.
utiliser les éléments suivants:
pour la lecture de la boîte de réception et prise en thread_Ids et de l'adresse et de les stocker pour certaines java classe modale c'est à dire DTO
et remplir la liste et que l'utilisateur clique sur un des articles de la passer sur la thread_id puis une requête de ce genre pour obtenir toute la conversation c'est à dire thread.