2016-08-15 11 views
3

발신 SMS 메시지를 듣고 싶습니다. 받아 들인 대답 here을 따르고 있었지만 작동하지 않습니다. 내가 어디로 잘못 가고 있는지 모르겠습니다. 나는 컨텐츠 참관인들에게 전혀 익숙하지 않아 내 무지를 용서한다.발신 SMS 수신 대기 안드로이드 수신

항상 서비스를 실행하여 항상 실행되도록하고 싶습니다. 이 서비스의 코드는 다음과 같습니다.

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

, 내가

@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/outcontent://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에 표시됩니다.

@CommonsWare 지적 나의 부분에 어리석은 실수에 추가
+0

나는 그것을 실수가 아니라 그것을 내가 것이다 실현 삭제해야합니다 전에 거기에 있었다 그에게 한 샷을 준다. –

+0

@SantiGallego : onCreate()에서이 코드를 사용하면 효과가있다. SMS는'ContentProvider'에 쓰여질 필요가 없으며, 많은 사용자들이 서비스를 지속적으로 실행하려고 시도 할 때 매우 짜증을 낼 수 있습니다. 구글은 또한 이런 종류의 서비스가 미래에 제거 될 수 있음을 암시했다. 안드로이드 7.0+에서는'JobScheduler'를 사용하여 서비스를 계속 실행하지 않고도'ContentProvider'를 모니터링 할 수 있습니다 - [this sample app] (https://github.com/commonsguy/cw-omnibus/tree/)를 참조하십시오. master/JobScheduler). – CommonsWare