Ứng dụng của tôi không thể gửi sms trên bản cập nhật Android 8 mới. Tôi gặp lỗi rằng tôi không có quyền số READ_PHONE_STATE.Android 8 yêu cầu READ_PHONE_STATE khi gọi 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)
thường là loại lỗi này là tốt - tôi chỉ nhận ra mình cần sự cho phép và yêu cầu. Nhưng trong trường hợp này tôi không thể tìm thấy bất kỳ tài liệu nào mà tôi cần phải có READ_PHONE_STATE để sử dụng SmsManager. Không có ở đây sendTextMessage cũng không có trong Android 8 update notes mới. Người thứ hai đề cập rằng để nhận được số sê-ri phần cứng Tôi hiện cần có quyền số READ_PHONE_STATE.
Nghiên cứu thêm Tôi thấy rằng nhiều người khác đã gặp vấn đề này, nhưng không ai có bất kỳ chi tiết hoặc giải pháp nào ngoài việc yêu cầu quyền được cho phép.
Vì vậy, hôm nay tôi đã tạo lại vấn đề với ứng dụng thuần túy đơn giản chỉ yêu cầu quyền truy cập SEND_SMS và gửi sms. Và có cùng một vấn đề. Nó hoạt động trên tất cả mọi thứ dưới Android 8. Nhưng tai nạn với lỗi cho phép trên android 8. Đây là mã nguồn nếu có ai muốn tạo lại nó.
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 nó trên google issue tracker
Tôi đã nhìn vào mã nguồn Android và thấy điều này: https://android.googlesource.com/platform/frameworks/ opt/telephony/+/987378c0704f6000e8f99a36dd032c99f926b81a/src/java/android/telephony/SmsManager.java (phương thức: sendTextMessage, dòng 263) Có một cuộc gọi đến getSubscriptionId (), được bảo vệ bằng READ_PHONE_STATE_PERMISSION, sau đó nếu ứng dụng không được phép/kiểm tra quyền này, gọi phương thức này sẽ gây ra SecurityException và ứng dụng sẽ bị lỗi. Giải pháp là (khi ứng dụng tuyên bố sử dụng READ_PHONE_STATE) là cấp quyền theo cách thủ công từ cài đặt. – tnachev
Vì vậy, rõ ràng điều này là cố định trong bản cập nhật 8.1. Chưa xác nhận. Vẫn không có phản hồi chính thức từ google – somerandomusername