2009-11-26 30 views
27

Android SDKからバッテリー情報を取得する方法はありますか?バッテリーの残量などのような?私はドキュメントを通してそれを見つけることができません。SDKのAndroidバッテリー

答えて

23

ACENT_BATTERY_CHANGED:http://developer.android.com/reference/android/content/Intent.html#ACTION_BATTERY_CHANGEDのブロードキャストを受信するインテントレシーバを登録できます。ドキュメントは、放送がスティッキーであると言います。そのため、バッテリーの状態が変化した後でも、それをつかむことができます。

+2

あなたは、このためのいくつかのサンプルコードを投稿することができます。私は放送の意図をどのように受け取るのか分からない。 –

67

ここでは、使用されるバッテリーの量、バッテリー電圧、およびその温度を得る簡単な例を示します。

が活動に次のコードを貼り付け:私の携帯電話に

@Override 
public void onCreate() { 
    BroadcastReceiver batteryReceiver = new BroadcastReceiver() { 
     int scale = -1; 
     int level = -1; 
     int voltage = -1; 
     int temp = -1; 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
      scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
      temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1); 
      voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1); 
      Log.e("BatteryManager", "level is "+level+"/"+scale+", temp is "+temp+", voltage is "+voltage); 
     } 
    }; 
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    registerReceiver(batteryReceiver, filter); 
} 

、これは次の出力ごとに10秒を持っています

ERROR/BatteryManager(795): level is 40/100 temp is 320, voltage is 3848

は、これはバッテリーが40%であることを意味します完全であり、摂氏32.0度の温度を有し、3.848ボルトの電圧を有する。

+4

これは素晴らしい例ですが、なぜそれを "エラー"レベルでログに記録しますか? – GetUsername

+1

@GetUsername個人的な好み以外のエラーレベルのログには特別な理由はありません。私のアプリを公開する前にこれを削除するようなロギングでは、エラーレベルでログしてlogcat出力のロギングを見やすくするのが好きです。 – plowman

0

バッテリーにモニターを取り付け、レベルと状態を確認する必要がありました。私はMonoForAndroidで開発しているので、ここで私が思いついたのです。私は誰かが同様の要件を持っている場合に備えてここに置いています。 (私はこれを試してうまく動作する)。

try 
{ 
    var ifilter = new IntentFilter(Intent.ActionBatteryChanged); 
    Intent batteryStatusIntent = Application.Context.RegisterReceiver(null, ifilter); 
    var batteryChangedArgs = new AndroidBatteryStateEventArgs(batteryStatusIntent); 
    _Battery.Level = batteryChangedArgs.Level; 
    _Battery.Status = batteryChangedArgs.BatteryStatus; 
} 
catch (Exception exception) 
{ 
    ExceptionHandler.HandleException(exception, "BatteryState.Update"); 
    throw new BatteryUpdateException(); 
} 

namespace Leopard.Mobile.Hal.Battery 
{ 
    public class AndroidBatteryStateEventArgs : EventArgs 
    { 
     public AndroidBatteryStateEventArgs(Intent intent) 
     { 
     Level = intent.GetIntExtra(BatteryManager.ExtraLevel, 0); 
     Scale = intent.GetIntExtra(BatteryManager.ExtraScale, -1); 
     var status = intent.GetIntExtra(BatteryManager.ExtraStatus, -1); 
     BatteryStatus = GetBatteryStatus(status); 
    } 

    public int Level { get; set; } 
    public int Scale { get; set; } 
    public BatteryStatus BatteryStatus { get; set; } 

    private BatteryStatus GetBatteryStatus(int status) 
    { 
     var result = BatteryStatus.Unknown; 
     if (Enum.IsDefined(typeof(BatteryStatus), status)) 
     { 
      result = (BatteryStatus)status; 
     } 
     return result; 
    } 
} 
} 


#region Internals 
public class AndroidBattery 
{ 
    public AndroidBattery(int level, BatteryStatus status) 
    { 
     Level = level; 
     Status = status; 
    } 

    public int Level { get; set; } 
    public BatteryStatus Status { get; set; } 
} 

public class BatteryUpdateException : Exception 
{ 
} 
#endregion 
2
public static String batteryLevel(Context context) 
    { 
     Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
     int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 
     int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100); 
     int percent = (level*100)/scale; 
     return String.valueOf(percent) + "%"; 
    } 
関連する問題