Android 彩信发送者地址问题
我想知道寄件人的地址,但遇到了一个小问题。如果发送消息的人是任何对话中第一个发送消息的人,Android 彩信发送者地址问题,android,mms,Android,Mms,我想知道寄件人的地址,但遇到了一个小问题。如果发送消息的人是任何对话中第一个发送消息的人,content://mms/inbox返回的行数为零??但是当有人发送任何其他彩信时,它会返回\u id很好,我不明白为什么第一条不能正常工作 private String checkMmsMessages(Context context){ String address = "address"; Cursor curPdu = context.getContentResolver ().
content://mms/inbox
返回的行数为零??但是当有人发送任何其他彩信时,它会返回\u id
很好,我不明白为什么第一条不能正常工作
private String checkMmsMessages(Context context){
String address = "address";
Cursor curPdu = context.getContentResolver ().query(Uri.parse("content://mms/inbox"), null, null, null, null);
if(curPdu.moveToNext()){ //first MMS message curPdu.moveToNext() is false
String id = curPdu.getString (curPdu.getColumnIndex ("_id"));
Log.v("MMS", "ID1: " + id.toString());
Uri uriAddr = Uri.parse ("content://mms/" + id + "/addr");
Cursor curAddr = context.getContentResolver().query(uriAddr,null,"type=137",null,null);
if(curAddr.moveToNext()){
address = curAddr.getString (curAddr.getColumnIndex ("address"));
Log.v("MMS", "Address1: " + address.toString());
if(address.contentEquals("insert-address-token")){
Cursor curAddr2 = context.getContentResolver().query(uriAddr,null,"type=151", null,null);
if(curAddr2.moveToNext()){
address = curAddr2.getString(curAddr2.getColumnIndex("address"));
}
}
}
}
Log.v("MMS", address.toString());
return address;
}
还有一件没有意义的事情是,当我将手机插入计算机并使用调试器逐步完成该部分时,该问题不会发生,并且每次都会得到地址。。。。只有当手机未连接时才会发生这种情况,我只是不明白?我认为问题在于您正在将
selectionArgs
的值而不是null传递给query()
方法。实际上,我不是在代码中调用mCursor的moveToNext()
方法,而是在SimpleCursorAdapter
的getView()方法中实现此逻辑
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();
}
问题是,我在将消息放入数据库之前检查了数据库,因此我必须在检查上设置一个延迟
type=137
用于仅获取来自数据库表的传入消息,因为该表中有两种不同的类型,151
这是您发送的消息,而137
是您收到的消息。我可以确认这不是所有情况下的解决方案。
try this...
private String getAddressNumber(String id) {
String selectionAdd = new String("msg_id=" + id);
String uriStr = MessageFormat.format("content://mms/{0}/addr", id);
Uri uriAddress = Uri.parse(uriStr);
Cursor cursor = getContentResolver().query(uriAddress, null, selectionAdd, null, null);
String phoneNum = null;
if (cursor.moveToFirst()) {
do {
String number = cursor.getString(cursor.getColumnIndex("address"));
if (number != null) {
boolean isNumberFormat = true;
try {
Long.parseLong(number.replace("-", ""));
phoneNum = number;
} catch (NumberFormatException e) { // ex) "insert-address-token"
// if (phoneNum == null) {
// phoneNum = number;
// }
isNumberFormat = false;
}
if (isNumberFormat)
break;
}
} while (cursor.moveToNext());
}
if (cursor != null) {
cursor.close();
}
return phoneNum;
}