2016-11-24 21 views
3

私のアプリケーションでは、電話機がソケットまたはUSBによって充電されているかどうかを確認したいと思います。ACTION_POWER_CONNECTEDがインテントで送信しない

マニフェスト:このために、私は次のコードでBroadcastReceiverを作成し

<receiver 
    android:name=".ChargingReceiver" 
    android:enabled="true" android:exported="false"> 

    <intent-filter> 
     <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> 
     <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> 
    </intent-filter> 
</receiver> 

ChargingReceiver私の問題がある

public void onReceive(Context context, Intent intent) { 
    int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 

    boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC); 
    boolean usbCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_USB); 

    //... 
} 

ChargingReceiverの最初の行は、常に-1を返すことこれは私が設定したデフォルト値です。私の電話を抜き差すと、BroadcastReceiverが正しく呼び出されます。そのため、私は、意図した内容にはExtraが含まれていません。私はhereのコードを持っているので、うまくいくはずです。

私はまたthis答えを見つけましたが、私はUSB充電とソケット充電を区別する必要があるため、私には役立ちません。私が間違って行ったことは何ですか?私はAndroid Nougatでコードをテストしました。

答えて

1

からACTION_BATTERY_CHANGEDを​​登録する必要があります@MarkBによって示唆してみてください...私はロリポップでそれが働いていると思いますが、私は完全にはわかりませんマニフェストにACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTEDを登録しました。しかし、これらの放送には、充電状態に関する情報は含まれていません。

充電状態に関する情報を受け取るには、ACTION_BATTERY_CHANGEDブロードキャストを登録する必要があります。開発者向けドキュメントから:

BatteryManager放送、すべてのバッテリーと充電状態が含まれ 粘着性の意向で詳細を充電します。

だからonReceiveに次のコードスニペット試すことができます:あなたはこのhere

+0

これはうまく動作します!私はそれが最良の解決策ではないと思います。なぜなら、私は 'Broadcast'に' Broadcast'に反応しますが、私はこのIntentをマニフェストで登録することができないので、これまでの唯一の解決策です。これを美化するアイデア?それとも私はちょっと些細なことですか? – Cilenco

+0

私はあなたの放送受信機でこれを行うことは、電源接続の状態が変わった場合にバッテリー状態情報を受信したいので、良い解決策になると思います – IIIIIIIIIIIIIIIIIIIIII

0

この

 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; 

としては、あなたが明示的にJavaコードrefer

+0

回答ありがとうございます。申し訳ありません。これも動作しません – Cilenco

+0

isChargingに対してどのような値を取得しますか? – Nas

+0

また、常に 'false'を返します。 – Cilenco

1

@MarkBのアプローチについての詳細を読むことができます

Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
boolean pluggedAC = (plugged == BatteryManager.BATTERY_PLUGGED_AC); 
boolean pluggedUSB = (plugged == BatteryManager.BATTERY_PLUGGED_USB); 

を正しい、それは開発者向けドキュメントで提案されているものと同じです。 BroadcastReceiverは登録する必要がないことを指摘したいと思います。Sticky Intentです。

基本的にすべてを行う必要がレシーバ、そしてもちろんのアクション(Intent.ACTION_BATTERY_CHANGED)にnullを渡しregisterReceiverを呼び出すことです:

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
Intent batteryStatus = context.registerReceiver(null, ifilter); 

そして、あなたはこのようにそれを行うことができます。

// 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_POWER_CONNECTEDACTION_POWER_DISCONNECTEDためlistetingされています。

関連する問題