2017-02-26 2 views
0

Guten Tag, ich programmiere Anwendung über das Abfangen der gesendeten Nachrichten. Alles funktioniert, die ContentObserver wird jedes Mal aufgerufen, wenn ich versuche, eine SMS zu schicken, aber in onChange (boolean selfChange) Methode der Anwendung fällt auf die.App wird gestoppt auf getContentResolver(). Abfrage (...), wenn SMS gesendet wird

  • Cursor cur = getContentResolver() Abfrage (uriSMS, null, null, null, null) .............................. Bildschirm http://imgur.com/a/hE94K

in TrackerService .java in mObserver. Wenn ich debbuging, dass über Step Over (F8), auf dieser Linie öffnen Sie mir ein Looper.java und fällt auf diese Linien http://imgur.com/a/uh4Dl ... Wie das für die Arbeit bitte reparieren? Ich hoffe, Sie werden mein Problem verstehen und mein schlechtes Englisch entschuldigen. Ich danke dir sehr!

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

<?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> 
+0

getContentResolver() Abfrage (uriSMS, null, null, null, null);. returns java.lang.SecurityException – fauzt

+0

Die SMS-Berechtigungen sind gefährliche Berechtigungen, also müssen Sie sie zur Laufzeit anfordern, wenn Sie auf Marshmallow oder höher mit einer 'targetSdkVersion' von 23+ laufen. http://stackoverflow.com/questions/32635704/android-permission-doesnt-work-even-if-i-have-declared-it Auch "content: // sms/out /" ist eine ungültige URI. Es ist "outbox", nicht "out". –

+0

Vielen Dank @MikeM. Ich änderte eine targetSdkVersion auf 19 und out auf outbox und es funktioniert, aber jetzt bekomme ich eine Fehlermeldung über den Befehl smsText = cur.getString (cur.getColumnIndex ("body")) ;, Es gibt dieses http:/zurück /imgur.com/a/hIUK5 – fauzt

Antwort

0

Stellen Sie sicher, dass Sie sich für den richtigen Inhaltspfad registrieren. Ex: -

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())); 

verwenden ähnlich den gleichen Weg auf dem cursor.query

+0

Vielen Dank für Ihre Reaktion, ich habe es behoben, aber jetzt bekomme ich eine Fehlermeldung über den Befehl smsText = cur.getString (cur.getColumnIndex ("body")) ;, Es gibt diese imgur.com/a/hIUK5 zurück Hast du ein paar Tipps, wie es sein sollte? – fauzt

+0

Möglicherweise müssen Sie vor dem Zugriff auf den Cursor eine Überprüfung hinzufügen. if (cursor.getCount()> 0 && cursor.moveToFirst) {Zeichenfolge smsText = cursor.getString (cursor.getColumnIndex ("body")); versuchen Sie auch Zugriff auf Inhalte: // SMS/gesendet, anstatt Outbox – albeee

+0

Danke guten Mann, der Inhalt: // SMS/gesendet/behoben Es !! Ich bin so glücklich :) – fauzt

Verwandte Themen