自动回复SMS无效。 Android工作室

时间:2018-09-30 18:41:58

标签: java broadcastreceiver sendmessage

我正在尝试使用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>

1 个答案:

答案 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),您将收到其余的许可