Helpex - Trao đổi & giúp đỡ Đăng nhập
55

Lý lịch

Google đã ngừng sử dụng chức năng " getRecentTasks" của lớp "ActivityManager". Bây giờ tất cả những gì nó làm là lấy danh sách các ứng dụng mà ứng dụng hiện tại đã mở.

Tôi thậm chí đã viết một bài về nó ở đây trên StackOverflow , nhưng tôi nhận thấy điều đó là không thể.

Vấn đề

Tôi đã thực hiện một bài đăng về nó ( ở đây và một bài khác, tương tự do người khác tạo, tại đây ) và yêu cầu xem xét lại nó, và Google đã quyết định tạo một lớp mới, dường như cung cấp một chức năng tương tự (giống như thống kê, nhưng cũng có thể hữu ích), nhưng tôi không thể tìm ra cách sử dụng nó.

Lớp được gọi là " UsageStatsManager" và tôi đoán là hàm " queryUsageStats" thực hiện công việc.

Ngoài ra, có vẻ như nó có một quyền mới (" android.permission.PACKAGE_USAGE_STATS"), là một quyền hệ thống , nhưng nó được viết rằng:

tuyên bố quyền ngụ ý ý định sử dụng API và người dùng thiết bị có thể cấp quyền thông qua ứng dụng Cài đặt.

Đây là một liên kết khác về chức năng mới này.

Những gì tôi đã tìm thấy

Tôi đã xem mã của Android và nhận thấy rằng "Context" có USAGE_STATS_SERVICE, mà trong JavaDocs nói điều tiếp theo:

/**
 * Use with {@link #getSystemService} to retrieve a {@link
 * android.app.UsageStatsManager} for interacting with the status bar.
 *
 * @see #getSystemService
 * @see android.app.UsageStatsManager
 * @hide
 */
public static final String USAGE_STATS_SERVICE = "usagestats";

Điều kỳ lạ là không chỉ nó nói " status bar", mà cả packageName cũng không khớp ( android.app.usage.UsageStatsManagerthay vào đó phải là " ").

Tôi cũng đã thêm quyền chính xác:

<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />

và đây là mã tôi sử dụng:

  final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService("usagestats");// Context.USAGE_STATS_SERVICE);
  final int currentYear=Calendar.getInstance().get(Calendar.YEAR);
  final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear);

Trong chính trình giả lập, tôi đã truy cập " Settings"->"security"->"apps with usage access" và bật ứng dụng của mình.

Tuy nhiên, khi chạy mã, tất cả những gì tôi nhận được là một danh sách trống ...

Câu hỏi

Bạn sử dụng UsageStatsManagernhư thế nào?

Ngoài ra, làm cách nào để bạn cho phép người dùng cấp quyền theo cách dễ dàng nhất có thể? Hay nó được thực hiện tự động ngay sau khi ứng dụng cố gắng lấy thông tin cần thiết?

Điều gì xảy ra khi cố gắng sử dụng lớp này mà người dùng vẫn chưa xác nhận?

Làm cách nào để tạo mã trả về danh sách ứng dụng thực cho tôi?

55 hữu ích 5 bình luận 57k xem chia sẻ
31

Tôi nghĩ rằng tài liệu này chỉ là một thứ ngắn gọn cho những thứ về Lịch. Tôi không nghĩ rằng nó thực sự hoạt động chỉ với năm 2014; tuy nhiên tôi có thể sai.

Để truy cập vào danh sách Thực tế các Thống kê Sử dụng, bạn sẽ cần tạo một đối tượng Lịch với tháng, ngày và năm chính xác. Chính xác là MRK đã nói như thế nào trong câu trả lời còn lại. Tôi đã sao chép và sửa lỗi trong mã của MRK để bất cứ ai gặp nó trong tương lai có thể xem nó.

Calendar beginCal = Calendar.getInstance();
beginCal.set(Calendar.DATE, 1);
beginCal.set(Calendar.MONTH, 0);
beginCal.set(Calendar.YEAR, 2012);

Calendar endCal = Calendar.getInstance();
endCal.set(Calendar.DATE, 1);
endCal.set(Calendar.MONTH, 0);
endCal.set(Calendar.YEAR, 2014);

final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginCal.getTimeInMillis(), endCal.getTimeInMillis());

- Tín dụng MRK; do tôi sửa (anh ấy vô tình chỉ đặt cal thay vì beginCal và endCal)

Dưới đây là mã cho cài đặt truy cập sử dụng. :)

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);
31 hữu ích 5 bình luận chia sẻ
27

Tôi đã tạo một mẫu về cách sử dụng UsageStats trên Github của mình. Hy vọng rằng nó có thể giúp ích cho ai đó

https://github.com/ColeMurray/UsageStatsSample

27 hữu ích 3 bình luận chia sẻ
9

Trả lời câu hỏi cuối cùng của bạn "Làm cách nào để tạo mã trả về danh sách ứng dụng thực cho tôi?". queryUsageStats lấy thời gian bắt đầu và thời gian kết thúc tính bằng mili giây, không phải giá trị của năm tính bằng int.

Calendar beginCal = Calendar.getInstance();
beginCal.set(Calendar.DATE, 1);
beginCal.set(Calendar.MONTH, 0);
beginCal.set(Calendar.YEAR, 2012);

