我正在尝试使用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>
答案 0 :(得分:0)
好的,我发现了问题;
此问题发生在api> 26(甚至25)上。
在api 24上,上述代码可以正常工作,并发送了自动回复。
问题是我请求了RECEIVE_SMS
的权限(在清单中,我具有READ,RECEIVE,SEND),显然在api 26上它并没有真正地授予onReceive
的权限,因此在我的代码 {从未叫过{1}} 。
解决方案:我已将以上权限更改为RECEIVE_SMS
并添加到onCreate
中:
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS},111);
}
总结:如果您要获得同一家族的两个(或更多)权限(例如READ_SMS/SEND_SMS
),则需要请求所有个所需权限甚至以为最终您只会看到一次对话框,一次允许所有权限。
在API <= 24中,仅请求同一家族的一项许可就足够了(例如READ_SMS
),您将收到其余的许可