问题:
我正在尝试编写一个应用程序,该应用程序在将手机插入确定为PC(而不是AC端口)的电源时执行一些代码。我还希望该应用具有gui界面,用户可以“强制”启动相同的代码。
到目前为止,我有2个类:一个是主要活动,另一个是扩展BroadcastReceiver的类。
代码如下:
MainActivity.java
public class MainActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public void func1(View view){ //stuff }
public void func2(View view){ //stuff }
}
ChargingOnReceiver.java
public class ChargingOnReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
CharSequence text = "Plug status = " + isUSBConnected(context);
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
public static boolean isUSBConnected(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_USB;
}
}
AndroidManifest.xml
<receiver android:name=".ChargingOnReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
</intent-filter>
</receiver>
附带问题:
第一个简短的问题是:如何从ChargingOnReceiver中调用MainActivity中的方法(例如func1或fucn2)?例如,我的isUSBConnected()函数曾经位于MainActivity中,但是我找不到从ChargingOnReceiver调用它的方法,因此我将其移至ChargingOnReceiver。
主要问题:
代码错误出在:
*致命异常:main :: java.lang.RuntimeException:无法启动接收器com.example.ChargingOnReceiver:android.content.ReceiverCallNotAllowedException:IntentReceiver组件不允许注册以接收意图
*
我正在尝试在接收器中注册接收器时,我有点理解为什么会出错,但是有人可以指出我如何正确执行此操作的方向吗?
最佳答案
代替:
context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
采用:
context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
这很烦人-
registerReceiver()
应该比这更聪明-但这是此特定情况的解决方法。