私のアプリには ACTION_POWER_CONNECTED
で、画面にフラグを付けて、画面にとどまるようにします。
私が欠けているのは、アプリが最初に実行されたときに充電状態を確認する機能です。誰かが充電状況を手動で確認するコードで私を助けてもらえますか?
CommonsWareのおかげで、私が書いたコードがここにあります。
public class Power {
public static boolean isConnected(Context context) {
Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS;
}
}
if (Power.isConnected(context)) {
...
}
またはKotlinバージョン
object Power {
fun isConnected(context: Context): Boolean {
val intent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
val plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1)
return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS
}
}
http://developer.Android.com/training/monitoring-device-state/battery-monitoring.html
public static boolean isPlugged(Context context) {
boolean isPlugged= false;
Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
isPlugged = plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB;
if (VERSION.SDK_INT > VERSION_CODES.JELLY_BEAN) {
isPlugged = isPlugged || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS;
}
return isPlugged;
}
ワイヤレス充電をサポートするマイナーアップデート。
registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED))
を呼び出します。これは、Intent
で定義されたエクストラを持つBatteryManager
を返し、プラグインされているかどうかを知らせます。
これは、Intent.ACTION_BATTERY_CHANGED
はスティッキーブロードキャストです。
Android M +ではgetSystemService(BATTERY_SERVICE)
を介してBatteryManager
サービスを使用できます。pre-Mを実行しているデバイスでは、他の人が述べたようにスティッキーブロードキャストを使用できます。 :
public static boolean isCharging(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
BatteryManager batteryManager = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE);
return batteryManager.isCharging();
} else {
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent intent = context.registerReceiver(null, filter);
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
if (status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL) {
return true;
}
}
return false;
}
あなたの答えは Androidリファレンス にあります!
コードの例を次に示します。
// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
簡単な方法は、インテントフィルターを使用することです ACTION_BATTERY_CHANGED
public void checkBatteryState(View sender) {
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = registerReceiver(null, filter);
int chargeState = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
String strState;
switch (chargeState) {
case BatteryManager.BATTERY_STATUS_CHARGING:
case BatteryManager.BATTERY_STATUS_FULL:
strState = "charging";
break;
default:
strState = "not charging";
}
TextView tv = (TextView) findViewById(R.id.textView);
tv.setText(strState);
}
これを試して:
public class PowerConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
if (batteryStatus != null) {
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float) scale;
}
}//end onReceive
}//end PowerConnectionReceiver
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if(action.equalsIgnoreCase(ACTION_POWER_CONNECTED))
{
if(chargerConnected != null )
{
chargerConnected.setText("Cable Connected");
}
if(chargerImage != null )
{
chargerImage.setImageDrawable(getResources().getDrawable(R.drawable.usb));
}
}else if(action.equalsIgnoreCase(ACTION_POWER_DISCONNECTED))
{
if(chargerConnected != null )
{
chargerConnected.setText("NOT CHARGE");
}
if(chargerImage != null )
{
chargerImage.setImageDrawable(getResources().getDrawable(R.drawable.battery_icon));
}
try {
Toast.makeText(context, "Power Cable Disconnected", Toast.LENGTH_SHORT).show();
}catch (Exception e){e.printStackTrace();}
}
}
};
これはスティッキーなインテントであり、BroadcastReceiverを登録する必要はありません。次のスニペットに示すように、nullを渡すregisterReceiverをレシーバーとして呼び出すだけで、現在のバッテリーステータスインテントが返されます。ここで実際のBroadcastReceiverオブジェクトを渡すこともできますが、後のセクションで更新を処理するため、必要ありません。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
現在の充電状態と、デバイスが充電されている場合、USBまたはAC充電器のどちらで充電しているかの両方を抽出できます。
// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
BatteryManagerは、デバイスが電源に接続または切断されるたびにアクションをブロードキャストします。アプリが実行されていないときでもこれらのイベントを受信することは重要です。特に、これらのイベントはバックグラウンド更新を開始するためにアプリを起動する頻度に影響するため、マニフェストにBroadcastReceiverを登録して両方のイベントをリッスンする必要がありますインテントフィルター内でACTION_POWER_CONNECTEDおよびACTION_POWER_DISCONNECTEDを定義する。
<receiver Android:name=".PowerConnectionReceiver">
<intent-filter>
<action Android:name="Android.intent.action.ACTION_POWER_CONNECTED"/>
<action Android:name="Android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
関連するBroadcastReceiver実装内で、前のステップで説明したように、現在の充電状態と方法を抽出できます。
public class PowerConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
}
}