2012-04-16 34 views
16

Android OSのバージョン4.0.3(ICS)用のAndroidアプリケーションを作成しています。問題は、BroadcastReceiverのonReceive()メソッドのLog.d()から出力が得られないことです。これは、アプリケーションがブロードキャストを適切に処理していないことを意味します。ACTION_MEDIA_BUTTONのBroadcastReceiverが動作しない

ACTION_MEDIA_BUTTONをクリックしたときにコードを実行する方法について、何度も質問をしました。私がコピーしたコードを貼り付けても、私の仕事がうまくいかなかったら、それが機能するかどうかを確認するだけです。

ACTION_MEDIA_BUTTON私は対処したいボタンをイヤホンで使用することで、ユーザーは電話をかけたり、終了したり、音楽を再生/一時停止することができます。 私のアプリケーションがこのボタンを操作するのではなく、クリックすると、Nexus S Androidのストック音楽プレーヤーが曲を再生し始めます

私は別のクラスに自分のコードを配置していません。なぜこれが機能しないのでしょうか?

ここでのonCreate()メソッド(私が書いたコードは動作しませんでした後、私はウェブサイトをオフにコピーし、この特定のコード)で見つかったコードです:

IntentFilter mediaButtonFilter = new IntentFilter(
      Intent.ACTION_MEDIA_BUTTON); 
    mediaButtonFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); 
    BroadcastReceiver brMediaButton = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      Log.d("Event", "Media button!"); 
      this.abortBroadcast(); 

      KeyEvent key = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
      if(key.getAction() == KeyEvent.ACTION_UP) { 
       int keycode = key.getKeyCode(); 
       if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT) { 
        Log.d("TestApp", "Next Pressed"); 
       } else if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) { 
        Log.d("TestApp", "Previous pressed"); 
       } else if(keycode == KeyEvent.KEYCODE_HEADSETHOOK) { 
        Log.d("TestApp", "Head Set Hook pressed"); 
       } 
      } 

     } 
    }; 
    registerReceiver(brMediaButton, mediaButtonFilter); 

は、私は本当にのためにテストする必要があるすべてがありますKEYCODE_HEADSETHOOKしかし、それはテストのための他のコードを持って傷ついていない、私はすべてを正しく動作させることができたらそれを修正します。私のマニフェストで

<intent-filter android:priority="2147483647" > 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
</intent-filter> 

私はもともと、私はすべてのエラーメッセージは表示されませんでしたが、私はこのためのパーミッションを指定していないので、これはアクセス許可の問題かもしれ思いました。

私が以前に言ったように、私はこれに多くのバリエーションを試しました。 1つの例は、CommonsWareの修正を伴うこのリンクbroadcastreceiver onReceive problem ACTION_MEDIA_BUTTON Androidのコードの使用でした。しかし、再び、私はそれを変更して、別のクラスにはなかった。

ご協力いただきありがとうございます。

+0

[こちら](http://stackoverflow.com/questions/3369554/how-to-handle-long-press-media-button-in-order-to (http://stackoverflow.com/questions/6603170/broadcastreceiver-onreceive-problem-action-media-button-android) これはあなたの問題を解決すると期待しています – silwar

+0

私はほとんどあなたと同じコードで、Android 2.2/2.3でもうまくいきます。しかし、あなたのように私はそれをICSで動作させることはできません... – user1026605

+0

同じです。 Android 4.0より前で動作します。 APIが変更されました。 – joepetrakovich

答えて

8

私は、Android 4.4.2でサムスンギャラクシーS5でこれをテストしました。だから何が重要であると何は他の記事で言及されていません。

  • アプリケーションタグ内ではなく外部のすべての活動タグからのAndroidManifest.xmlにレシーバを登録します。
  • あなたの受信機Broadcastreceiverは一つ
  • 公共および静的な活動である必要があり、ボタンを押す

よし、ここでいくつかのサンプルコードをリッスンするためにMediaButtonEventReceiverを登録する必要があります。

mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
mReceiverComponent = new ComponentName(this,YourBroadcastReceiver.class); 
... 
mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent); 
... 
// somewhere else 
mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent); 

ここではレシーバ

public static class YourBroadcastReceiver extends BroadcastReceiver{ 

    // Constructor is mandatory 
    public MediaBroadcastReceiver() 
    { 
     super(); 
    } 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String intentAction = intent.getAction(); 
     Log.i (TAG_MEDIA, intentAction.toString() + " happended"); 
     if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { 
      Log.i (TAG_MEDIA, "no media button information"); 
      return; 
     } 
     KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
     if (event == null) { 
      Log.i (TAG_MEDIA, "no keypress"); 
      return; 
     } 
     // other stuff you want to do 
    } 
} 

そしてここマニフェストスニペット。インテントフィルタの追加の優先順位を必要ですが、私のために必要とされていなかった場合は、次の参照の場合

<application> 
    <receiver android:name="OuterClass$YourBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
    </receiver> 
    <activity> ... </activity> 
</application> 

+0

私の活動がバックグラウンドでonReceive()コールを常に呼び出すが、ネクサスonReceive()はバックグラウンドで呼び出されなかった場合、Samsungデバイスで同じものを実装しようとしています。理由を説明できますか? –

4
mediaButtonReceiver = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName()); 

mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 

mAudioManager.registerMediaButtonEventReceiver(mediaButatonReceiver); 

このコードは、あなたが呼び出すまでの間だけのアプリ、アプリにあなたのヘッドフォン・ボタンをバインドします:

mAudioManager.unregisterMediaButtonEventReceiver(mediaButatonReceiver); 
+3

また、他のアプリが 'registerMediaButtonEventReceiver() '、私は方法だろう;) – cprcrack

+0

私は放送を登録することができます。私はReceiverをマニフェストファイルに登録しました –

関連する問題