1

問題:

ACポートではなく、PCと判断された電源に電話を接続したときにコードを実行するアプリを作成しようとしています。また、このアプリに、ユーザーが同じコードを「強制的に」開始できるGUIインターフェイスを持たせたいと思います。

これまでに2つのクラスがあります。1つはメインアクティビティで、もう1つは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コンポーネントはインテントを受信するために登録できません*

レシーバーをレシーバー内に登録しようとしているので、なぜエラーが発生するのかは理解できますが、これを正しく行う方法を誰かに教えてもらえますか?

4

1 に答える 1

4

それ以外の:

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

使用する:

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

これは厄介です-これregisterReceiver()よりも賢いはずです-しかし、これはこの特定の場合の回避策です。

于 2012-06-29T19:57:01.167 に答える