【发布时间】:2018-09-30 18:41:57
【问题描述】:
我正在尝试在接收短信时发送自动回复,使用BroadcastReceiver 收听短信和SmsManager 发送回复,但自动回复不起作用。
注意:如果我从 onCreate 调用 smsManager.sendTextMessage(phoneNo, null, msg, null, null);,它确实会发送一条消息,但问题是当我尝试从 messageReceived 调用它时。
我也尝试使用registerReceiver 而不是bindListener,但同样的事情发生了。
在模拟器上运行时,所有 Toast 都会显示(但我无法真正检查是否在模拟器上发送了消息)。 在通过 USB 数据线连接的设备上运行时,“正在发送消息”Toast 未显示。
非常感谢您的帮助。 谢谢
public class MainActivity extends AppCompatActivity implements SmsListener, View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED){
requestSMSPermission();
}
else{
SmsReceiver.bindListener(this);
Toast.makeText(this, "listening", Toast.LENGTH_SHORT).show();
}
}
@Override
public void messageReceived(String messageText, String sender) {
Toast.makeText(getBaseContext(), "sending the message", Toast.LENGTH_SHORT).show();
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(sender, null, messageText, null, null);
}
private void requestSMSPermission(){
if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.SEND_SMS)){
new AlertDialog.Builder(this)
.setTitle("Permission needed").setMessage("This permission is needed in order to send automatic reply")
.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.SEND_SMS},READ_SMS_PERMISSION_CODE);
}
})
.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
}).create().show();
}
else{
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS},READ_SMS_PERMISSION_CODE);
}
}
}
接收器类:
public class SmsReceiver extends BroadcastReceiver {
private static SmsListener mListener;
@Override
public void onReceive(Context context, Intent intent) {
Bundle data = intent.getExtras();
Object[] pdus = (Object[]) data.get("pdus");
String sender = null;
for(int i=0; i<pdus.length; i++){
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
sender = smsMessage.getOriginatingAddress();
String messageBody = smsMessage.getMessageBody();
mListener.messageReceived(messageBody,sender);
}
}
public static void bindListener(SmsListener listener) {
mListener = listener;
}
}
监听器接口:
public interface SmsListener {
public void messageReceived(String messageText, String sender);
}
清单:
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<receiver android:name=".SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
【问题讨论】:
标签: java broadcastreceiver sendmessage