希望应用程序在插入手机并确定源是电脑(不是交流插头)时执行一些代码



问题:

我正在尝试编写一个应用程序,当手机插入确定为 PC 而不是交流端口的电源时,该应用程序会执行一些代码。我还希望这个应用程序有一个 gui 界面,用户可以"强制"启动相同的代码。

到目前为止,我有 2 个类:一个是主要活动,另一个是扩展 BroadcastReceiver 的类。

代码如下:

主要活动.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        }
}

正在为接收器充电.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;
    }
}

安卓清单.xml

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

附带问题:

所以一个快速的第一个问题:如何从 ChargeOnReceiver 调用 MainActivity 中的方法(例如 func1 或 fucn2)?例如,我的 isUSBConnected() 函数曾经在 MainActivity 中,但我找不到从 ChargeOnReceiver 调用它的方法,所以我把它移到了 ChargeOnReceiver。

主要问题:

代码错误如下:*致命异常:main:: java.lang.RuntimeException: 无法启动接收器 com.example.ChargeOnReceiver: android.content.ReceiverCallNotAllowed异常: 不允许 IntentReceiver 组件注册以接收 Intent*

有点理解为什么它会出错,因为我正在尝试在接收器中注册接收器,但是有人可以指出我如何正确执行此操作的方向吗?

而不是:

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

用:

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

这很烦人 - registerReceiver()应该比这更聪明 - 但这是这种特殊情况的解决方法。

最新更新