質問

これに関連する質問がいくつかあることは知っていますが、それらのどれも私がこれを機能させるのに役立ちませんでした - 送信されたSMSを捕らえます。私はサムスンの電話でAndroid 2.2(Froyo)を使用しています(それがどういうわけか重要な場合)。

StackoverFlowでこれをたくさん検索し、必要であることに気付きました ContentObserver 私の要求のために。私はアクティビティの代わりにサービスを使用しているので、それを登録しました ContentObserver 私の中で Service クラス、そしてそれは次のように見えます:

public class SMSSending extends Service {

private class MyContentObserver extends ContentObserver {

    public MyContentObserver() {
        super(null);
    }

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

        Uri uriSMSURI = Uri.parse("content://sms/sent");
        Cursor cur = getBaseContext().getContentResolver().query(uriSMSURI, null, null, null, null);           
        cur.moveToNext();
        String content = cur.getString(cur.getColumnIndex("body"));

        Toast.makeText(getApplicationContext(), "SOME TEXT", Toast.LENGTH_LONG).show();

    }

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

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {

    MyContentObserver contentObserver = new MyContentObserver();
    ContentResolver contentResolver = getBaseContext().getContentResolver();
    contentResolver.registerContentObserver(Uri.parse("content://sms/sent"),true, contentObserver);
    Toast.makeText(getApplicationContext(), "SERVICE CREATED", Toast.LENGTH_LONG).show();
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

@Override
public void onStart(Intent intent, int startid) {
    Toast.makeText(getApplicationContext(), "SERVICE STARTED", Toast.LENGTH_LONG).show();
}

}

ご覧のとおり、私は置いています Toast 少数の場所で、これがまったく機能しているかどうかを確認できました。残念ながら、この通知はありません。また、logcatにコードをいくつか掲載してみましたが、何も起こりません。私も入れようとしました Uri uriSMSURI = Uri.parse("content://sms"); それ以外の content://sms/sentしかし、アプリケーションは単に何もしません。もちろん、私はマニフェストに許可を持っています:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS"/>

何が足りないの?

役に立ちましたか?

解決

幸いなことに、私はなんとかそれを解決することができましたが、まったく異なるアプローチを使用することで。多分これは将来誰かを助けるでしょう。

ContentObserverを使用する代わりに(なぜ機能しなかったのかはまだわかりません)、新しいスレッドを作成し、サービスが作成されて開始された後に開始しました。だからこんな感じのように見えます:

...

final Uri CONTENT_URI = Uri.parse("content://sms/sent"); 

...

 public void onStart(Intent intent, int startid) { 
        Go();   
    }
    private void Go(){

        new Thread(new Runnable() { 
            public void run() { 

                try {       

                while(true){

                Cursor cursor = getContentResolver().query(CONTENT_URI, null, null, null,  null); 

                if(cursor.moveToFirst()){

                    text = cursor.getString(cursor.getColumnIndexOrThrow("body")).toString(); 


                    if(!text.equalsIgnoreCase(actual)){
                        previous = text;
                                    //do what you need..


                    }

                }

                Thread.sleep(60000);
            }

            } catch (InterruptedException e) {

                e.printStackTrace();
            }   
            } 
    }).start(); 

それは絶対に安定しており、ContentObserverを使用するよりもさらに優れています。 これ そして他のいくつか..

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top