Giới thiệu
Trong thời đại số hiện nay, việc quản lý thông báo trên điện thoại thông minh trở nên quan trọng hơn bao giờ hết, đặc biệt là khi bạn muốn đảm bảo rằng thông tin quan trọng không bị mất mát. Message Mirror là một ứng dụng Android mã nguồn mở cho phép bạn chuyển tiếp các thông báo và SMS đến một webhook mà bạn kiểm soát. Bài viết này sẽ giúp bạn hiểu rõ hơn về ứng dụng, cách thức hoạt động, cũng như các mẹo và thực tiễn tốt nhất khi sử dụng.
Tóm tắt nhanh (TL;DR)
- What: Ứng dụng Android mã nguồn mở gửi thông báo và SMS đến webhook của bạn.
- How: Sử dụng dịch vụ foreground và engine Flutter không giao diện;
NotificationListenerService
trong Kotlin chuyển tiếp dữ liệu đến Dart quaMethodChannel
, sau đó gửi HTTP POST với cơ chế thử lại. - Why: Giữ quyền kiểm soát dữ liệu của bạn, hoạt động ổn định qua các lần khởi động lại, tùy chỉnh payloads.
- Repo: GitHub
Vấn đề và Giải pháp
Trong quá trình tìm kiếm một giải pháp đơn giản và đáng tin cậy để chuyển tiếp các tin nhắn từ điện thoại Android của mình đến một máy chủ mà tôi kiểm soát, tôi đã gặp phải một số vấn đề với các ứng dụng hiện có:
- Chuyển tiếp dưới dạng JSON đến webhook của bản thân, không phải của bên thứ ba.
- Đảm bảo hoạt động liên tục qua các lần khởi động lại và mất kết nối.
- Chỉ chuyển tiếp từ các ứng dụng mà tôi chọn.
- Giảm thiểu sự phức tạp và cung cấp nhật ký rõ ràng.
Vì vậy, tôi đã phát triển Message Mirror, một ứng dụng Android luôn hoạt động, có khả năng thu thập thông báo và SMS và chuyển tiếp chúng đến một endpoint đã cấu hình.
Mục tiêu thiết kế
- KISS: Mã nguồn nhẹ, ưu tiên các thành phần nền tảng thay vì các phụ thuộc nặng.
- Kiểm soát dữ liệu: Không sử dụng máy chủ bên thứ ba; bạn tự cấu hình endpoint.
- Gửi thông báo bền bỉ: Sử dụng dịch vụ foreground và engine Flutter không giao diện với hàng đợi thử lại.
- Trải nghiệm người dùng thực tiễn: Cung cấp nhật ký rõ ràng và bộ lọc theo ứng dụng.
- Tối giản: Không thêm tính năng thừa thãi cho các tình huống không cần thiết.
Kiến trúc tổng quan
┌──────────────┐ onNotificationPosted ┌──────────────────────┐
│ Android OS │ ─────────────────────────────▶ │ MsgNotificationListener│ (NotificationListenerService)
└──────────────┘ └─────────┬────────────┘
(A)│ gọi trực tiếp
broadcast lol.arian.notifmirror.NOTIF_EVENT (B)│ phát sóng
▼
┌──────────────────────┐
│ NotifEventReceiver │ (BroadcastReceiver)
└─────────┬────────────┘
│ MethodChannel("msg_mirror")
▼
┌──────────────────────┐
│ Dart MessageStream │
│ - xây dựng payload │
│ - loại bỏ trùng lặp │
│ - POST đến endpoint │
│ - hàng đợi thử lại │
└─────────┬────────────┘
│ HTTP
▼
Your Webhook/API
Extras:
- AlwaysOnService: Dịch vụ foreground khởi động engine Flutter không giao diện
- BootReceiver: Khởi động dịch vụ sau khi thiết bị khởi động
- ApiSender: HTTP fallback nếu channel không sẵn sàng
- LogStore: Ghi log vào file và logcat
Các phần cốt lõi (mã ví dụ)
1) Kotlin: Bắt thông báo
kotlin
// android/app/src/main/kotlin/.../MsgNotificationListener.kt (trích đoạn)
override fun onNotificationPosted(sbn: StatusBarNotification) {
val n = sbn.notification ?: return
val extras: Bundle = n.extras
val app = sbn.packageName ?: ""
val title = extras.getCharSequence("android.title")?.toString() ?: ""
// Xử lý các trường thông báo
// ...
}
2) Kotlin: Khởi động engine trong dịch vụ foreground
kotlin
// android/app/src/main/kotlin/.../AlwaysOnService.kt (trích đoạn)
private fun initFlutterEngine() {
// Khởi động engine
// ...
}
3) Dart: Xây dựng payload
dart
// lib/message_stream.dart (trích đoạn)
Future<Map<String, dynamic>?> _buildNotifPayload(Map<dynamic, dynamic> m) async {
// Xây dựng payload từ thông báo
// ...
}
Tùy chỉnh Payload
Bạn có thể tùy chỉnh JSON với một mẫu lưu trong preferences. Ví dụ:
json
{
"message_body": "{{body}}",
"message_from": "{{from}}",
"message_date": "{{date}}"
}
Hướng dẫn sử dụng OEM
- Sử dụng dịch vụ foreground để đảm bảo quy trình không bị gián đoạn.
- Đảm bảo khởi động lại sau khi thiết bị khởi động.
- Tạo giao diện người dùng để người dùng có thể cấu hình ứng dụng một cách dễ dàng.
Bảng quyền
POST_NOTIFICATIONS
(Android 13+)BIND_NOTIFICATION_LISTENER_SERVICE
FOREGROUND_SERVICE
INTERNET
vàACCESS_NETWORK_STATE
Kiểm tra nhanh: webhook cục bộ
Khởi động một máy chủ để xác minh payload:
bash
npx http-echo-server --port 9090
Bảo mật và Quyền riêng tư
- Nội dung thông điệp chỉ lưu trữ trên thiết bị cho đến khi bạn gửi đến endpoint.
- Bạn có quyền kiểm soát các ứng dụng nào được chuyển tiếp thông báo.
Kết luận
Message Mirror là một giải pháp hữu ích cho những ai muốn quản lý thông báo và SMS của mình một cách hiệu quả hơn. Nếu bạn thấy bài viết này hữu ích, hãy thử nghiệm với ứng dụng và để lại phản hồi cho tôi biết. Nếu bạn có bất kỳ thắc mắc nào, đừng ngần ngại hỏi nhé!
FAQ
1. Làm thế nào để cài đặt Message Mirror?
Bạn chỉ cần tải xuống mã nguồn từ GitHub và làm theo hướng dẫn cài đặt.
2. Ứng dụng có miễn phí không?
Có, Message Mirror là mã nguồn mở và hoàn toàn miễn phí.
3. Tôi có thể tùy chỉnh payload không?
Có, bạn có thể tùy chỉnh payload theo nhu cầu của mình.