Автоматический ответ на SMS не работает.Студия Android - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь отправить автоматический ответ при получении смс, используя BroadcastReceiver для прослушивания смс и SmsManager для отправки ответа, но автоматический ответ не работает. Примечание: Если я звоню smsManager.sendTextMessage(phoneNo, null, msg, null, null); из onCreate, оно действительно отправляет сообщение, но проблема в том, когда я пытаюсь вызвать его из messageReceived.Я также попытался использовать registerReceiver вместо bindListener, но произошло то же самое.

При запуске на эмуляторе отображаются все тосты (но я не могу проверить, отправлено ли сообщение на эмуляторе).При работе на устройстве, подключенном через USB-кабель, «отправка сообщения» Тост не отображается.

Буду очень признателен за вашу помощь.Спасибо

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 голосов
/ 02 октября 2018

Хорошо, я понял проблему;Эта проблема возникает при 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 достаточно запросить только одно разрешение от того же семейства (например, <code>READ_SMS), а остальные вы получите

...