2017-09-26 37 views
12

Ứ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

+3

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

+0

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

Trả lời

-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

điều này hoàn toàn không có chủ đề – somerandomusername

Các vấn đề liên quan