2012-06-30 37 views
11

Tôi gặp vấn đề tương tự như bài đăng này: Battery broadcast receiver doesn't work. Nhưng có vẻ như không ai trả lời câu hỏi đó.Tôi không thể nhận được thông báo về thay đổi trạng thái pin?

Đây là BroadcastReceiver tôi:

public class BatteryLevelReceiver extends BroadcastReceiver{ 


    @Override 
    public void onReceive(Context context, Intent intent) { 
    Log.v("plugg", "plug change fired"); 
    Toast.makeText(context, " plug change fired", Toast.LENGTH_LONG).show(); 
     } 

Và đây là AndroidManifest.xml của tôi:

<receiver android:name=".ReceversAndServices.BatteryLevelReceiver"> 
       <intent-filter android:priority="900"> 
       <action android:name="android.intent.action.BATTERY_LOW" /> 

       </intent-filter> 
      </receiver> 

      <receiver android:name=".ReceversAndServices.BatteryLevelReceiver"> 
       <intent-filter android:priority="900"> 
       <action android:name="android.intent.action.BATTERY_CHANGED" /> 
       </intent-filter> 
      </receiver> 

Tôi cũng đã thêm dòng này để manifest:

<uses-permission android:name="android.permission.BATTERY_STATS"/> 

Nhưng vẫn không thành công!

Tôi thực sự đánh giá cao nếu ai đó có thể tư vấn cho tôi những gì tôi đang làm sai.

Trả lời

19

Từ the documentation for ACTION_BATTERY_CHANGED:

Bạn không thể nhận này thông qua các thành phần khai báo trong biểu hiện, chỉ bằng cách đăng ký một cách rõ ràng cho nó với Context.registerReceiver(). Xem ACTION_BATTERY_LOW, ACTION_BATTERY_OKAY, ACTION_POWER_CONNECTED và ACTION_POWER_DISCONNECTED cho các chương trình phát sóng liên quan đến pin riêng biệt được gửi và có thể nhận được thông qua bộ nhận tệp kê khai.

Có bạn có: bạn phải đăng ký một cách rõ ràng từ mã Java của bạn.

+0

cảm ơn Darshan, nhưng tôi chỉ muốn chạy một dịch vụ khi pin yếu hoặc được cắm vào. Bạn có thể nói tôi nên làm thế nào? –

+2

Nếu đó là hai sự kiện duy nhất bạn quan tâm, thì bạn không cần 'ACTION_BATTERY_CHANGED' nào cả, và bạn sẽ được đăng ký tốt cho chúng trong tệp kê khai. Chương trình phát để được cắm vào là 'ACTION_POWER_CONNECTED'. Cả hai hành động có thể dưới cùng một 'intent-filter', bạn không cần thiết lập mức độ ưu tiên, và bạn không cần quyền' BATTERY_STATS'. –

2

Tôi vừa làm theo Hướng dẫn dành cho nhà phát triển Android trên Monitoring the Battery Level and Charging State và đã thành công ngay lập tức. Nếu BatteryLevelReceiver là lớp riêng của nó sau đó tôi muốn giới thiệu:

<receiver android:name=".BatteryLevelReceiver"> 
    <intent-filter android:priority="900"> 
     <action android:name="android.intent.action.BATTERY_LOW" /> 
     <action android:name="android.intent.action.BATTERY_CHANGED" /> 
    </intent-filter> 
</receiver> 

Addition

tôi sẵn sàng đoán rằng bạn đã viết BatteryLevelReceiver như là một lớp lồng nhau trong ReceversAndServices. Theo Receiver as inner class in Android, bạn không thể làm điều đó với các lớp không tĩnh. Bạn có thể làm cho BatteryLevelReceiver một lớp tĩnh và đăng ký người nhận trong onResume(), nhưng sau đó ứng dụng của bạn sẽ cần phải chạy để bắt các sự kiện ... Di chuyển người nhận của bạn đến một lớp riêng biệt và đăng ký những Intents:

<receiver android:name=".BatteryLevelReceiver"> 
    <intent-filter android:priority="900"> 
     <action android:name="android.intent.action.BATTERY_LOW" /> 
     <action android:name="android.intent.action.BATTERY_OKAY" /> 
     <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
     <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> 
    </intent-filter> 
</receiver> 

(không BATTERY_CHANGED như Darshan Computing chỉ ra.)

+3

Bạn đã thành công ngay lập tức nhận được 'BATTERY_LOW', nhưng bạn sẽ không bao giờ nhận' BATTERY_CHANGED' theo cách đó. –

+0

Cảm ơn Sam, nhưng ngay sau khi tôi thêm tĩnh vào nó, tôi nhận được lỗi: ( –

+0

@Kevin_Dingo Có, tôi đã đoán những gì bạn đang cố gắng làm. Tôi nhận ra sai lầm của tôi và đã viết một bản cập nhật. nhận được lỗi, vui lòng thêm chi tiết hơn vào câu hỏi của bạn và lỗi logcat – Sam

Các vấn đề liên quan