2012-04-25 27 views
5

Tôi đang cố gắng lấy danh sách các ứng dụng đang chạy và lượng pin được sử dụng bởi mỗi ứng dụng. Tôi có google trong một thời gian dài nhưng đã không đưa ra một giải pháp. Tuy nhiên đã có một vài tham chiếu về các lớp bên trong PowerProfile, PowerUsageSummary.Sử dụng lớp BatteryStatsImpl bên trong qua Reflection trong android

tôi đã sử dụng chúng thông qua kỹ thuật Reflection nhưng didnt có được những gì tôi đang tìm kiếm. PowerUsageSummary cho thấy các chi tiết tương tự như bạn có thể xem bằng cách vào Device Settings-> Applications-> Battery Use (Đây là cách nó có thể được nhìn thấy trong một thiết bị Samsund).

Sau đó, tôi đã sử dụng lớp PowerProfile nhưng tôi chỉ nhận được mA hiện tại được sử dụng bởi WIFI, AUDIO, VIDEO, GPS, BLUETOOTH vv (Giá trị mA không thay đổi thường xuyên. Tôi không chắc liệu giá trị có chính xác hay không). Một tham chiếu khác là lớp BatteryStatsImpl. Tôi đã kiểm tra lớp này nhưng giá trị luôn là 0. Tuy nhiên tôi đang tìm kiếm danh sách các ứng dụng đang chạy và lượng pin được sử dụng bởi mỗi ứng dụng. Bất kỳ trợ giúp được đánh giá cao.

Cảm ơn,

Đây là mã mẫu mà tôi đã thử cho lớp BatteryStatsImpl.

 String BATTERY_PROFILE_CLASS = "com.android.internal.os.BatteryStatsImpl"; 
     Object mBatteryProfile = Class.forName(BATTERY_PROFILE_CLASS).getConstructor().newInstance(); 
     Method batteryMeth = Class.forName(BATTERY_PROFILE_CLASS).getMethod("getBatteryUptime", long.class); 
     Object arglist1[] = new Object[1]; 
     arglist1[0] = System.currentTimeMillis(); 
     // This is to calculate the batteryUpTime since the current time. 
     Long batteryUptime = (Long) batteryMeth.invoke(mBatteryProfile, arglist1); 

     Method dischargeMeth = Class.forName(BATTERY_PROFILE_CLASS).getMethod("getDischargeStartLevel"); 
     // This is to calculate the dischargeTime of the device battery 
     Integer dischargeTime = (Integer) dischargeMeth.invoke(mBatteryProfile); 
+1

Hi, bạn đã tìm thấy những gì bạn đã được tìm kiếm? Nếu bạn đã làm, bạn có thể xin vui lòng gửi phát hiện của bạn? – Drimmka

Trả lời

7

Đầu tiên xin lưu ý rằng bạn có thể không sử dụng API này trừ khi bạn được cài đặt trên hình ảnh hệ thống và do đó có thể giữ quyền BATTERY_STATS. Tính năng này không khả dụng cho các ứng dụng phần ba được cài đặt riêng biệt với hệ thống.

Để sử dụng, bạn không trực tiếp nhanh chóng BatteryStatsImpl. Bạn yêu cầu một thể hiện của nó từ các số liệu thống kê hiện tại được thu thập bởi BatteryStatsService. Bạn có thể tìm kiếm mã nguồn của ứng dụng cài đặt cho làm thế nào để làm điều này: https://code.google.com/p/android-source-browsing/source/browse/src/com/android/settings/fuelgauge/PowerUsageSummary.java?repo=platform--packages--apps--settings

Đặc biệt:

import android.os.BatteryStats; 

import com.android.internal.app.IBatteryStats; 
import com.android.internal.os.BatteryStatsImpl; 

IBatteryStats mBatteryInfo; 
UserManager mUm; 
BatteryStatsImpl mStats; 

mBatteryInfo = IBatteryStats.Stub.asInterface(
     ServiceManager.getService("batteryinfo")); 

private void load() { 
    try { 
     byte[] data = mBatteryInfo.getStatistics(); 
     Parcel parcel = Parcel.obtain(); 
     parcel.unmarshall(data, 0, data.length); 
     parcel.setDataPosition(0); 
     mStats = com.android.internal.os.BatteryStatsImpl.CREATOR 
       .createFromParcel(parcel); 
     mStats.distributeWorkLocked(BatteryStats.STATS_SINCE_CHARGED); 
    } catch (RemoteException e) { 
     Log.e(TAG, "RemoteException:", e); 
    } 
} 
+0

UserManager mUm; không cần thiết cho đoạn mã này –

0

BatteryStatsService duy trì số liệu thống kê. Có một cái nhìn ở đó như thế nào BatteryStatsImpl được sử dụng để làm điều đó (những note*() phương pháp được gọi bằng hệ thống khi ví dụ như màn hình bật)

Có lẽ bạn có thể lấy số liệu thống kê hiện tại từ đó

+0

Nhưng hàm tạo cho lớp này như sau. Làm thế nào tôi có thể đạt được một thể hiện của lớp này. Tên tệp ở đây là gì. Bất kỳ ý tưởng ... BatteryStatsService (String filename) { mStats = new BatteryStatsImpl (filename); } – Vansi

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