2011-08-10 14 views
6

携帯電話からの発信SMSメッセージの数をカウントするアプリケーションを作成しようとしています。現在、私は次のコードを持っている:私は1つのページのSMSメッセージを送信するとAndroid:SMSの発信、不正な番号の検出

private void listenForSMS(){ 
    Log.v("SMSTEST", "STARTED LISTENING FOR SMS OUTGOING"); 
    Handler handle = new Handler(){}; 

    SMSObserver myObserver = new SMSObserver(handle); 

    ContentResolver contentResolver = getContentResolver(); 
    contentResolver.registerContentObserver(Uri.parse("content://sms"),true, myObserver); 
} 

private class SMSObserver extends ContentObserver{ 

    int count = 0; 
    String lastMessage = null; 

    public SMSObserver(Handler handler) { 
     super(handler); 
    } 

    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 

     Log.v("SMSTEST", "HIT ON CHANGE"); 

     Uri uriSMSURI = Uri.parse("content://sms"); 
     Cursor cur = getContentResolver().query(uriSMSURI, null, null, 
        null, null); 
     cur.moveToNext(); 
     String protocol = cur.getString(cur.getColumnIndex("protocol")); 
     if(protocol == null){ 
      count++; 
      Log.v("SMSTEST", "SMS SENT: count: " + count); 
      String content = cur.getString(cur.getColumnIndex("body")); 

     }else{ 
      Log.v("SMSTEST", "SMS RECIEVED"); 
     } 
    } 
} 

を、onChangeは3回呼び出されます。 2ページのSMSメッセージを送信すると、onChangeが4回呼び出されます。 3ページのメッセージ、5回と呼ばれる。等々。

注: "content:// sms/sent"などのUri.parse("content://sms")の他のバリエーションを試しましたが、 "content:// sms"以外は何も呼び出されていません。onChangeが呼び出されました。

送信SMSメッセージを一意に識別し、送信されたSMSメッセージの数を正確に取得するにはどうすればよいですか?

+0

実際には非常に簡単な解決策が見つかりました。ちょうどwhileループを作成し、どこの日付> = someTimeをクエリします。 –

答えて

2

私の問題を解決しました。 SMSとMMSは、_id値によって一意に区別できます。

Uri uriSMSURI = Uri.parse("content://sms"); 
    Cursor cur = getContentResolver().query(uriSMSURI, null, null, 
       null, null); 
    cur.moveToNext(); 
String id = cur.getString(cur.getColumnIndex("_id")); 
0

送信SMSメッセージを一意に識別し、送信されたSMSメッセージの数を正確に取得するにはどうすればよいですか?

できません。

このコンテンツプロバイダーはAndroid SDKの一部ではありません。その使用は文書化されておらず、サポートされていません。さらに、任意のメッセージングクライアント(例えば、AOSPメッセンジャーアプリケーション)がそれを使用する方法は、それ自体は文書化されておらず、サポートされていない。 SMSを1回送信すると、コンテンツプロバイダーに1,337の変更が発生する可能性があり、知る方法はありません。さらに、発信SMSメッセージがこのまたは任意のコンテンツプロバイダに記録される必要もありません。 recent behaviorが表示されている場合は、Googleが今後このコンテンツプロバイダへの第三者アクセスを停止する可能性があります。

4

SMSメッセージを送信すると、メッセージのステータスが保存されます。それを解決するには、その種類を確認して、int type = c.getInt(c.getColumnIndex("type")); 3回のonchange()を記録:
第一:タイプ= 6
第二:タイプ= 4
第三:タイプ= 2(成功)
、あなたはあなたのを増やすことができますがカウンタ。
このケースは1人の受信者のみに適用されます。
受信者がさらに1人いる場合は、タイプを取得するために「thread_id」と「seen」を再クエリする必要があります。成功したメッセージの数を確認できます。
幸運を祈る!

+0

これは重複するsmsトリガーで見つけられる最良の解決策です。私の場合、発信SMSだけが3回トリガされました。着信SMSに関する問題はありません。 これらのステータスのそれぞれは何を表していますか? 6と4は何ですか?タイプ4が表示されません。タイプ6を初めて取得したとき、タイプ2を取得しました。タイプコードはデバイスごとに異なるのですか?これは信頼できますか? – nous

+0

@kevin:失敗シナリオを処理することは可能ですか? –

関連する問題