我花了 5 天时间尝试不同的东西,并在没有运气的情况下进行了大量谷歌搜索
我有一个广播接收器来监控和备份传入的彩信和短信。
短信 - 传出和传入很容易没问题。然而彩信...
我有一个接收彩信的广播接收器,没问题。
但是,对于外发彩信,我使用指向 content://mms 的内容观察者
这是从服务类注册内容观察者的部分
mo = new MMSObserver(new Handler(),getApplicationContext());
try{
getContentResolver().unregisterContentObserver(mo);
}
finally{
getContentResolver().registerContentObserver(Uri.parse("content://mms"), true, mo);
}
这是上面内容观察器中的onchange部分
public void onChange(boolean bSelfChange)
{
super.onChange(bSelfChange);
Log.i(TAG,"MMSObserver onChange");
ContentResolver contentResolver = context.getContentResolver();
Uri uri = Uri.parse("content://mms");
Cursor cur = contentResolver.quert("content://mms",null,null,null,null)
if(cur.moveToNext()){
String id = cur.getString(cur.getColumnIndex("_id"));
String date = cur.getString (cur.getColumnIndex ("date"));
String address = getAddress(id);
}
}
private static String getAddress(String id){
String selectionAdd = new String("msg_id=" + id);
String uriStr = MessageFormat.format("content://mms/{0}/addr", id);
Uri uriAddress = Uri.parse(uriStr);
Cursor cAdd = context.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;
}
问题是地址列总是为传出的彩信返回“插入地址 token ”。
有什么可能的方法来获得 mms 的数量吗?
我还注意到内容观察器在消息处于草稿形式时被触发,而不是在发送或待处理时触发。因为依赖于这些 uri 通常是一个坏主意,因为它们不是 sdk 的一部分,所以我切换到了不同的方法。对所有短信和彩信进行编目并存储它们的 _id 列,然后将它们与备份同步。但是我的问题仍然存在。
彩信地址栏总是“插入地址 token ”
有什么建议么?
最佳答案
你可能想尝试这样的事情:
Uri uri = Uri.parse("content://mms-sms/conversations/" + mThreadId);
String[] projection = new String[] {
"body", "person", "sub", "subject", "retr_st", "type", "date", "ct_cls", "sub_cs", "_id", "read", "ct_l", "st", "msg_box", "reply_path_present", "m_cls", "read_status", "ct_t", "status", "retr_txt_cs", "d_rpt", "error_code", "m_id", "date_sent", "m_type", "v", "exp", "pri", "service_center", "address", "rr", "rpt_a", "resp_txt", "locked", "resp_st", "m_size"
};
String sortOrder = "normalized_date";
Cursor mCursor = getActivity().getContentResolver().query(uri, projection, null, null, sortOrder);
String messageAddress;
int type;
while (mCursor.moveToNext()) {
String messageId = mCursor.getString(mCursor.getColumnIndex("_id"));
Uri.Builder builder = Uri.parse("content://mms").buildUpon();
builder.appendPath(messageId).appendPath("addr");
Cursor c = mContext.getContentResolver().query(builder.build(), new String[] {
"*"
}, null, null, null);
while (c.moveToNext()) {
messageAddress = c.getString(c.getColumnIndex("address"));
if (!messageAddress.equals("insert-address-token")) {
type = c.getInt(c.getColumnIndex("type"));
c.moveToLast();
}
}
c.close();
}
我实际上并没有在我的代码中调用 mCursor 的
moveToNext()
方法,而是在 getView()
的 SimpleCursorAdapter
方法中实现了这个逻辑。关于android - 如何在android中获取传出的彩信地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10380128/