2012-04-30 15 views
3

に発信MMSのアドレスを取得することができ、私は& SMSを監視し、バックアップの着信MMSする放送受信機を持っている運はどのように私はアンドロイド

とグーグルの異なるものと多くを試して5日間費やしてきました。 sms - 発信と着信は問題ありません。しかし、MMS ...

私は着信MMS用の放送受信機を持っていますが、問題はありません。発信MMS用

しかし、私はコンテンツに向けたコンテンツオブザーバを使用:// MMSは

HERESに一部はこれが中のonchange一部であるサービスクラスから

mo = new MMSObserver(new Handler(),getApplicationContext()); 
     try{ 
      getContentResolver().unregisterContentObserver(mo); 
     } 
     finally{ 
      getContentResolver().registerContentObserver(Uri.parse("content://mms"), true, mo); 
     } 

をコンテンツオブザーバを登録上記のコンテンツオブザーバ

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; 
    } 

問題は、アドレス列は常に発信用の「挿入アドレストークン」を返すことです。 ミリ秒単位の数値を得る方法はありますか?

また、メッセージが送信または保留中でない場合に、メッセージがドラフト形式であるときに、コンテンツオブザーバが起動されることに気付きました。なぜなら、彼らはsdkの一部ではないので、これらのurisに依存するのは一般的に悪い考えですから、私は別の方法に切り替えました。すべてのsms & mmsメッセージをカタログ化し、その_id列を格納し、それらをバックアップと同期させるだけです。しかし、私の問題はまだ残っています。

MMSアドレスの欄には、常に「挿入アドレス・トークン」を

任意の提案ですか?

+0

'insert-address-token'の' type'値は '137'でなければなりませんが、実際の' address'値を含む型 '151'を伴わなければなりません。一行しか得られないのですか? – Jens

答えて

0

あなたはこのような何かを試してみたいことがあります。

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()方法でこのロジックを実装しています。

+0

これは安全ではありません。あなたの 'projection'のすべてのフィールドがすべてのバージョンのアンドロイドに存在するわけではありません。 – vikki

+0

私は、OPがメッセージをバックアップしようとしている場合、null保護を使用してdb全体をそのまま保存するほうがはるかに安全であることを指摘しておきます。 – vikki