该应用程序使用 SmsManager 发送 SMS 文本消息。以下方法仅在用户成功获取 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.
为什么在发送 SMS 消息时在某些设备上需要 READ_PHONE_STATE 权限,而在其他设备上不需要?显然,最好不要请求此权限,因为提供此级别的访问权限对用户来说是一个很大的要求。
此处问题的答案为什么 sendTextMessage 需要 READ_PHONE_STATE 权限?建议某些 Android 版本包含请求此权限的错误,但是否是 sendTextMessage() 方法传递了超过长度限制的消息,然后继续使用 divideMessage() 拆分它,然后请求此权限?尽管我已经说过我没有看到任何证据 sendMessage() 会自动将长消息分成更小的部分并发送它们。