2016-10-16 17 views
1

Я пытаюсь разработать базовое приложение для SMS, но у меня проблема с NullPointerException. Ну, есть код: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(); 
     } 
    }); 
}} 

и есть SendSMS класс:

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

И есть журнал об ошибке:

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) 

Я не могу понять, в чем проблема. Я надеюсь, что вы можете помочь мне! Thx

ответ

1

Вы сделали свой класс sendSMS подклассом Activity, предположительно так, чтобы методы registerReceiver() разрешали. Вы не можете создать Activity с new и заставить его работать правильно. Элемент Context, который он хранит, никогда не будет правильно инициализирован, поэтому вы получаете NullPointerException.

Вы уже прошли мимо Context в sendSMS(), так что вы можете просто позвонить registerReceiver().

context.registerReceiver(...); 

Кроме того, sendSMS класса не должен быть Activity подкласса, так что вы должны удалить extends Activity, и onCreate() переопределения. Кроме того, метод sendSMS() теперь может быть static, поэтому вам не нужно создавать экземпляр класса для его использования и может просто вызвать метод непосредственно в классе. Я бы также упомянул, что имена классов в Java должны начинаться с заглавных букв.

public class SendSMS { 

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

Для вызова:

SendSMS.sendSMS(...); 

Было бы желательно, чтобы отменить регистрацию приемников, когда вы закончите с ними, используя Context#unregisterReceiver(). Возможно, вам будет легче сделать это, не используя анонимные экземпляры BroadcastReceiver.

Следует также отметить, что метод SmsManager#sendTextMessage() обычно терпит неудачу, если вы отправляете сообщение, превышающее лимит символов для одночастного сообщения в алфавите, который вы используете.

+1

Thx, я ценю ваш ответ! С вашим полезным описанием я исправил проблему. –

Смежные вопросы