2016-08-15 46 views
3

我想聽聽傳出的短信。我按照公認的答案here但它不工作。我不知道我要去哪裏錯。我對內容觀察者一點都不熟悉,所以請原諒我的無知。聽外面的短信不工作android

我想在服務中創建它,所以它會一直運行。這裏是我的服務代碼:

import android.app.Service; 
import android.content.ContentResolver; 
import android.content.Intent; 
import android.database.ContentObserver; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Handler; 
import android.os.IBinder; 
import android.util.Log; 

public class SmsOutgoingObserver extends Service { 
    public SmsOutgoingObserver() { 
    } 
    /* this method handles a single incoming request */ 
    @Override 
    public int onStartCommand(Intent intent, int flags, int id) { 

     Log.d("OUTGOING", "RUNNING SERVICE"); 

     return START_STICKY; // stay running 
    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; // disable binding 
    } 

    public class SmsObserver extends ContentObserver { 

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

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

      Uri uriSMSURI = Uri.parse("content://sms/out"); 
      Cursor cr = SmsOutgoingObserver.this.getContentResolver().query(uriSMSURI, null, null, null, null); 

      cr.moveToNext(); 
      String address = cur.getString(cr.getColumnIndex("body")); 

      Log.d("OUTGOING", address); 

      cr.close(); 

      //Database.messageReceived(SmsOutgoingObserver.this, address); 
     } 
    } 
} 

我在做什麼錯?

回答

2

除了在我的一部分@CommonsWare指出了愚蠢的錯誤,我失蹤

@Override 
public void onCreate() { 
    super.onCreate(); 

    ContentResolver contentResolver = this.getContentResolver(); 
    contentResolver.registerContentObserver(Uri.parse("content://sms/out"),true, new SmsObserver(new Handler())); 
} 

另一個問題是實際上是在這兩條線

contentResolver.registerContentObserver(Uri.parse("content:&‌​#47;/sms/out‌​"),true, new SmsObserver(new Handler())); 

Uri uriSMSURI = Uri.parse("content://sms/out"); 

其中我將content://sms/out更改爲content://sms然後pr經過檢查的類型,以確保我得到的變化實際上是一個傳出的消息。我也必須確保檢查多個呼叫,像這樣:

if (cr.getInt(cr.getColumnIndex("type")) == 2) { 
    if(id != cr.getInt(cr.getColumnIndex(cr.getColumnName(0)))) { 
     id = cr.getInt(cr.getColumnIndex(cr.getColumnName(0))); 

     String address = cr.getString(cr.getColumnIndex("address")); 
     Database.messageSent(SmsOutgoingObserver.this, address); 
      Log.d("OUTGOING", address); 
     } else { 
      Log.d("OUTGOING", "MESSAGE ALREADY LOGGED"); 
     } 
    }; 
} 

,並簡單地定義private int id = 0;爲全局變量

1

您的SmsOutgoingObserver除了向LogCat註冊消息之外不會做任何其他事情。如果您想使用SmsObserver,則需要添加一些代碼,例如致電registerContentObserver()。在the accepted answer中顯示您鏈接到的問題。

+0

我有它在那裏之前,我必須刪除它意外地並沒有意識到它,我會給它一個鏡頭 –

+0

@SantiGallego:在'onCreate()'中的代碼應該工作。請注意,短信不必寫入該「ContentProvider」,許多用戶可能會因爲試圖讓服務連續運行而感到非常煩惱。 Google也暗示將來可能會取消這種服務。在Android 7.0+上,您可以使用'JobScheduler'來監視ContentProvider,而不必持續運行服務 - 請參閱[示例應用程序](https://github.com/commonsguy/cw-omnibus/tree/) master/JobScheduler)來監控'ContactsContract'。 – CommonsWare