12

私は現在、次のURI「content:// sms /」にコンテンツオブザーバーを登録して、送信される着信メッセージと発信メッセージをリッスンしています。

これは問題なく機能しているようで、SMSデータベースからも削除しようとしましたが、次のURI「content:// sms /conversations/」からスレッド全体を削除することしかできません。

これが私がそのために使用するコードです

String url = "content://sms/"; 
        Uri uri = Uri.parse(url); 
        getContentResolver().registerContentObserver(uri, true, new MyContentObserver(handler));                    

}

class MyContentObserver extends ContentObserver { 

    public MyContentObserver(Handler handler) { 

        super(handler); 

    }

@Override public boolean deliverSelfNotifications() { 
    return false; 
    }

@Override public void onChange(boolean arg0) { 
    super.onChange(arg0);

     Log.v("SMS", "Notification on SMS observer"); 

    Message msg = new Message(); 
    msg.obj = "xxxxxxxxxx";

    handler.sendMessage(msg);

    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){
           Log.d("SMS", "SMS SEND"); 
           int threadId = cur.getInt(cur.getColumnIndex("thread_id"));

           Log.d("SMS", "SMS SEND ID = " + threadId); 
           Cursor c = getContentResolver().query(Uri.parse("content://sms/outbox/" + threadId), null, null,
                   null, null);
           c.moveToNext();
           int p = cur.getInt(cur.getColumnIndex("person"));
           Log.d("SMS", "SMS SEND person= " + p); 
           //getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadId), null, null);

    }
    else{
        Log.d("SMS", "SMS RECIEVE");  
         int threadIdIn = cur.getInt(cur.getColumnIndex("thread_id"));

         getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null);
    }

 }


} 

ただし、SMSコンテンツプロバイダーから受信者とメッセージテキストを取得できるようにしたいのですが、これを行う方法を教えてもらえますか?

また、スレッド全体ではなく1つのメッセージを削除する方法もありますか?

4

2 に答える 2

10

これはすでに議論されました。

コンテンツプロバイダーからSMSを読み取るには、以下を確認してください。--android-1-5-reading-sms-messages

このスレッドを確認してください:

単一のSMSではなくスレッド全体を削除しているというコメントについて:このコードを試しましたか?

于 2010-04-06T11:15:06.670 に答える
4

アドレス列には、SMS送信者の電話番号が含まれています。

cursor.getString(cursor.getColumnIndex( "address"))を使用して、電話番号を文字列としてプルします。content:// smsにカーソルを置き、日付の降順で並べ替えて、最新のメッセージを取得します。新しいメッセージがテーブルに入るのを待つ必要があります。そうしないと、間違ったメッセージから情報を取得することになります。着信SMSbroadcastReceiverでは、スレッドでwhileループを使用して、cursor.getCount()をポーリングして変更します。次に、whileループの後にcursor.moveToFirstが新しいメッセージになります。

例えば:

Cursor cur = getContentResolver().query(Uri.parseUri(content://sms), null, null, null, null);
int count = cur.getCount();
while (cur.getCount() == count)
{
     Thread.sleep(1000);
     cur = getContentResolver().query(Uri.parseUri(content://sms), null, null, null, null);
}

次に、SMS送信者のアドレスを取得します。

cur = getContentResolver().query(Uri.parseUri(content://sms), null, null, null, "date DESC");

cur.MoveToFirst();
String telephoneNumber = cur.getString(cur.getColumnIndex("address");

このwhileループは、新しいメッセージが到着するまでスレッドを一時停止します。contentObserverを使用することもできますが、このwhileループは単純であり、登録、登録解除、および個別のクラスを必要としません。

率直に言って、着信インテントのpduから直接アドレスとメッセージの本文をプルする方が速いと思います。このようにして、アドレスと本文を取得するためにメッセージがテーブルに入るのを待つ必要はありません。AndroidクラスSmsMessageには、さまざまな便利なメソッドがあります。

于 2010-08-08T18:19:19.357 に答える