Android 8 nécessite READ PHONE STATE lors de l'appel SmsManager.sendTextMessage()
mon application ne peut pas envoyer de sms sur la nouvelle mise à jour android 8. J'obtiens le message d'erreur que je n'ai pas de READ_PHONE_STATE permission.
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.access0(Sms.java:22)
at com.cordova.plugins.sms.Sms.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)
en général, ce genre d'erreur est acceptable - je me rends compte que j'ai besoin d'une permission et je la demande. Mais dans ce cas je ne trouve pas de documentation dont j'aurais 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 numéro de série matériel j'ai maintenant besoin READ_PHONE_STATE permission.
recherches plus approfondies j'ai constaté que beaucoup d'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 permission.
alors aujourd'hui j'ai recréé le problème avec simple application pure qui demande juste SEND_SMS permission et envoi de sms. Et a obtenu exactement le même problème. Il fonctionne sur tout ci-dessous Android 8. Mais s'écrase avec une erreur de permission sur android 8. Voici le code source si quelqu'un veut 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 sur Google issue tracker
2 réponses
il s'agit d'un bug dans android O qui tellement ennuyeux. si vous cochez la case SmsManager.java
vous pouvez voir getSubscriptionId
méthode que dans le corps à besoin READ_PHONE_STATE_PERMISSION
et si vous ne donnez pas READ_PHONE_STATE
lancer SecurityException
alors tout ce que vous pouvez faire c'est générer READ_PHONE_STATE
et de l'expliquer aux play store si vous avez été prévenu, ou d'attendre pour corrigé par les développeurs de google
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