Ranh giới NotificationListener trên Android: đọc thông báo thanh toán, nhưng không ghi sổ trước khi bạn xác nhận
Tiết lộ: Tôi là lập trình viên indie làm Money Tracker (Android: Money Tracker-Expense & Budget; iOS: Money Tracker:Expense & Budget). Bài cho độc giả kỹ thuật trên Viblo — ranh giới quyền Android, vòng lặp xác nhận, và vì sao app không hỏi mật khẩu ngân hàng. Không “launch hype”, không tặng Premium, không bịa số liệu.
Bài toán: ma sát nhập liệu vs bề mặt xác thực ngân hàng
Trên Android, sau mỗi lần thanh toán QR / ví / chuyển khoản, người dùng thường đã thấy banner thông báo từ app ngân hàng hoặc ví. Nếu app sổ cái bắt gõ lại số tiền, danh mục, ngày ngay lúc đứng ở cửa, thói quen chết vì ma sát — không phải vì “thiếu kỷ luật”.
Phía đối diện là đồng bộ tài khoản / open banking: tiện, nhưng bề mặt tin cậy nhảy từ “đọc text bạn đã thấy trên màn hình” sang “đi qua luồng đăng nhập ngân hàng”. Lo lắng đó là hợp lý.
Money Tracker chọn đường hẹp hơn:
- Không kết nối đăng nhập ngân hàng.
- Không hỏi mật khẩu ngân hàng — bao giờ cũng vậy, không phải disclaimer giấu trong Settings.
- Tự động hóa chỉ đến bản nháp.
- Lịch sử sổ cái chỉ hình thành sau khi con người xác nhận.
Nếu bạn cần đồng bộ ngân hàng đã xác minh làm lõi quy trình, đây không phải sản phẩm đó.
NotificationListener nghĩa là gì — và không nghĩa là gì
Android cho phép cấp quyền truy cập thông báo (notification access / bề mặt kiểu NotificationListenerService) cho một app người dùng chọn. Trong phạm vi đó, app có thể đọc text thông báo mà app khác đã đăng — cùng loại banner “thanh toán thành công” bạn đã nhìn thấy.
Chỗ dễ hiểu nhầm:
| Hiểu nhầm phổ biến | Ranh giới thực tế |
|---|---|
| Giống đăng nhập ngân hàng | Không. Không có username/password ngân hàng |
| Đang gọi API sao kê | Không. Đầu vào là text thông báo đã tới máy |
| Cấp quyền = mọi thông báo vào sổ | Không. Ứng viên chỉ là bản nháp; sổ chính sau xác nhận |
| Cấp một lần = theo dõi mãi không kiểm soát | Có thể thu hẹp bằng blacklist theo app |
Quyền lớn ở chỗ “đọc được câu chữ cảnh báo của app khác”, không phải “sở hữu danh tính ngân hàng” hay “tự ý ghi đè sổ cái”. Thiết kế sản phẩm phải cố định khoảng cách đó bằng UX, không chỉ bằng câu chữ pháp lý.
Pipeline: text thông báo → bản nháp → người xác nhận → lưu
Trên Money Tracker, đường này tên Smart Notification Entry (Cài đặt → nhập thông minh từ thông báo). Nó là tính năng Premium, chỉ Android. iOS không có đường NotificationListener tương đương; người dùng iOS dùng tay / giọng / ảnh hóa đơn.
Luồng rút gọn:
- Bật tính năng trong Premium.
- Cấp notification access (theo dõi alert app khác) và quyền thông báo của chính app (nhắc khi có ứng viên giao dịch).
- Khi app khác đăng thông báo giống giao dịch, Money Tracker coi đó là ứng viên bản nháp.
- Bạn xem số tiền, danh mục… rồi xác nhận. Trước xác nhận, ý đồ thiết kế là không biến nó thành lịch sử sổ vĩnh viễn.
Một dòng:
notification text → draft → human confirm → save
Tôi không mô tả heuristic parser, reverse-engineering theo vendor, hay “danh sách ví hỗ trợ” chưa kiểm chứng. App thanh toán đổi format; liệt kê package chưa test dễ thành fiction marketing. Ý tưởng bền: tái sử dụng alert bạn đã nhận, giữ người trong vòng lặp.
App không muốn theo dõi đưa vào blacklist: thông báo giao dịch từ app đó bị bỏ qua, bản nháp chờ cũng được dọn. Dialog quyền là đồng ý thô một lần; blacklist là thu hẹp phạm vi liên tục — với privacy engineering, đây gần tính năng chính hơn phụ lục.
OCR và giọng nói AI: cùng triết lý “nháp trước, sổ sau”
NotificationListener không phải đường nhập duy nhất. App còn giọng nói AI (giữ micro, nói ngắn kiểu “cơm trưa 35”) và OCR hóa đơn (chụp / chọn ảnh; nhiều dòng có thể thành vài bản nháp).
Cùng quy tắc: kết quả để kiểm tra và sửa, rồi mới lưu. Với sổ cái, định nghĩa “thông minh” quan trọng duy nhất: nó có lưu sai mà không hỏi bạn không? Câu trả lời phải là không.
Checklist ngắn: nói/chụp gọn → kiểm số tiền rồi danh mục → sửa ngày nếu cần → lưu. Tín dụng AI trừ khi lưu xác nhận thành công (miễn phí có trial; Premium theo prompt trong app).
“Xác nhận trước khi lưu” là tính năng privacy
Demo thích cắt checkpoint để trông “toàn tự động”. Trong quyền / privacy / ledger, checkpoint chính là sản phẩm.
| Giai đoạn | Ý nghĩa |
|---|---|
| Đọc thông báo | Trong phạm vi quyền OS — chưa phải sổ |
| Tạo bản nháp | Ứng viên — sửa / bỏ qua được |
| Người xác nhận | Mới “nhận” là chi tiêu của mình |
| Lưu sổ chính | Mới vào thống kê và ngân sách |
Sai một ly cà phê thì khó chịu; sai số lớn hoặc trùng dòng thì mất lòng tin. Mặc định: giao dịch nghi ngờ chờ xác nhận; xác nhận từng dòng hoặc theo lô; nghi trùng đẩy về đường xác nhận thay vì chồng im lặng; không phải chi tiêu thì bỏ qua.
Với reader kỹ thuật: đây không phải import sao kê im lặng, không phải open banking, không phải “cài một lần rồi quên”. Đây là capture ma sát thấp cho người đã nhận alert thanh toán trên Android và chịu bấm Confirm.
Ngân sách trên dữ liệu đã xác nhận — không phụ thuộc bank login
Ngân sách chỉ có nghĩa khi có đủ dòng thật. Ở đây “thật” = dòng người dùng đã xác nhận vào sổ — dù nguồn là tay, giọng, OCR, hay nháp thông báo Android.
- Capture có thể nhiều đường.
- Mọi đường đi qua xác nhận (hoặc sửa rồi lưu).
- Ngân sách / thống kê chạy trên dữ liệu đã xác nhận đó.
Không dựng cấu trúc “không nối ngân hàng thì ngân sách trống”. Tăng capture nhưng ownership lịch sử vẫn phía người dùng.
Freemium và các biên cố định
| Biên | Ý nghĩa |
|---|---|
| Không đăng nhập ngân hàng | Không đồng bộ tài khoản; không hỏi mật khẩu ngân hàng |
| Smart Notification Entry | Chỉ Android + Premium |
| Confirm-oriented | Nháp → xác nhận; trước xác nhận không coi là sổ chính |
| Blacklist | Người dùng kiểm soát app nào được theo dõi |
| Freemium | Miễn phí có quảng cáo + ghi chép / ngân sách cơ bản; Premium năm tùy chọn (bỏ ads, nới AI / hóa đơn, khóa app, thêm sổ… — theo màn hình trong app) |
| AI giọng + OCR | Nhập tùy chọn; sửa trước khi lưu; miễn phí có trial, Premium nới hạn |
Format thông báo khác nhau theo app; có nhiễu; bỏ qua / sửa được. Không tuyên bố “mọi ví parse hoàn hảo”. Không bịa số liệu.
Phù hợp / không phù hợp
Nên xem xét nếu: thanh toán trên điện thoại nhiều, đã thấy notification, không muốn đưa mật khẩu ngân hàng vào tool ngân sách, chịu vài giây xác nhận nháp.
Bỏ qua nếu chỉ iOS, cần đồng bộ ngân hàng làm trung tâm, hoặc bắt buộc zero confirmation. Đường nhập khác vẫn dùng được không cần Smart Notification Entry.
Kết
Thesis kỹ thuật tôi muốn giữ cố định:
“Đọc được thông báo” và “ghi vào sổ” phải tách trên quyền hệ thống lẫn trên sản phẩm. Tự động hóa dừng ở bản nháp. Người quyết định lịch sử.
Đó cũng là lý do không có bank password flow: không mở rộng bề mặt xác thực ngân hàng chỉ để giảm vài lần gõ. Notification text + OCR/voice + confirm-before-save là trust boundary nhỏ hơn — chậm hơn demo “full auto”, nhưng trung thực hơn với ledger.
Nếu muốn xem cùng ranh giới trên trang sản phẩm tiếng Việt:
https://money.quhou123.com/vi/?utm_source=viblo&utm_medium=article&utm_campaign=offsite_w1
(Android & iPhone; miễn phí có ads; Premium năm tùy chọn; không đăng nhập ngân hàng.)
Bài bởi nhà phát triển Money Tracker (daniel zheng). Soft mention sản phẩm; không tặng Premium; không nêu đối thủ; không bịa stats.
All rights reserved