web-dev-qa-db-fra.com

Android 8 nécessite READ_PHONE_STATE lors de l'appel de SmsManager.sendTextMessage ()

Mon application ne peut pas envoyer de sms sur la nouvelle mise à jour Android 8. J'obtiens une erreur que je n'ai pas READ_PHONE_STATE autorisation.

Java.lang.SecurityException: Neither user 10179 nor current process has Android.permission.READ_PHONE_STATE.
    at Android.os.Parcel.readException(Parcel.Java:1942)
    at Android.os.Parcel.readException(Parcel.Java:1888)
    at com.Android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.Java:789)
    at Android.telephony.SmsManager.sendTextMessageInternal(SmsManager.Java:329)
    at Android.telephony.SmsManager.sendTextMessage(SmsManager.Java:312)
    at com.cordova.plugins.sms.Sms.send(Sms.Java:192)
    at com.cordova.plugins.sms.Sms.access$400(Sms.Java:22)
    at com.cordova.plugins.sms.Sms$1.run(Sms.Java:102)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1162)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:636)
    at Java.lang.Thread.run(Thread.Java:764)

généralement ce genre d'erreur est très bien - je réalise juste que j'ai besoin d'une autorisation et je la demande. Mais dans ce cas, je ne trouve aucune documentation dont j'ai besoin READ_PHONE_STATE pour utiliser SmsManager. Ni ici sendTextMessage ni dans le nouveau Android 8 notes de mise à jour . Ce dernier mentionne que pour obtenir le numéro de série du matériel J'ai maintenant besoin de l'autorisation READ_PHONE_STATE .

En recherchant plus loin, j'ai constaté que de nombreuses autres personnes ont rencontré ce problème, mais personne n'a de détails ou de solutions au-delà de la simple demande de ladite autorisation.

Donc, aujourd'hui, j'ai recréé le problème avec une application pure et simple qui demande simplement l'autorisation SEND_SMS et envoie des sms. Et j'ai exactement le même problème. Il fonctionne sur tout ce qui suit Android 8. Mais se bloque avec une erreur d'autorisation sur Android 8. Voici le code source si quelqu'un veut le recréer).

compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
  applicationId "com.example.usr.smstest"
  minSdkVersion 21
  targetSdkVersion 26
}
package com.example.usr.smstest;

import Android.Manifest;
import Android.content.pm.PackageManager;
import Android.support.v4.app.ActivityCompat;
import Android.support.v4.content.ContextCompat;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.telephony.SmsManager;

public class MainActivity extends AppCompatActivity {

    private static final int MY_PERMISSIONS_REQUEST_SEND_SMS = 1;

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    sendSms();
                }
            }
        }
    }

    @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) {

                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.SEND_SMS},
                        MY_PERMISSIONS_REQUEST_SEND_SMS);
        }else{
            sendSms();
        }
    }

    private void sendSms(){
        SmsManager manager = SmsManager.getDefault();
        manager.sendTextMessage("22222222", null, "msg", null, null);
    }

}

Soumis le google issue tracker

22
somerandomusername

Ceci est un bug dans Android O tellement ennuyeux. Si vous cochez SmsManager.Java vous pouvez voir la méthode getSubscriptionId dont le corps a besoin READ_PHONE_STATE_PERMISSION et si vous ne donnez pas READ_PHONE_STATE lancer SecurityException

Tout ce que vous pouvez faire est donc de générer READ_PHONE_STATE et expliquez-le au Play Store si vous avez été averti ou attendez que les développeurs de Google le corrigent

3
Radesh