Calendar endCal = Calendar.getInstance();
endCal.set(Calendar.DATE, 1);
endCal.set(Calendar.MONTH, 0);
endCal.set(Calendar.YEAR, 2014);

final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginCal.getTimeInMillis(), endCal.getTimeInMillis());

Điều này sẽ trả về danh sách các Trạng thái sử dụng cho năm 2012 và 2013 (lưu ý rằng thời gian kết thúc không bao gồm phạm vi thời gian kết quả cuối cùng).

9 hữu ích 3 bình luận chia sẻ
7

Sử dụng UsageStats sẽ nhận được thông tin sai khi người dùng mở ngăn thông báo hoặc trên màn hình bị khóa. Bạn phải sử dụng UsageStatsManager.queryEvents () và tìm kiếm sự kiện mới nhất với loại sự kiện MOVE_TO_FOREGROUND.

7 hữu ích 2 bình luận chia sẻ
6

Thực tế có một ứng dụng mẫu được bao gồm trong mã mẫu AOSP :developers/samples/android/system/AppUsageStatistics/

Nó bao gồm tất cả các bit cần thiết để sử dụng UsageStatstrong một ứng dụng:

  1. Khai báo quyền trong AndroidManifest.xml

    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>

  2. Hiển thị cài đặt để cấp quyền truy cập UsageStatsManager

    startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));

  3. Truy vấn UsageStatsManagerthống kê.

    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.YEAR, -1);
    List<UsageStats> queryUsageStats = mUsageStatsManager
            .queryUsageStats(intervalType, cal.getTimeInMillis(),
                    System.currentTimeMillis());
    
  4. Tạo danh sách các ứng dụng dựa trên UsageStats

Để tóm tắt và áp dụng cho ví dụ của bạn:

  • Có vẻ như bạn đã yêu cầu và cấp quyền truy cập số liệu thống kê sử dụng một cách chính xác.
  • Bạn nhận được UsageStatsdịch vụ hệ thống một cách chính xác .
  • Tuy nhiên, khoảng thời gian bạn truy vấn quá ngắn: Đối số beginTimeendTimeđược đo bằng mili giây kể từ kỷ nguyên. Calendarcác trường hợp có thể cung cấp cho bạn giá trị này với getTimeinMillis(). Những gì bạn làm sai là chỉ cung cấp số năm ( 20152017nếu bạn sẽ chạy chương trình hôm nay). Các giá trị này được hiểu là mili giây kể từ kỷ nguyên và do đó khoảng thời gian chỉ dài 2 mili giây và là khoảng thời gian vào năm 1970.

Thay vì đoạn mã sau mà bạn đã đăng, bạn nên sao chép ví dụ tôi đã đăng bên dưới:

Sai lầm:

final int currentYear=Calendar.getInstance().get(Calendar.YEAR);
final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear);

Chính xác:

final long currentTime = System.currentTimeMillis(); // Get current time in milliseconds

final Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -2); // Set year to beginning of desired period.
final long beginTime = cal.getTimeInMillis(); // Get begin time in milliseconds

final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginTime, currentTime);
6 hữu ích 5 bình luận chia sẻ
1

Nếu bạn muốn xem thống kê sử dụng của một khoảng thời gian cụ thể, trước tiên bạn phải tính khoảng thời gian tính bằng mili giây của khoảng thời gian bắt đầu và kết thúc của bạn kể từ kỷ nguyên đó. (epoch là số giây đã trôi qua kể từ 00:00:00 UTC, Thứ Năm ngày 1 năm 1970.) Hoặc, như tôi sẽ trình bày trong đoạn mã mẫu sau, một cách dễ dàng là tính ngược lại từ thời điểm hiện tại theo mili giây.

Ví dụ: nếu bạn muốn thống kê sử dụng trong 4 ngày qua, bạn có thể sử dụng mã sau:

UsageStatsManager mUsageStatsManager = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE);    
List<UsageStats> queryUsageStats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,
                    (System.currentTimeMillis() - 345600000), System.currentTimeMillis());

Con số 345600000 là số mili giây trong 4 ngày.

Và đối với INTERVAL_TYPE bài viết này giải thích nó tốt.

Hệ thống thu thập và tổng hợp dữ liệu trong 4 khoảng thời gian khác nhau và chúng là: INTERVAL_DAILY, INTERVAL_WEEKLY, INTERVAL_MONTHLY và INTERVAL_YEARLY. Các bản ghi hệ thống có giới hạn về thời gian, vì vậy bạn sẽ có thể truy xuất dữ liệu sử dụng ứng dụng trong tối đa 7 ngày cho khoảng thời gian hàng ngày, tối đa 4 tuần cho khoảng thời gian hàng tuần, lên đến 6 tháng cho hàng tháng và cuối cùng lên đến 2 năm cho hàng năm .

Có một tùy chọn thứ năm cần đề cập: INTERVAL_BEST sẽ chọn khoảng thời gian phù hợp nhất giữa bốn tùy chọn ở trên dựa trên khoảng thời gian bạn đã chọn.

1 hữu ích 5 bình luận chia sẻ
0

bạn có thể làm như thế này

//noinspection ResourceType
final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService("usagestats");// Context.USAGE_STATS_SERVICE);
final int currentYear=Calendar.getInstance().get(Calendar.YEAR);
final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear);
0 hữu ích 5 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ android usage statistics activity-manager android-recents usagestatsmanager , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading