Fix targetSdkVersion 34 RegisterReceiver Issue in Android 14 | Sửa lỗi targetSdkVersion 34 với registerReceiver trong Android
🔍 Giới Thiệu
Khi nâng cấp targetSdkVersion lên 34 hoặc cao hơn, bạn có thể gặp lỗi liên quan đến phương thức registerReceiver() do thay đổi trong chính sách bảo mật của Android 14 (API Level 34). Cụ thể, Context.RECEIVER_EXPORTED hoặc Context.RECEIVER_NOT_EXPORTED cần được chỉ định khi đăng ký BroadcastReceiver.
Bài viết này sẽ hướng dẫn cách sửa lỗi khi gọi registerReceiver()
trong ứng dụng Android chạy trên API 34 trở lên.
📌 Tài liệu tham khảo chính thức từ Google: Android 14 Behavior Changes
🚨 Lỗi Gặp Phải
Khi nâng cấp targetSdkVersion lên 34, nếu bạn sử dụng registerReceiver() mà không truyền thêm flag, bạn có thể gặp lỗi giống như sau:
@Override
public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter) {
return super.registerReceiver(receiver, filter);
}
💡 Lỗi:
registerReceiver(BroadcastReceiver, IntentFilter) in Context is deprecated.
Do thay đổi trong Android 14, bạn bắt buộc phải chỉ định Context.RECEIVER_EXPORTED hoặc Context.RECEIVER_NOT_EXPORTED.
📌 Xem chi tiết về registerReceiver: Android Developers – registerReceiver
✅ Cách Fix
Bạn có thể sử dụng cách kiểm tra phiên bản API để xử lý tương thích như sau:
@Override
public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter) {
if (Build.VERSION.SDK_INT >= 34 && getApplicationInfo().targetSdkVersion >= 34) {
return super.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED);
} else {
return super.registerReceiver(receiver, filter);
}
}
📌 Giải thích:
- Nếu ứng dụng đang chạy trên Android 14 (API 34) và có targetSdkVersion >= 34, ta cần truyền thêm flag Context.RECEIVER_EXPORTED.
- Nếu ứng dụng chạy trên các phiên bản thấp hơn, ta vẫn dùng registerReceiver() như trước.
🔧 Khi Nào Dùng Context.RECEIVER_NOT_EXPORTED
?
Trong một số trường hợp, bạn có thể muốn giữ BroadcastReceiver chỉ hoạt động trong ứng dụng của mình (không thể gọi từ bên ngoài). Khi đó, thay vì Context.RECEIVER_EXPORTED, bạn sẽ dùng Context.RECEIVER_NOT_EXPORTED:
@Override
public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter) {
if (Build.VERSION.SDK_INT >= 34 && getApplicationInfo().targetSdkVersion >= 34) {
return super.registerReceiver(receiver, filter, Context.RECEIVER_NOT_EXPORTED);
} else {
return super.registerReceiver(receiver, filter);
}
}
📌 Khi nào dùng Context.RECEIVER_NOT_EXPORTED?
- Khi bạn không muốn BroadcastReceiver có thể nhận broadcast từ ứng dụng khác.
- Tăng cường bảo mật bằng cách giới hạn phạm vi hoạt động của receiver.
📌 Hướng dẫn từ Google về BroadcastReceiver: Android Developers – BroadcastReceiver
🛠 Cách Kiểm Tra Và Debug
Nếu bạn không chắc chắn ứng dụng của mình có đang chạy trên Android 14 hay không, bạn có thể log phiên bản API để kiểm tra:
Log.d("DEBUG", "API Level: " + Build.VERSION.SDK_INT);
Log.d("DEBUG", "Target SDK: " + getApplicationInfo().targetSdkVersion);
🎯 Kết Luận
- Android 14 (API 34) yêu cầu các ứng dụng chỉ định Context.RECEIVER_EXPORTED hoặc Context.RECEIVER_NOT_EXPORTED khi sử dụng registerReceiver().
- Sử dụng
Build.VERSION.SDK_INT
để kiểm tra phiên bản API và truyền flag phù hợp. - Nếu muốn giữ BroadcastReceiver chỉ hoạt động trong ứng dụng, hãy sử dụng Context.RECEIVER_NOT_EXPORTED.
📌 Tìm hiểu thêm về thay đổi trong Android 14: Official Android 14 Developer Guide
💡 Hy vọng bài viết này giúp bạn fix lỗi minSdk 34 với registerReceiver()
một cách nhanh chóng! Nếu có thắc mắc, hãy để lại bình luận nhé. 🚀
Share this content:
Post Comment