2013-01-08 23 views
6

Mục đích của tôi là đã lưu trong Tùy chọn trạng thái hiện tại của cáp USB/nguồn thiết bị Android: đã kết nối/ngắt kết nối. Từ trang web dành cho nhà phát triển, tôi thấy rằng có hai Mục đích để có được trạng thái đó: ACTION_POWER_CONNECTED/DISCONNECTED. Vì vậy, tôi đã sử dụng cùng một mã như được xuất bản tại Nhà phát triển:Lấy cáp USB cắm vào/ra sự kiện bằng cách sử dụng EXTRA_PLUGGED không hoạt động

http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

trong phần Monitor Những thay đổi trong Sạc Nhà nước.

Manifest

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

mã Java

public class PowerConnectionReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
     boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; 
     boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; 

     Toast.makeText(context, "pvr = " + usbCharge + ", " + acCharge + "," + isCharging, Toast.LENGTH_SHORT).show(); 
    } 
} 

Khi tôi cắm cáp USB IN/OUT hơn phát sóng luôn được gửi một cách chính xác và bị bắt trong PowerConnectionReceiver nhưng luôn luôn với kết quả tương tự (= cáp được cắm ra).

Tôi đã thử nghiệm nó với Galaxy Nexus 4.1.1/4.2.1 - Tôi luôn nhận được 2xFALSE trong Bánh mì nướng (chargePlug = FALSE, usbCharge = FALSE).

Tại sao intent.getIntExtra (BatteryManager.EXTRA_PLUGGED, -1) luôn trả về giá trị mặc định "-1"?

Cảm ơn bạn.

ps. mọi thứ hoạt động tốt nếu tôi đăng ký bộ nhận trong Java

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

... trong Dịch vụ hoặc trong hoạt động. Nhưng theo trang web của Nhà phát triển Android, điều này không phải là điều kiện tiên quyết để tạo mã ở trên để trả lại giá trị chính xác;

+0

Tôi tự hỏi liệu điều này có liên quan gì đến những vấn đề này không? [This] (http://code.google.com/p/android/issues/detail?id=25701) & [This] (http://code.google.com/p/android/issues/detail?can = 2 & bắt đầu = 0 & num = 100 & q = & colspec = ID% 20Type% 20Status% 20Owner% 20Summary% 20Stars & groupby = & sort = & id = 25703) – TronicZomB

Trả lời

8

Tôi đã xử lý cùng một sự cố, gặp phải bài đăng của bạn. Tôi nghĩ rằng vấn đề là mã, trong trang đào tạo Android mà bạn cung cấp một liên kết, là sai.

ACTION_POWER_CONNECTED và ACTION_POWER_DISCONNECTED không "mang" dữ liệu mà bạn đang truy vấn từ ý định trong mã của bạn. Tôi không thể có được những thứ tương tự để làm việc trên thiết bị của mình hoặc (thế hệ thứ nhất Nexus 7 chạy Android 4.3 và Nexus One chạy Android 2.3.6) và, bởi vì dường như nó không hoạt động ở bất cứ đâu, tôi đến "mã xấu" phần kết luận.

Tôi đã sửa nó bằng mã sau. Nó thực sự rất gần với những gì bạn đã cung cấp như là một sửa chữa, ngoại trừ việc nó đi vào BroadcastReceiver của tôi trực tiếp và không vào một hoạt động. Trong mã của bạn ở trên, đoạn mã ở đây sẽ chạy ngay trước dòng bắt đầu "int chargePlug". Sau đó, thay đổi "intent" trong cùng dòng đó (dòng của bạn), bắt đầu "int chargePlug", thành "mIntent".

final Intent mIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

Lưu ý rằng BroadcastReceiver của bạn giờ đây sẽ có hai ý định. Một được chuyển cho nó, đó sẽ là ý định chứa hành động ACTION_POWER_CONNECTED (hoặc ACTION_POWER_DISCONNECTED) và mục đích khác được tạo trong BroadcastReceiver để trích xuất thông tin pin.

Đoạn mã mà tôi đã cung cấp sẽ không hoạt động nếu bạn đặt nó vào một hoạt động (nó sẽ không kết nối với BroadcastReceiver của bạn) do null trong danh sách tham số. Bạn không thực sự đăng ký một BroadcastReceiver với null đó.Thay đổi null thành BroadcastReceiver của bạn sẽ không lý tưởng vì thông báo ACTION_BATTERY_CHANGED có thể kích hoạt A LOT. Tôi khá tự tin rằng ACTION_BATTERY_CHANGED không được dùng để kích hoạt cho BroadcastReceiver. Thay vào đó, tôi nghĩ rằng nó có nghĩa là để được sử dụng trong thời gian thực để có được phát sóng "dính" cuối cùng với thông tin về một sự thay đổi trong thông tin pin (tìm kiếm "phát sóng dính" trong tài liệu Android).

Cũng lưu ý rằng đoạn mã tôi đã đưa vào bao gồm "getApplicationContext()" trong chuỗi cuộc gọi. Lấy nó ra và các thiết bị Gingerbread sẽ sụp đổ (nhờ CommonsWare).

2

Tôi không chắc chắn lý do tại sao bạn đang gặp vấn đề nhưng những gì làm việc đối với tôi là đăng ký cho những hành động ACTION_POWER_CONNECTED và ACTION_POWER_DISCONNECTED:

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

Và thực hiện thu phát sóng như thế này:

public class PowerReceiver extends BroadcastReceiver { 

    @Override public void onReceive(Context context, Intent intent) { 
     if(intent.getAction() == Intent.ACTION_POWER_CONNECTED) { 
      //Handle power connected 
     } else if(intent.getAction() == Intent.ACTION_POWER_DISCONNECTED){ 
      //Handle power disconnected 
     } 
    } 
} 
1
public class PowerConnectionReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final Intent mIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

     int status = mIntent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
     boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; 


     int chargePlug = mIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
     boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; 
     boolean acCharge = chargePlug == BATTERY_PLUGGED_AC; 

    } 
}