Android中SMS代码createFromPdu()方法报错问题求助
解决SmsMessage.createFromPdu()报错的方案
1. 方法弃用导致的编译报错
createFromPdu(byte[])在Android API 23(Android 6.0)已被标记为弃用,若你的编译SDK版本≥23,IDE会提示报错。此时无需额外添加依赖,直接替换为兼容的重载方法:
- 需指定短信格式(如3GPP/3GPP2)时,使用:
其中SmsMessage message = SmsMessage.createFromPdu((byte[]) obj, format);format为字符串类型,可取SmsConstants.FORMAT_3GPP或SmsConstants.FORMAT_3GPP2,需根据短信来源判断。 - 若目标SDK版本≥26(Android 8.0),推荐使用更完善的方法:
该方法支持传入短信发送方号码,可避免后续获取号码时的潜在问题。SmsMessage message = SmsMessage.createFromPduWithPhoneNumber((byte[]) obj, format, originatingAddress);
2. 权限缺失导致的运行时报错
若运行时抛出SecurityException,需在AndroidManifest.xml中添加对应权限:
<!-- Android 10及以下所需权限 --> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <!-- Android 11及以上,除静态权限外,需在代码中动态申请POST_NOTIFICATIONS权限(若需显示短信通知) -->
注意:Android 6.0及以上,RECEIVE_SMS和READ_SMS属于危险权限,必须在代码中动态申请,不能仅依赖静态声明。
3. 类型转换错误导致的报错
若报错为ClassCastException,说明obj实际类型不是byte[]。比如在广播接收器中处理短信时,intent.getByteArrayExtra("pdus")返回的是byte[][],需遍历数组逐个处理:
byte[][] pdus = (byte[][]) intent.getSerializableExtra("pdus"); for (byte[] pdu : pdus) { SmsMessage message = SmsMessage.createFromPdu(pdu, format); // 处理短信内容 }
无需额外添加依赖
SmsMessage属于Android框架的android.telephony包,是Android SDK自带类,无需引入第三方依赖。只需确保项目的compileSdkVersion、targetSdkVersion配置正确,且依赖的Android SDK包含该类(默认已包含)。
内容的提问来源于stack exchange,提问作者Ayush Vaze
相关产品推荐
相关产品推荐

