2013-07-25 33 views
9

Android có một dịch vụ thông báo người nghe mới là 4,3: http://developer.android.com/about/versions/jelly-bean.html http://developer.android.com/reference/android/service/notification/NotificationListenerService.htmlTruy cập Android NotificationListenerService Cài đặt

Từ các tài liệu:

truy cập Notification được tắt theo mặc định - ứng dụng có thể sử dụng một ý định mới để đưa người dùng trực tiếp đến Cài đặt để bật dịch vụ người nghe sau khi cài đặt.

Tôi không thấy ý định kích hoạt tài liệu ở bất cứ đâu. Perusing doc Cài đặt dường như không hữu ích: http://developer.android.com/reference/android/provider/Settings.html

Nhìn vào lớp Cài đặt trực tiếp: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/provider/Settings.java

tôi thấy ACTION_NOTIFICATION_LISTENER_SETTINGS xác định, nhưng khi sử dụng Android Studio và chỉ vào 4,3 ACTION_NOTIFICATION_LISTENER_SETTINGS không thể được giải quyết:

Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS); 

Đang cố gắng nó bằng tay hơn dường như không làm việc:

Intent intent = new Intent(Intent.ACTION_MAIN); 
intent.setClassName("com.android.settings", "android.settings.NOTIFICATION_LISTENER_SETTINGS"); 

chỉnh sửa: làm việc đó một cách chính xác như CommonsWare chỉ ra dưới đây:

Intent intent=new Intent("android.settings.NOTIFICATION_LISTENER_SETTINGS"); 

dẫn đến một vụ tai nạn:

(android.content.ActivityNotFoundException: Không Hoạt động phát hiện để xử lý Ý định {hành động = android.settings.NOTIFICATION_LISTENER_SETTINGS})

Tôi có thiếu gì đó không? Tôi không chắc chắn cách gửi người dùng đến màn hình cài đặt thích hợp để bật dịch vụ này trong ứng dụng của tôi.

+0

câu hỏi thú vị. Có thể với API mới để nhận được văn bản thông báo và sự vứt bỏ hay không? – Cilenco

+0

Đúng, sau khi dịch vụ được thiết lập, bạn có thể lấy thông báo trực tiếp (http://developer.android.com/reference/android/app/Notification.html) – powerj1984

+0

Được rồi! Nhưng không có mathod để nhận được thông báo hoặc văn bản discription từ một 'StatusBarNotification' – Cilenco

Trả lời

14

Tôi có thiếu gì đó không?

Vâng, trong lần cuối cùng, bạn đang tạo một chuỗi hành động với tên lớp. Phương pháp "thủ công" sẽ là:

Intent intent=new Intent("android.settings.NOTIFICATION_LISTENER_SETTINGS"); 

Về lý do tại sao Android Studio không tìm thấy Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS, mà tôi không thể nói.


CẬP NHẬT

Dựa trên các cuộc thảo luận trong các ý kiến, Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS không có trong Android SDK hiện tại (được đánh dấu bằng @hide) tại.Ngoài ra, manifest cho ứng dụng Settings có một phiên bản hơi khác nhau của chuỗi hành động:

Intent intent=new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); 
+0

Hóa ra ACTION_NOTIFICATION_LISTENER_SETTINGS có @hide trong tài liệu của nó, Tôi đoán không nên ở đó - mặc dù tôi nghĩ rằng nó sẽ chỉ ẩn tài liệu, không làm cho nó không thể giải quyết w ithin Android Studio. Thật không may cố gắng nó theo cách đề cập trong câu trả lời của bạn kết thúc với một vụ tai nạn: Nguyên nhân: android.content.ActivityNotFoundException: Không Hoạt động phát hiện để xử lý Ý định {hành động = android.settings.NOTIFICATION_LISTENER_SETTINGS – powerj1984

+1

@ powerj1984: "Hóa ra ACTION_NOTIFICATION_LISTENER_SETTINGS có @hide trong tài liệu của nó "- Tôi không thấy điều đó trong nguồn bạn liên kết tới. "mặc dù tôi nghĩ rằng nó sẽ chỉ ẩn tài liệu" - không, '@ ẩn' loại bỏ các mục từ SDK hoàn toàn. Về 'ActivityNotFoundException', bạn đang thử nghiệm cái gì? – CommonsWare

+0

Số dòng 667 trong nguồn được liên kết không có @hide? Lạ lùng, nó kết thúc. Thử nghiệm trên Nexus 4 với 4.3 – powerj1984

5

bổ sung để CommonsWare trả lời ở đây là làm thế nào để kiểm tra xem bạn có quyền mà

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 
    boolean weHaveNotificationListenerPermission = false; 
    for (String service : NotificationManagerCompat.getEnabledListenerPackages(this)) { 
     if (service.equals(getPackageName())) 
      weHaveNotificationListenerPermission = true; 
    } 
    if (!weHaveNotificationListenerPermission) {  //ask for permission 
     Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); 
     startActivity(intent); 
    } 
} 
Các vấn đề liên quan