1

Ich versuche, eine grundlegende SMS-App zu entwickeln, aber ich habe ein NullPointerException-Problem. Nun, es ist der Code:Android SMS BroadcastReceiver NullPointer

MainActivity.java

public class MainActivity extends AppCompatActivity { 

Button btnSendSMS; 
EditText txtPhoneNo; 
EditText txtMessage; 
sendSMS sendSMS=new sendSMS(); 



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

    btnSendSMS = (Button) findViewById(R.id.btnSendSMS); 
    txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo); 
    txtMessage = (EditText) findViewById(R.id.txtMessage); 
    ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS},1); 

    btnSendSMS.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      String phoneNo = txtPhoneNo.getText().toString(); 
      String message = txtMessage.getText().toString(); 
      if (phoneNo.length()>0 && message.length()>0) { 
       sendSMS.sendSMS(phoneNo, message,getApplicationContext()); 

      } 
      else 
       Toast.makeText(getApplicationContext(), 
         "Please enter both phone number and message.", 
         Toast.LENGTH_SHORT).show(); 
     } 
    }); 
}} 

und es gibt die sendSMS Klasse:

public class sendSMS extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
} 


//---sends an SMS message to another device--- 
public void sendSMS(String phoneNumber, String message,Context context) 
{ 
    String SENT = "SMS_SENT"; 
    String DELIVERED = "SMS_DELIVERED"; 

    PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, 
      new Intent(SENT), 0); 

    PendingIntent deliveredPI = PendingIntent.getBroadcast(context, 0, 
      new Intent(DELIVERED), 0); 

    //---when the SMS has been sent--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS sent", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        Toast.makeText(getBaseContext(), "Generic failure", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        Toast.makeText(getBaseContext(), "No service", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        Toast.makeText(getBaseContext(), "Null PDU", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        Toast.makeText(getBaseContext(), "Radio off", 
          Toast.LENGTH_SHORT).show(); 
        break; 
      } 
     } 
    }, new IntentFilter(SENT)); 

    //---when the SMS has been delivered--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case Activity.RESULT_CANCELED: 
        Toast.makeText(getBaseContext(), "SMS not delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
      } 
     } 
    }, new IntentFilter(DELIVERED)); 

    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); 
}} 

Und es gibt das Protokoll über den Fehler:

FATAL EXCEPTION: main 
       Process: com.example.lcssgml.appsmsmms, PID: 5861 
       java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Intent android.content.Context.registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter)' on a null object reference 
        at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:586) 
        at com.example.lcssgml.appsmsmms.sendSMS.sendSMS(sendSMS.java:41) 
        at com.example.lcssgml.appsmsmms.MainActivity$1.onClick(MainActivity.java:46) 
        at android.view.View.performClick(View.java:5610) 
        at android.view.View$PerformClick.run(View.java:22260) 
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

Ich kann das Problem nicht herausfinden. Ich hoffe ihr könnt mir helfen! Thx

Antwort

1

Sie haben Ihre sendSMS Klasse zu einer Activity Unterklasse gemacht, vermutlich so, dass die registerReceiver() Methoden aufgelöst werden. Sie können Activity mit new nicht instanziieren und es richtig funktionieren lassen. Das Context Mitglied, das es hält, wird nie richtig initialisiert werden, weshalb Sie die NullPointerException bekommen.

Sie haben bereits eine Context in die sendSMS() Methode übergeben, so dass Sie einfach registerReceiver() darauf anrufen können.

context.registerReceiver(...); 

Darüber hinaus ist die sendSMS Klasse sollte kein Activity Unterklasse sein, so sollten Sie die extends Activity und die onCreate() Überschreibung entfernen. Außerdem kann die sendSMS()-Methode jetzt static lauten. Sie müssen also keine Instanz der Klasse erstellen, um sie zu verwenden, und können die Methode einfach direkt in der Klasse aufrufen. Ich würde auch erwähnen, dass Klassennamen in Java mit Großbuchstaben beginnen sollten.

public class SendSMS { 

    public static void sendSMS(...) { 
     ... 
    } 
    ... 
} 

es zu nennen:

SendSMS.sendSMS(...); 

Es wäre ratsam, den Receiver abzumelden, wenn Sie mit ihnen fertig sind, mit Context#unregisterReceiver(). Sie finden es möglicherweise einfacher, dies zu tun, indem Sie keine anonymen BroadcastReceiver Instanzen verwenden.

Ich sollte auch darauf hinweisen, dass die SmsManager#sendTextMessage()-Methode in der Regel im Hintergrund fehlschlägt, wenn Sie eine Nachricht senden, die die Zeichenbeschränkung für eine einteilige Nachricht in dem Alphabet, das Sie verwenden, überschreitet.

+1

Thx, ich schätze Ihre Antwort! Mit Ihrer nützlichen Beschreibung habe ich das Problem behoben. –