2012-03-30 15 views
2

Ich kann den Code zum Erstellen von Warnungen und Toasten in einem ContentObserver von SMS nicht schreiben. Ich konnte den Kontext für meinen ContentObserver nicht abrufen. Jemand bitte hilf mir. Danke im Voraus.Kann ich Alert und Toast in einem ContentObserver erstellen?

MyObserver yourObserver = new MyObserver(new Handler()); 

     ContentResolver contentResolver = this.getContentResolver(); 
     contentResolver.registerContentObserver(Uri.parse("content://sms"),true, yourObserver); 

&

class YourObserver extends ContentObserver { 

    //Context context = new ContentObserver() 
    AlertDialog.Builder builder; 
    AlertDialog alert; 
    public YourObserver(Handler handler) { 
     super(handler); 
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 
     Toast.makeText(???,"SENT..!!", Toast.LENGTH_LONG).show(); 
     System.out.println("Hey =++++++++++++++++++++++_______+++++++++++++++++++++++++++++"); 
     builder = new AlertDialog.Builder(???); 
     builder.setMessage("Are you sure??"); 
     builder.setCancelable(false); 
     builder.setPositiveButton("Yes",new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       Toast.makeText(???, "Okay",Toast.LENGTH_LONG).show(); 
      } 
     }); 

     builder.setNegativeButton("No",new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       alert.cancel(); 
      } 
     }); 
     alert = builder.create(); 
     alert.show(); 
    } 
} 
+0

was ist das Problem, das Sie Sie konfrontiert sind sollte den Code veröffentlichen. –

+0

"???" das sind meine Probleme. – Kishore

+0

Ja, überprüfen Sie die folgende Antwort, die Sie den Kontext an die ContentObserver-Klasse übergeben müssen. –

Antwort

1

Sie können Rahmen Ihrer Tätigkeit übergeben an die ContentObserver Klasse,

ContentResolver observer = this.getContentResolver(); 
     observer.registerContentObserver(SMS_URI, true, 
            new MyObserver(new Handler(), this)); 

Und die in der MyObserver Klasse den Kontext verwenden,

Activity mActivity; 
    public MyContentObserver(Handler handler, Activity mActivity) { 
     super(handler); 
     this.mActivity= mActivity; 
    } 
+0

Es funktioniert perfekt für den Toast aber nicht für Alert .Wenn ich den Code für die Warnung hinzufügen, gibt es ** Die Anwendung wurde unerwartet gestoppt ** ** Force Close ** – Kishore

+0

Welcher Fehler kommt in der Logcat-Ausgabe? –

+0

Thread beendet mit nicht abgefangener Ausnahme, FATALE AUSNAHME: main, Fenster kann nicht hinzugefügt werden - Token null ist nicht für eine Anwendung – Kishore

3

können Sie verwenden handler.post() Toast zu zeigen.

public SMSSentObserver(Handler handler, Context context) { 
    super(handler); 
    this.handler = handler; 
    m_Context = context; 
} 

@Override 
public void onChange(boolean selfChange) { 
    super.onChange(selfChange); 
    handler.post(new Runnable() { 

     @Override 
     public void run() { 

      Toast.makeText(m_Context, "Toast", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
+2

übrigens, wenn Sie vermeiden möchten, den Kontext im Konstruktor zu übergeben und Ihr Beobachter ist eine innere Klasse einer Aktivität, können Sie einfach getApplicationContext() verwenden, um den Kontext zu erhalten – Thomas