๐ฉ advanced_sms_log
โ Android SMS log reader (inbox/sent/etc)
โ Real-time incoming SMS listener (stream)
โ OTP read (User Consent API) โ Play-safe
Platforms: โ Android | โ iOS (not supported by iOS APIs)
๐ธ Screenshots
โจ Features
โ 1) SMS log reader
- Read SMS logs:
- Inbox / Sent / Draft / Outbox / Failed / Queued / All
- Filters:
address,bodyContains,threadId, date rangefrom/to
- Pagination:
limit+offset
- Best-effort SIM info:
subId(if available on device/ROM)
โ 2) Real-time listener (stream)
- Incoming SMS events:
- Works while your app process is alive
- Uses BroadcastReceiver for
SMS_RECEIVED
- Optional store change watcher:
- ContentObserver on
content://sms - Emits
store_changedevents (and can fetch latest message ifREAD_SMSgranted)
- ContentObserver on
โ 3) Send SMS + status callbacks (optional)
- Send SMS through this plugin (uses
SmsManager) - Get
sent/deliveredcallbacks via events stream
(Status callbacks are only guaranteed for messages sent via this plugin.)
โ 4) OTP read (recommended for Play)
- OTP via SMS User Consent API
- No
READ_SMS/RECEIVE_SMSruntime permission required - Provide a regex like
\b\d{4,8}\b
โ ๏ธ Google Play policy note (important)
Google Play restricts use of SMS permissions (like READ_SMS, RECEIVE_SMS).
If your app does not qualify under Play policies, do not include those permissions.
Use OTP via User Consent / SMS Retriever instead.
๐ฆ Install
dependencies:
advanced_sms_log: ^1.0.1
๐ค Android setup
Permissions (only if you use full logs + incoming SMS receiver)
Add to your app android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<!-- Only if you send SMS via plugin -->
<uses-permission android:name="android.permission.SEND_SMS" />
If you publish on Google Play, ensure policy compliance before requesting SMS permissions.
OTP dependency
This plugin uses Google Play Services Auth API Phone for OTP consent.
The dependency is already included in the plugin's Android Gradle config.
๐ Usage
1) Read SMS logs
import 'package:advanced_sms_log/advanced_sms_log.dart';
final ok = await AdvancedSmsLog.requestSmsLogPermission();
if (!ok) return;
final items = await AdvancedSmsLog.getSms(
box: SmsBox.inbox,
limit: 50,
offset: 0,
bodyContains: 'otp',
);
for (final m in items) {
print('${m.address} ${m.date} ${m.body}');
}
2) Real-time incoming SMS listener
await AdvancedSmsLog.startIncomingListener(
useBroadcast: true,
useObserver: true,
);
final sub = AdvancedSmsLog.events.listen((e) {
if (e.type == SmsEventType.received) {
final sms = e.sms;
print('Incoming: ${sms?.address} -> ${sms?.body}');
}
});
// later...
// await AdvancedSmsLog.stopIncomingListener();
// await sub.cancel();
3) OTP read (User Consent)
await AdvancedSmsLog.startOtpUserConsent(
otpRegex: r'\b\d{4,8}\b',
);
AdvancedSmsLog.events.listen((e) {
if (e.type == SmsEventType.otp) {
print('OTP: ${e.otp}');
print('Message: ${e.message}');
}
});
4) Send SMS (optional)
final ok = await AdvancedSmsLog.requestSendPermission();
if (!ok) return;
final sent = await AdvancedSmsLog.sendSms(
to: '+919999999999',
message: 'Hello from advanced_sms_log',
);
print('sendSms(): $sent');
๐ API
Enums
SmsBox:inbox,sent,draft,outbox,failed,queued,all
Models
SmsLogid,address,body,date,dateSent,threadId,type,read,seen,subId
Events (single stream)
receivedโSmsLogstore_changedโSmsLog?(ifREAD_SMSgranted, we include latest)sent_statusโ{messageId, kind, status, resultCode}otpโ{otp, message}errorโ{error}
๐ Docs
doc/USAGE.mddoc/ARCHITECTURE.md
โ Sponsor a cup of tea
If this package saves you development time, consider supporting my work.
https://github.com/sponsors/nousath
๐งพ Changelog
See CHANGELOG.md.