为什么SmsManager在某些设备上需要READ_PHONE_STATE权限而在其他设备上不需要?

时间:2017-05-14 11:08:54

标签: android android-permissions android-sms

该应用使用SmsManager发送短信。仅在成功从用户获取SEND_SMS运行时权限后才调用以下方法。该应用针对API 25。

public static void sendSmsTextMessage(Context context, String number, String message) {
    SmsManager sms = SmsManager.getDefault();
    int permissionCheck = ContextCompat.checkSelfPermission(context, Manifest.permission.SEND_SMS);
    if (permissionCheck == PERMISSION_DENIED) {
        Timber.e("Permission to send SMS denied");
    } else {
        sms.sendTextMessage(number, null, message, null, null);
    }

}

到目前为止,它已经在所有已经过测试的设备上运行良好。但它现在已经被用在手机上,Logicom L-EMENT 553,当试图在API 23(Marshmallow)上调用sendTextMessage()时,应用程序会爆炸,但有以下异常:

Exception java.lang.RuntimeException: Failure delivering result
ResultInfo{who=@android:requestPermissions:, request=1, result=-1,
data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has
extras) }} to activity 
{com.myapp.android/com.myapp.android.ui.bet.BetActivity}: 
java.lang.SecurityException: Neither user 10108 nor current process
has android.permission.READ_PHONE_STATE.

为什么在发送短信时某些设备上需要READ_PHONE_STATE权限,而其他设备则不需要?显然,最好不要求此权限,因为用户要求提供此级别的访问权限。

这里的问题答案Why would sendTextMessage require READ_PHONE_STATE permission?表明某些Android版本包含一个请求此权限的错误,但是这个或者是sendTextMessage()方法是否超过了长度限制传递了一条消息,然后继续使用divideMessage()分割它然后请求此权限?虽然说过我没有看到任何证据,但sendMessage()会自动将长消息分成小块并发送它们。

1 个答案:

答案 0 :(得分:1)

我认为这是因为一些制造商纠正了Android中的错误。我在模拟器(Android 8.0,API 26)中尝试过,它会在sendSmsTextMessage()上抛出异常。所以我做了一个像这样的工作:

try {
  SmsManager.getDefault().sendTextMessage(msisdn, null, text, null, null);
  return false;
} catch (Exception e) {
  if (e.toString().contains(Manifest.permission.READ_PHONE_STATE) && ContextCompat
      .checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)!=
      PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[] {Manifest.permission
      .READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE);
    return true;
  } // else it's some other exception
}

......并在清单中:

  <uses-permission-sdk-23 android:maxSdkVersion="26"
     android:name="android.permission.READ_PHONE_STATE"/>

...因为它似乎在API 27中解决了,至少在使用API​​ 27的模拟器中不会发生。