2016-11-24 45 views
3

在我的應用程序中,我想檢查手機是否由套接字或USB充電。爲此,我創建了一個BroadcastReceiver用下面的代碼:ACTION_POWER_CONNECTED不是由意圖發送

清單:

<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_POWER_CONNECTEDACTION_POWER_DISCONNECTED。但這些廣播不包括有關充電狀態的信息。

爲了接收關於充電狀態的信息,您需要註冊ACTION_BATTERY_CHANGED廣播。來自開發人員文檔:

BatteryManager以包含充電狀態的粘性Intent廣播所有電池和充電詳情。

所以,你可以嘗試在onReceive下面的代碼片段:

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); 

你可以閱讀更多關於這個here

+0

哇這個作品謝謝你!我認爲這不是最好的解決方案,因爲我對'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; 

至於建議由@MarkB你必須明確地從Java代碼註冊ACTION_BATTERY_CHANGED refer

+0

感謝您的回答,但我很抱歉。這也不起作用 – Cilenco

+0

你得到什麼值布爾isCharging? – Nas

+0

它也總是返回'false'。 – Cilenco

1

@MarkB做法是正確的,它在開發者文檔同一個建議。我想指出,您不需要註冊任何BroadcastReceiver,因爲這是Sticky Intent

基本上所有你需要做的是調用registerReceiver在空傳遞作爲接收器,當然還有動作(Intent.ACTION_BATTERY_CHANGED):

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; 

(這些片段不是我,但是從文檔

請注意,這樣做沒有任何問題,因爲文檔也顯示它。現在

,又回到了代碼你實際上listeting爲ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED,這是用來監測充電狀態的變化,可能是處理電池可以使用量是有用的。