キャッチ送信されたSMS(Android 2.2)
-
29-10-2019 - |
質問
これに関連する質問がいくつかあることは知っていますが、それらのどれも私がこれを機能させるのに役立ちませんでした - 送信された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を使用するよりもさらに優れています。 これ そして他のいくつか..