Meine Anwendung kann keine SMS auf neue Android 8-Update senden. Ich bekomme den Fehler, dass ich keine READ_PHONE_STATE Erlaubnis habe.Android 8 erfordert READ_PHONE_STATE beim Aufruf von 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)
normalerweise ist diese Art von Fehler in Ordnung - ich merke nur, ich brauche eine Erlaubnis und frage danach. Aber in diesem Fall kann ich keine Dokumentation finden, die ich brauche READ_PHONE_STATE, um SmsManager zu verwenden. Weder hier sendTextMessage noch in neuen Android 8 update notes. Letzteres erwähnt, dass Hardware-Seriennummer Ich brauche jetzt READ_PHONE_STATE Erlaubnis.
Weitere Untersuchungen Ich fand, dass viele andere Leute in dieses Problem geraten sind, aber niemand hat irgendwelche Details oder Lösungen, die nicht nur um die Erlaubnis bitten.
So heute habe ich das Problem mit einfachen reinen Anwendung, die nur nach SEND_SMS Erlaubnis fragt und sendet SMS. Und habe genau das gleiche Problem. Es funktioniert auf alles unter Android 8. Aber stürzt mit Erlaubnis Fehler auf Android 8. Hier ist Quellcode, wenn jemand es neu erstellen will.
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);
}
}
es Abgegeben am google issue tracker
Ich wurde in die Android-Quellcode suchen und fanden diese: https://android.googlesource.com/platform/frameworks/ opt/Telefonie/+/987378c0704f6000e8f99a36dd032c99f926b81a/src/java/android/Telefonie/SmsManager.java (Methode: sendTextMessage, Zeile 263) Es gibt einen Aufruf an getSubscriptionId (), die mit READ_PHONE_STATE_PERMISSION geschützt ist, dann führt das Aufrufen dieser Methode zu einem Absturz der SecurityException, wenn für die App diese Berechtigung nicht aktiviert/gewährt ist. Problemumgehung ist (wenn APP die Verwendung von READ_PHONE_STATE deklarierte), die Berechtigung manuell von den Einstellungen zu erteilen. – tnachev
Also anscheinend ist dies in 8.1 Update behoben. Habe noch nicht bestätigt. Noch keine offizielle Antwort von Google – somerandomusername