๐Ÿ“ฉ 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

advanced_sms_log screenshot


โœจ Features

โœ… 1) SMS log reader

  • Read SMS logs:
    • Inbox / Sent / Draft / Outbox / Failed / Queued / All
  • Filters:
    • address, bodyContains, threadId, date range from/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_changed events (and can fetch latest message if READ_SMS granted)

โœ… 3) Send SMS + status callbacks (optional)

  • Send SMS through this plugin (uses SmsManager)
  • Get sent / delivered callbacks via events stream
    (Status callbacks are only guaranteed for messages sent via this plugin.)
  • OTP via SMS User Consent API
  • No READ_SMS / RECEIVE_SMS runtime 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.0

๐Ÿค– 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();
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

  • SmsLog
    • id, address, body, date, dateSent, threadId, type, read, seen, subId

Events (single stream)

  • received โ†’ SmsLog
  • store_changed โ†’ SmsLog? (if READ_SMS granted, we include latest)
  • sent_status โ†’ {messageId, kind, status, resultCode}
  • otp โ†’ {otp, message}
  • error โ†’ {error}

๐Ÿ“„ Docs

  • docs/USAGE.md
  • docs/ARCHITECTURE.md

โ˜• Sponsor a cup of tea

If this package saves you development time, consider supporting my work.

Sponsor

https://github.com/sponsors/nousath


๐Ÿงพ Changelog

See CHANGELOG.md.

Libraries

advanced_sms_log