android - 为什么我的广播接收器无法识别我的字符串 - 发送短信代码

标签 android string broadcastreceiver

我希望 phoneNo 在我的 onReceive 方法范围内被识别。我需要做什么 ?我以为这样声明就可以了,但没有快乐:

public class MainActivity extends Activity {
    Button sendBtn;
    EditText txtphoneNo;
    String phoneNo;

// register a broadcast receiver
    private BroadcastReceiver receiver;

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

        sendBtn = (Button) findViewById(R.id.btnSendSMS);
        txtphoneNo = (EditText) findViewById(R.id.editText);
        phoneNo = txtphoneNo.getText().toString(); etc etc....

目前我的代码如下所示。当广播接收器检测到收到的短信时,我想打印到 logcat:

        System.out.println(origNumber);
        System.out.println(phoneNo);

但是我不能让 phoneNo 在整个 Activity 中被识别,只能在 sendSMSmessage 的范围内。

public class MainActivity extends Activity {
    Button sendBtn;
    EditText txtphoneNo;
    EditText txtMessage;

// register a broadcast receiver
    private BroadcastReceiver receiver;

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

        sendBtn = (Button) findViewById(R.id.btnSendSMS);
        txtphoneNo = (EditText) findViewById(R.id.editText);
        txtMessage = (EditText) findViewById(R.id.editText2);

        sendBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                sendSMSMessage();
            }
        });

        IntentFilter filter = new IntentFilter();
//        the thing we're looking out for is received SMSs
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");

        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent)

            {
                //do something based on the intent's action

                Bundle extras = intent.getExtras();

                if (extras == null)
                    return;

                Object[] pdus = (Object[]) extras.get("pdus");
                SmsMessage msg = SmsMessage.createFromPdu((byte[]) pdus[0]);
                String origNumber = msg.getOriginatingAddress();

                System.out.println(origNumber);
//                I want to print phoneNo here!!!!
//                System.out.println(phoneNo);

            }
        };
        registerReceiver(receiver, filter);
    }



    protected void sendSMSMessage() {
        Log.i("Send SMS", "");
        String phoneNo = txtphoneNo.getText().toString();
        String message = txtMessage.getText().toString();

        try {
            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(phoneNo, null, message, null, null);
            Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show();
        }

        catch (Exception e) {
            Toast.makeText(getApplicationContext(), "SMS faild, please try again.", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        if (receiver != null) {
            unregisterReceiver(receiver);
            receiver = null;
        }
        super.onDestroy();
    }

}

最佳答案

问题是您将 phoneNo 声明为 sendSMSMessage() 的局部变量,因此无法在该方法之外访问它。

您应该将其声明为实例变量。

像这样:

public class MainActivity extends Activity {
    Button sendBtn;
    EditText txtphoneNo;
    EditText txtMessage;

    String phoneNo;

    private BroadcastReceiver receiver;

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

        sendBtn = (Button) findViewById(R.id.btnSendSMS);
        txtphoneNo = (EditText) findViewById(R.id.editText);
        txtMessage = (EditText) findViewById(R.id.editText2);

        sendBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                sendSMSMessage();
            }
        });

        IntentFilter filter = new IntentFilter();
//        the thing we're looking out for is received SMSs
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");

        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent)

            {
                Bundle extras = intent.getExtras();

                if (extras == null)
                    return;

                Object[] pdus = (Object[]) extras.get("pdus");
                SmsMessage msg = SmsMessage.createFromPdu((byte[]) pdus[0]);
                String origNumber = msg.getOriginatingAddress();

                System.out.println(origNumber);
                if(phoneNo != null) {
                    System.out.println(phoneNo);
                }

            }
        };
        registerReceiver(receiver, filter);
    }



    protected void sendSMSMessage() {
        Log.i("Send SMS", "");
        phoneNo = txtphoneNo.getText().toString();
        String message = txtMessage.getText().toString();

        try {
            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(phoneNo, null, message, null, null);
            Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show();
        }

        catch (Exception e) {
            Toast.makeText(getApplicationContext(), "SMS faild, please try again.", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        if (receiver != null) {
            unregisterReceiver(receiver);
            receiver = null;
        }
        super.onDestroy();
    }
}

关于android - 为什么我的广播接收器无法识别我的字符串 - 发送短信代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38161119/

相关文章:

android - 对话框在 ICS 设备上的显示方式与旧版本不同

python - 如何通过索引添加两个字符串

android - 无法从广播接收器启动前台服务

android - 屏幕开/关的 BroadcastReceiver 不起作用

Java (Android) - 类型、泛型、构造函数签名、检索对类的引用

android - 就资源消耗而言,位置和地理围栏 api 之间的更好选择

java - 房间 IllegalArgumentException : intcannot be converted to an Element

c++ - 如何在 C++ 中使用 std::stoi() 验证 int 输入?

java - String.getBytes ("UTF-32") 在 JVM 和 Dalvik VM 上返回不同的结果

android - Wifi 扫描结果广播接收器不工作