【问题标题】:How can I get an outgoing mms's address in android如何在android中获取传出mms的地址
【发布时间】:2012-04-30 07:40:47
【问题描述】:

我花了 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;
    }

问题是地址栏总是为传出的 mms 返回“插入地址令牌”。 有没有什么办法可以得到mms要去的号码?

我还注意到,内容观察器在消息处于草稿形式时被触发,而不是在发送或待处理时触发。因为依赖这些uris通常是一个坏主意,因为它们不是sdk的一部分,所以我改用了另一种方法。对所有短信和彩信进行编目并存储它们的 _id 列,然后将它们与备份同步。但是我的问题仍然存在。

彩信地址栏始终为“插入地址令牌”

有什么建议吗?

【问题讨论】:

  • insert-address-tokentype 值是什么 - 它应该是 137 - 但它应该还伴随着一个包含实际的类型 151 address 值。你只得到一行?

标签: android uri mms contentobserver


【解决方案1】:

你可能想尝试这样的事情:

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() 方法,而是在 SimpleCursorAdaptergetView() 方法中实现此逻辑。

【讨论】:

  • 这是不安全的,并不是你projection中的所有字段都存在于所有版本的android中,在任何情况下你都不需要它们。
  • 虽然我应该指出,如果 OP 要备份消息,那么使用空保护并按原样保存整个数据库会更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2015-01-08
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多