有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android SMS广播接收器空指针

我正在尝试开发一个基本的SMS应用程序,但我遇到了一个NullPointerException问题。 好的,这是代码:

主要活动。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 '安卓.content.Intent 安卓.content.Context.registerReceiver(安卓.content.BroadcastReceiver, 安卓.content.IntentFilter)' on a null object reference
                  at 安卓.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 安卓.view.View.performClick(View.java:5610)
                  at 安卓.view.View$PerformClick.run(View.java:22260)
                  at 安卓.os.Handler.handleCallback(Handler.java:751)
                  at 安卓.os.Handler.dispatchMessage(Handler.java:95)
                  at 安卓.os.Looper.loop(Looper.java:154)
                  at 安卓.app.ActivityThread.main(ActivityThread.java:6077)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                  at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:755)

我想不出这个问题。我希望你能帮助我!Thx


共 (1) 个答案

  1. # 1 楼答案

    您已经将sendSMS类设置为Activity子类,大概是为了解决registerReceiver()方法。无法用new实例化Activity并使其正常工作。它保留的Context成员永远不会被正确初始化,这就是为什么会得到NullPointerException

    你已经在把一个Context传递给sendSMS()方法,所以你可以直接调用registerReceiver()

    context.registerReceiver(...);
    

    此外,sendSMS类不应该是Activity子类,因此应该删除extends ActivityonCreate()覆盖。另外,sendSMS()方法现在可以是static,因此不需要创建类的实例来使用它,只需直接在类上调用该方法即可。我还要提到Java中的类名应该以大写字母开头

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

    可以这么说:

    SendSMS.sendSMS(...);
    

    建议在处理完接收器后,使用Context#unregisterReceiver()注销它们。不使用匿名BroadcastReceiver实例可能会更容易做到这一点

    我还应该指出,如果您发送的消息超出了所用字母表中单个部分消息的字符限制,那么SmsManager#sendTextMessage()方法通常会自动失败