2017-02-26 24 views
0

こんにちは、送信されたメッセージをキャッチすることをお勧めします。 、SMSが送信されたときにgetContentResolver()。query(...)でアプリケーションが停止しました

  • カーソルCUR = getContentResolver()クエリ(uriSMS:すべては、私はSMSを送信しようとすると、ContentObserverは毎回呼ばれ、働いているが、のonChange(ブールselfChange)に方法は、アプリケーションがに落ちます。 NULL、NULL、NULL、NULL) ..............................画面TrackerServiceでhttp://imgur.com/a/hE94K

.java in mObserver。ステップオーバー(F8)を介してそれをデバッグしているときに、この行で私はLooper.javaを開き、この行にドロップしますhttp://imgur.com/a/uh4Dl ...どうすれば問題を解決できますか?私はあなたが私の問題を理解し、私の悪い英語のために申し訳なく思っています。どうもありがとうございます!

MainActivity.java

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 

public class MainActivity extends Activity { 

    Intent serviceIntent; 
    private static MyReceiver mServiceReceiver; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    protected void onPause() { 
     Log.i("Status","Pause"); 
     unregisterReceiver(mServiceReceiver); 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     Log.i("Status","Resume"); 

     serviceIntent = new Intent(MainActivity.this, TrackerService.class); 
     startService(serviceIntent); 

     mServiceReceiver = new MyReceiver(); 
     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(TrackerService.mAction); 
     registerReceiver(mServiceReceiver, intentFilter); 

     super.onResume(); 
    } 

    private class MyReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      Log.i("ServiceReceiver", "onReceive()"); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 
} 

TrackerService.java

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 TrackerService extends Service 
{ 
    public static final String mAction = "SMSTracker"; 
    ContentResolver content; 
    ContentResolver contentResolver; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.i("Status","Service Start"); 

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

     return super.onStartCommand(intent, flags, startId); 
    } 

    class mObserver extends ContentObserver { 

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

     @Override 
     public void onChange(boolean selfChange) { 
      super.onChange(selfChange); 
      Log.i("Status","onChange"); 

      Uri uriSMS = Uri.parse("content://sms/out/"); 
      Cursor cur = getContentResolver().query(uriSMS, null, null, null, null); 
      //Log.i("SMS", "Columns: " + cur.getColumnNames()); 

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

      Log.i("SMS", "SMS Lenght: " + smsText.length()); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.i("Status","Service Destroy"); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     Log.i("Status","Service Bind"); 
     return null; 
    } 
} 

のAndroidManifest.xml

+0

getContentResolver(上の同じパスを使用して、クエリ(uriSMS、NULL、NULL、NULL、NULL);。 java.lang.SecurityExceptionを返します。 – fauzt

+0

SMSのアクセス許可は危険なアクセス権ですので、Marshmallow以上で実行している場合は実行時に要求し、 'targetSdkVersion'は23+です。 http://stackoverflow.com/questions/32635704/android-permission-doesnt-work-even-if-i-have-declared-itまた、「content:// sms/out /」は無効なURIです。それは 'outbox'ではなく' outbox'です。 –

+0

ありがとう、@MikeM。私はtargetSdkVersionを19に変更して送信トレイに出しましたが、動作していますが、今はこのコマンドでエラーが発生しています。String smsText = cur.getString(cur.getColumnIndex( "body"));このhttp: /imgur.com/a/hIUK5 – fauzt

答えて

0
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="wut.com.smstry"> 

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

    <application 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service android:name=".TrackerService" /> 

    </application> 

</manifest> 

適切なコンテンツパスに登録していることを確認します。例: -

Inbox = "content://sms/inbox" 
Failed = "content://sms/failed" 
Queued = "content://sms/queued" 
Sent = "content://sms/sent" 
Draft = "content://sms/draft" 
Outbox = "content://sms/outbox" 
Undelivered = "content://sms/undelivered" 
All = "content://sms/all" 
Conversations = "content://sms/conversations". 


contentResolver.registerContentObserver(Uri.parse("content://sms/outbox"), true, new mObserver(new Handler())); 

同様)cursor.query

+0

あなたの反応をありがとう、私はそれを修正しましたが、今このコマンドでエラーを取得していますString smsText = cur.getString(cur.getColumnIndex( "body"));これはimgur.com/a/hIUK5を返します、あなたはいくつかのヒントを持っていますか? – fauzt

+0

カーソルにアクセスする前に小切手を追加する必要があるかもしれません。 if(cursor.getCount()> 0 && cursor.moveToFirst){String smsText = cursor.getString(cursor.getColumnIndex( "body"));また、コンテンツにアクセスしてみてください:// sms/outboxの代わりに送信 – albeee

+0

良い男、コンテンツ:// SMS /送信/固定それ!私はとても幸せです:) – fauzt

関連する問題