2017-09-26 3 views
12

Mon application ne peut pas envoyer des sms sur android 8 mise à jour. J'obtiens l'erreur que je n'ai pas READ_PHONE_STATE permission.Android 8 nécessite READ_PHONE_STATE lorsque vous appelez SmsManager.sendTextMessage()

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) 

habituellement ce genre d'erreur est très bien - je me rends compte que je besoin d'une permission et demander. Mais dans ce cas, je ne peux pas trouver toute la documentation que je besoin READ_PHONE_STATE utiliser SmsManager. Ni ici, ni dans sendTextMessage nouveau Android 8 update notes. Ce dernier ne mentionne que pour obtenir numéro de série matériel je maintenant besoin READ_PHONE_STATE permission.

La recherche plus loin, je trouve que beaucoup d'autres personnes ont couru dans cette question, mais personne n'a des détails ou des solutions au-delà demander ladite permission.

Donc aujourd'hui, j'ai recréé le problème avec une simple application pure qui demande simplement SEND_SMS permission et envoie des sms. Et a eu exactement le même problème. Il fonctionne sur tout sous Android 8. Mais se bloque avec l'erreur de permission 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); 
    } 

} 

Submitted sur google issue tracker

+3

que je recherchais dans le code source Android et trouvé ceci: https://android.googlesource.com/platform/frameworks/ opt/telephony/+/987378c0704f6000e8f99a36dd032c99f926b81a/src/java/android/telephonie/SmsManager.java (méthode: sendTextMessage, ligne 263) Il y a un appel à getSubscriptionId (), qui est protégé avec READ_PHONE_STATE_PERMISSION, puis si l'application n'a pas cette autorisation vérifiée/accordée, l'appel de cette méthode provoquera l'exception SecurityException et l'application tombera en panne. Contournement (lorsque l'application a déclaré l'utilisation de READ_PHONE_STATE) consiste à accorder l'autorisation manuellement à partir des paramètres. – tnachev

+0

Donc, apparemment, cela est corrigé dans la mise à jour 8.1. Je n'ai pas encore confirmé. Toujours pas de réponse officielle de google – somerandomusername

Répondre

-2
You need to check the permissions in android nougat devices. 

if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) 
     != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.SEND_SMS)) { 
      } else { 
       ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.SEND_SMS}, 
        MY_PERMISSIONS_REQUEST_SEND_SMS); 
      } 
     } 

Link - https://www.tutorialspoint.com/android/android_sending_sms.htm 
+0

ceci est totalement hors sujet – somerandomusername