【问题标题】:Automatic reply to SMS is not working. Android studio自动回复短信不起作用。安卓工作室
【发布时间】: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


    【解决方案1】:

    好的,我发现了问题; 这个问题发生在 api > 26(甚至可能是 25)上。 在 api 24 上,上面的代码运行良好,并发送了自动回复。 问题是我请求了SEND_SMS 的权限(在清单中我有READ、RECEIVE、SEND),显然在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 READ_SMS)就足够了,其余的您会收到

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 2017-03-09
      • 2013-07-08
      • 2017-04-17
      • 2014-04-30
      • 1970-01-01
      相关资源
      最近更新 更多