arsamme / flutter-sms-retriever

Flutter plugin for retrieving OTP code sent in sms automatically and without getting SMS permission in Android.
MIT License
8 stars 11 forks source link

Android 14 and up are currently not supported. #10

Open haythamnikolaidis opened 2 months ago

haythamnikolaidis commented 2 months ago

The Bug When calling await AndroidSmsRetriever.listenForSms() an Android 14 device the following runtime error is thrown:

E/MethodChannel#ars_sms_retriever/method_ch( 5182): java.lang.SecurityException: za.co.outsurance.app.dev: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.os.Parcel.createExceptionOrNull(Parcel.java:3057)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.os.Parcel.createException(Parcel.java:3041)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.os.Parcel.readException(Parcel.java:3024)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.os.Parcel.readException(Parcel.java:2966)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.app.IActivityManager$Stub$Proxy.registerReceiverWithFeature(IActivityManager.java:5684)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1852)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:1792)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:767)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at me.arsam.sms_retriever.SmsRetrieverPlugin.onMethodCall(SmsRetrieverPlugin.kt:212)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:267)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.os.Handler.handleCallback(Handler.java:958)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.os.Handler.dispatchMessage(Handler.java:99)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.os.Looper.loopOnce(Looper.java:205)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.os.Looper.loop(Looper.java:294)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.app.ActivityThread.main(ActivityThread.java:8177)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
E/MethodChannel#ars_sms_retriever/method_ch( 5182): Caused by: android.os.RemoteException: Remote stack trace:
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at com.android.server.am.ActivityManagerService.registerReceiverWithFeature(ActivityManagerService.java:13927)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2570)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2720)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.os.Binder.execTransactInternal(Binder.java:1339)
E/MethodChannel#ars_sms_retriever/method_ch( 5182):     at android.os.Binder.execTransact(Binder.java:1275)

This is error is caused by a change in API in Android 14 (API level 34)

Steps to reproduce

  1. Call await AndroidSmsRetriever.listenForSms() on an Android emulator targeting API Level 34 or higher

Suggest Resolution In the SMSRetrieverPlugin.kt change lines 212 to 216 from:

mContext.registerReceiver(
    smsReceiver,
    IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION), 
    SmsRetriever.SEND_PERMISSION,
    null,
)

to:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
     mContext.registerReceiver(
         smsReceiver,  
         IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION), 
         SmsRetriever.SEND_PERMISSION,
         null,
         RECEIVER_EXPORTED
    )
}else {
     mContext.registerReceiver(
         smsReceiver,
         IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION),
         SmsRetriever.SEND_PERMISSION,
         null,
    )
}
yashpalzala commented 1 month ago

I have found a package that has this fixed you can give it a try. https://pub.dev/packages/otp_autofill_sms_consent/score