Oll*_*e C 5 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);
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,它已经在所有已经过测试的设备上运行良好.但它现在已经被用在手机上,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.
Run Code Online (Sandbox Code Playgroud)
为什么在某些设备上需要READ_PHONE_STATE权限,而在发送短信时却不需要其他设备?显然,最好不要求此权限,因为用户提出这种访问级别是一个很大的要求.
这里问题的答案为什么sendTextMessage需要READ_PHONE_STATE权限?建议一些Android版本包含一个请求此权限的错误,但这是或者sendTextMessage()方法是否通过长度限制传递消息,然后继续使用divideMessage()然后请求此权限拆分它?虽然说过我没有看到任何证据,但sendMessage()会自动将长消息拆分成较小的片段并发送它们.
小智 2
我认为这是因为一些制造商纠正了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
}
Run Code Online (Sandbox Code Playgroud)
...并且在清单中:
<uses-permission-sdk-23 android:maxSdkVersion="26"
android:name="android.permission.READ_PHONE_STATE"/>
Run Code Online (Sandbox Code Playgroud)
...因为它似乎在 API 27 中解决了,至少在 API 27 的模拟器中不会发生。
归档时间: |
|
查看次数: |
1560 次 |
最近记录: |