2012-04-25 13 views
5

Próbuję uzyskać listę uruchomionych aplikacji i ilość baterii używanej przez każdego z nich. Mam google przez długi czas, ale nie wymyśliłem rozwiązania. Jednak pojawiło się kilka odniesień do klas wewnętrznych PowerProfile, PowerUsageSummary.Używanie klasy wewnętrznej BatteryStatsImpl przez odbicie w Androidzie

Użyłem ich przez technikę Refleksji, ale nie dostałem tego, czego szukałem. PowerUsageSummary pokazuje te same szczegóły, co możesz zobaczyć przechodząc do Device Settings-> Applications-> Battery Use (tak można to zobaczyć w urządzeniu Samsund).

Następnie użyłem klasy PowerProfile, ale mam tylko mA prądu wykorzystywanego przez WIFI, AUDIO, VIDEO, GPS, BLUETOOTH itp. (Wartości mA nie zmieniają się tak często.) Nie jestem pewien, czy wartości są prawidłowe). Kolejnym odniesieniem była klasa BatteryStatsImpl. Testowałem tę klasę, ale wartości zawsze wynoszą 0. Nadal szukam listy uruchomionych aplikacji i ilości baterii używanych przez każdego z nich. Każda pomoc jest doceniana.

Dzięki,

Oto przykładowy kod, który próbowałem dla klasy 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

Cześć, nie znajdziesz to, czego szukałeś? Jeśli tak, czy mógłbyś opublikować swoje wyniki? – Drimmka

Odpowiedz

7

pierwsze należy pamiętać, że można Korzystaj z tego interfejsu API, chyba że zainstalowano go na obrazie systemu, dzięki czemu można zachować uprawnienie BATTERY_STATS. Nie jest to dostępne dla aplikacji trzeciej części zainstalowanych oddzielnie od systemu.

Aby tego użyć, nie tworzy się bezpośrednio instancji BatteryStatsImpl. Żądasz wystąpienia tego z bieżących statystyk zbieranych przez BatteryStatsService. Możesz zajrzeć do kodu źródłowego aplikacji ustawień dla jak to zrobić: https://code.google.com/p/android-source-browsing/source/browse/src/com/android/settings/fuelgauge/PowerUsageSummary.java?repo=platform--packages--apps--settings

w szczególności:

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; nie jest potrzebny do tego fragmentu –

0

BatteryStatsService utrzymuje statystyki. Spojrzeć tam jak BatteryStatsImpl stosowany jest do zrobienia, że ​​(te note*() metody są wywoływane przez system, gdy np ekran włącza)

Może masz aktualnych statystyk stamtąd

+0

Ale konstruktor dla tej klasy jest następujący. Jak mogę osiągnąć instancję tej klasy. Jaka jest nazwa pliku tutaj. Wszelkie pomysły ... BatteryStatsService (nazwa pliku String) { mStats = new BatteryStatsImpl (nazwa pliku); } – Vansi

Powiązane problemy