Android高版本(API36+)非默认短信APP发送短信问题求助
如何绕过Android近期限制,让非默认短信APP后台发送短信?
我正在开发一款Android应用(最低API级别:24,目标API级别:36),需要发送短信,使用SmsManager.getDefault()方法获取实例。原本以为Android新版本仅限制Google Play商店应用必须是默认短信APP才能发送短信,设备层面不会强制限制,但实际并非如此。找到的相关教程要么过时、要么不够具体,都未覆盖该场景。
应用尝试发送短信时崩溃,栈跟踪信息如下:
Process: xyz.Pangea.smsforwarder, PID: 19038 java.lang.RuntimeException: Unable to start receiver xyz.Pangea.smsforwarder.SMSListener: java.lang.SecurityException: Sending SMS message: uid 10218 does not have android.permission.SEND_SMS. at android.app.ActivityThread.handleReceiver(ActivityThread.java:5672) at android.app.ActivityThread.-$$Nest$mhandleReceiver(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2904) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loopOnce(Looper.java:273) at android.os.Looper.loop(Looper.java:363) at android.app.ActivityThread.main(ActivityThread.java:10060) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975) Caused by: java.lang.SecurityException: Sending SMS message: uid 10218 does not have android.permission.SEND_SMS. at android.os.Parcel.createExceptionOrNull(Parcel.java:3354) at android.os.Parcel.createException(Parcel.java:3338) at android.os.Parcel.readException(Parcel.java:3321) at android.os.Parcel.readException(Parcel.java:3263) at com.android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.java:1976) at android.telephony.SmsManager$1.onSuccess(SmsManager.java:768) at android.telephony.SmsManager.sendResolverResult(SmsManager.java:1818) at android.telephony.SmsManager.resolveSubscriptionForOperation(SmsManager.java:1779) at android.telephony.SmsManager.sendTextMessageInternal(SmsManager.java:763) at android.telephony.SmsManager.sendTextMessage(SmsManager.java:596) at xyz.Pangea.smsforwarder.SMSListener.onReceive(SMSListener.kt:54) at android.app.ActivityThread.handleReceiver(ActivityThread.java:5663) ... 9 more
我的AndroidManifest.xml配置如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-feature android:name="android.hardware.telephony" android:required="false" /> <uses-permission android:name="android.permission.RECEIVE_SMS" tools:ignore="SmsAndCallLogPolicy" /> <uses-permission android:name="android.permission.SEND_SMS" tools:ignore="SmsAndCallLogPolicy" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.SMSForwarder"> <receiver android:exported="true" android:enabled="true" android:name="xyz.Pangea.smsforwarder.SMSListener" android:permission="android.permission.BROADCAST_SMS"> <intent-filter android:priority="2147483647"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
注意:应用接收短信功能完全正常,且测试手机的设置中已为该应用授予短信权限(系统未区分发送和接收权限)。
我想知道是否有方法绕过该限制?我知道可以通过Intent调用默认短信应用发送消息,但这种方式会打断用户操作,我希望能在后台完成发送。
针对可能的建议,提前说明:
- 为何不使用现有应用?现有应用均要求登录或注册第三方服务。
- 已有开源版本?我希望自己开发。
- 违反政策无法上架Play商店?该应用仅作私人使用,不会上架Google Play商店,也不会开源。
内容的提问来源于stack exchange,提问作者GooseyLoosey
相关产品推荐
相关产品推荐

