11

問題の説明

アプリケーションが起動しているときに、音量アップ/ダウンと Bluetooth ヘッドセット ボタンの押下をキャッチするアプリケーションを作成しようとしています。

  • バックグラウンド
  • 前景
  • 背景と電話がスリープ モードになっている (電源ボタンが押されている)
  • フォアグラウンドで電話がスリープ モードになっている (電源ボタンが押されている)

最初の 2 つの点については、いくつかのテスト アプリケーションを作成しました。私の場合はすべてが機能します。アプリケーションをバックグラウンドに送信し、ボリュームを上下に押すと、アプリケーションがこのイベントをキャッチします。電源ボタンを押した後、電話がスリープモードになります。次に、音量を上げる/下げるボタンを押しても、電話はそのイベントに反応しません。すべてが機能しなくなったように、logcat にログが表示されません。

スリープ モードでのキー押下を検出するアプリケーション。

この問題は解決できないと思いますが、音楽の再生中に音量の上下ボタンを押すと、Android 標準の Media Player がこのイベントをキャッチすることを覚えています。このアプリはシステムアプリなのでそれができると思いますが、Winpmプレーヤーをダウンロードすると同じように動きます。Winapm は、電話がスリープ モードのときに音量アップ/ダウン イベントをキャッチします。音楽プレーヤー アプリケーションはそれを行います。

質問

これを行う方法を理解したいですか?ボリュームアップ/ダウンボタンの押下をキャッチする簡単なアプリケーションを作成する方法. その時に音楽を演奏する必要がありますか、それともできますか? つまり、Winamp やその他のアプリケーションがそのイベントをキャッチする主な理由は、その時点で音楽が再生されていることです。それとも、この問題は解決できないのでしょうか?解決できない場合は、その理由を知りたいですか? なぜ解決できないのか、いくつかの議論が必要です。

ソースコード

私はいくつかのアプリケーションをテストしました。結果は次のとおりです。バックグラウンドとフォアグラウンド、およびアプリケーションがスリープモードのときに、ボリュームの上下キーの押下をキャッチする簡単なアプリケーションを作成しました。アプリケーションがバックグラウンドとフォアグラウンドの場合、すべてが完璧に機能し、私のテストアプリケーションはイベントをキャッチしますが、電源ボタンを押すと停止し、メディアプレーヤーで開始を押すと、電源ボタンを押した後に音楽の再生が開始されますもう一度音量を上げてから下げると、アプリケーションの統計が音量の上下のキープレスをキャッチします。音楽が再生されると、アプリケーションはそのイベントをキャッチできるので、次の質問は、携帯電話が音楽を再生するようにシミュレートする方法です。これは解決策でしょうか?

マニフェスト.xml

<receiver android:name="com.vito.backgroundworker.VolumeBroadcast" android:enabled="true">
    <intent-filter>
    <action android:name="android.media.VOLUME_CHANGED_ACTION" />
    </intent-filter>
</receiver>
        
<receiver android:name="RemoteControlReceiver">
    <intent-filter>
    <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

MainActivity.java

public class MainActivity extends Activity {
    private PowerManager.WakeLock wl;
    //private BroadcastReceiver vol = new VolumeBroadcast();
    private AudioManager mAudioManager;
    private ComponentName mRemoteControlResponder;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen");
        
        mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
        mRemoteControlResponder = new ComponentName(getPackageName(),
                RemoteControlReceiver.class.getName());
    }

    @Override
    protected void onPause() {
        super.onPause();
        mAudioManager.registerMediaButtonEventReceiver(
                mRemoteControlResponder);
        wl.release();
    }//End of onPause

    @Override
    protected void onResume() {
        super.onResume();
        wl.acquire();
    }//End of onResume
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        mAudioManager.unregisterMediaButtonEventReceiver(
                mRemoteControlResponder);
    }
}
4

3 に答える 3

3

registerMediaButtonEventReceiver()を見てください。これらのイベントを受信できるようにするには、アプリをこれらのイベントの受信者として登録する必要があります。

参照する必要があるその他のリンクを次に示します。

于 2012-11-13T08:33:42.260 に答える
1

私の経験では、フォアグラウンド サービスであっても、デバイスがスリープ状態の場合、アプリはメディア ボタン ブロードキャストを受信できません (メディア ボタンはアプリを起動しません)。部分的な wake lock を保持すると、スリープが防止されるため、ボタンの押下が検出されます。あなたの音楽再生アプリがウェイクロックを保持していると思われます。それが機能する理由です。私は間違っていることを証明したいと思いますが、ウェイクロックは必要ありません...

于 2013-03-27T23:44:45.010 に答える
0

音量ボタンを押すことで電話を実際にスリープ状態から復帰させるオープンソースのアプリを見つけました。 https://github.com/praslnx8/volume_Screen_Lock

このアプリは Service を使用してメディアを再生します。

メディアの再生中、電話画面がロックされていても、音量ボタンのアクションは常にそれぞれのレシーバーに送信されます...

于 2016-02-03T05:01:00.757 に答える