2015-10-23 17 views
20

bất cứ khi nào tôi cố gắng truy vấn Thống kê sử dụng của UsageStatsManager tôi có thể tải ứng dụng chạy cuối cùng một cách chính xác. Tuy nhiên, nếu tôi kéo thanh trạng thái xuống và có thông báo mới, ứng dụng được sử dụng lần cuối (dựa trên UsageStats) sẽ thay đổi thành thông báo. Kết quả là, tôi nhận được báo động sai rằng ứng dụng nền trước đã thay đổi.Android 6.0 Marshmallow UsageStatsQuản lý sự cố khi cố gắng truy xuất ứng dụng tiền cảnh

Tôi dường như không thể tìm cách lọc các hình vẽ cụ thể đó. Ý tưởng nào?

Ngay bây giờ, tôi truy vấn ứng dụng nền trước có mã sau. Vấn đề tồn tại chỉ trong Marshmallow (5.X hoạt động chính xác).

UsageStatsManager mUsageStatsManager = (UsageStatsManager) rotationManager.getSystemService("usagestats"); 
long time = System.currentTimeMillis(); 
// We get usage stats for the last 10 seconds 
List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 2, time); 
// Sort the stats by the last time used 
if (stats != null) { 
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>(); 
for (UsageStats usageStats : stats) { 
    mySortedMap.put(usageStats.getLastTimeUsed(), usageStats); 
} 
if (mySortedMap != null && !mySortedMap.isEmpty()) { 
    foregroundApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); 
} 
} 
+0

Hãy xem https://github.com/ricvalerio/foregroundappchecker, đó có thể là những gì bạn cần. – rvalerio

Trả lời

9

Bạn có thể truy vấn usageEvent để kiểm tra xem sự kiện của ứng dụng đang hoạt động gần đây nhất có phải là UsageEvents.Event.MOVE_TO_FOREGROUND hay không.

Sau khi bạn nhận được foregroundApp, bạn có thể tham khảo các đoạn mã sau:

UsageEvents usageEvents = mUsageStatsManager.queryEvents(time - 100 * 1000, time); 
UsageEvents.Event event = new UsageEvents.Event(); 
// get last event 
while (usageEvent.hasNextEvent()) { 
    usageEvent.getNextEvent(event); 
} 
if (foregroundApp.equals(event.getPackageName()) && event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) { 
    return foregroundApp ; 
} 
+1

Cảm ơn bạn rất nhiều! Điều này giải quyết vấn đề ngay bây giờ ... cho đến khi Google quyết định thay đổi lại:) ... – fcdimitr

+0

Cảm ơn bạn rất nhiều vì câu trả lời này. Tôi đang tìm kiếm điều này từ nhiều ngày. một lần nữa cảm ơn bạn rất nhiều hoạt động của nó rất tốt. :) – WonderSoftwares

+1

Giải pháp đang hoạt động nhưng có rất ít vấn đề. Foreground gói ứng dụng được phát hiện sau 3 giây chậm trễ trong marshmallow.Bởi gỡ lỗi, queryUsageStats trả về thông tin gói nhanh chóng và sau đó queryEvents lấy 3 giây để có được gói chính xác trong nền trước. – WonderSoftwares

3

Trong android 6.0 os, getUsageChức năng cung cấp kích thước danh sách 0. Để xác nhận, bạn có thể kiểm tra bất kỳ ứng dụng khóa nào từ cửa hàng Play. Những ứng dụng đó không hoạt động trên Android 6.0.

+0

Tôi kiểm tra xem nó có hoạt động không ở một số thiết bị như micro max. Vì vậy, bạn có thể mô tả những gì là có nghĩa là nhận được báo động sai? –

+0

getUsageStats thực sự trả về các ứng dụng được sử dụng cuối cùng, nhưng cũng trả về, trên đầu danh sách, ứng dụng cuối cùng được vẽ trên thanh trạng thái, ngay cả khi không mở nó. Đó là lý do tại sao tôi nói báo động giả, bởi vì nó nói rằng ứng dụng phía trước đã thay đổi, trong khi nó vẫn giữ nguyên. – fcdimitr

+0

bạn đã kiểm tra thời gian sử dụng lần cuối của các ứng dụng đang ở trên đầu. Bởi vì tôi thấy trong marshmallow, api này luôn luôn cung cấp cho một số danh sách ứng dụng trên đầu trang với thời gian qua sử dụng không. Vì vậy, bỏ qua các ứng dụng đó với thời gian sử dụng cuối cùng bằng không và kiểm tra với các giá trị thời gian không bằng không. Từ danh sách được sử dụng lần cuối không khác, bạn sẽ nhận được ứng dụng của mình. Hãy cho tôi biết, Nó đã giải quyết được vấn đề của bạn? –

Các vấn đề liên quan