自动回复短信不起作用.安卓工作室



我正在尝试在接收短信时使用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>

好的,我想出了问题; 此问题发生在 api> 26(甚至可能是 25(上。 在 api 24 上,上面的代码工作正常,并发送了自动回复。 问题是我请求了SEND_SMS的权限(在清单中我有读取,接收,发送(,显然在 api 26 上它并没有真正授予RECEIVE_SMS的权限,所以在我的代码中从未调用过onReceive

解决方案:我已将上面的权限更改为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(就足够了,您将获得其余权限

相关内容

最新更新