2013-03-01 4 views
20

ためTWICE解雇でもは二回は(当然の一時停止ボタンのシングルクリック、のために):KeyEvent.ACTION_UPは私が実際にアンドロイド2.xとアンドロイド4.1の両方のために働くACTION_MEDIA_BUTTONため、この放送受信機を持っていますが、いくつかの奇妙な理由で、<strong>のAndroid 2.xの(のみ)</strong>に、私はそれぞれの取得ACTION_MEDIA_BUTTON

03-01 18:27:05.264: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142304436 <> 0 (1) 
03-01 18:27:05.434: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142304436 <> 142304436 (1) 

03-01 18:27:14.054: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142313265 <> 142304436 (1) 
03-01 18:27:14.074: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142313265 <> 142313265 (1) 

03-01 18:27:24.254: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142323464 <> 142313265 (1) 
03-01 18:27:24.264: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142323464 <> 142323464 (1) 

03-01 18:27:37.574: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142336795 <> 142323464 (1) 
03-01 18:27:37.614: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142336795 <> 142336795 (1) 

03-01 18:27:45.214: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142344433 <> 142336795 (1) 
03-01 18:27:45.284: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142344433 <> 142344433 (1) 

03-01 18:27:52.474: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142351687 <> 142344433 (1) 
03-01 18:27:52.504: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142351687 <> 142351687 (1) 

public class RemoteControlReceiver extends BroadcastReceiver { 
    private static long prevEventTime = 0; 

    @Override 
    public void onReceive(Context ctx, Intent intent) { 
    if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { 
     KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
     long curEventTime = event.getEventTime(); 
     if (event != null && (event.getAction() == KeyEvent.ACTION_UP) /*&& (curEventTime != prevEventTime)*/) { 
     int keycode = event.getKeyCode(); 
     switch (keycode) 
     { 
      case KeyEvent.KEYCODE_MEDIA_NEXT: 
      Log.i(TAG, "KEYCODE_MEDIA_NEXT"); 
      break; 
      case KeyEvent.KEYCODE_HEADSETHOOK: 
      Log.i(TAG, "KEYCODE_HEADSETHOOK" + " " + curEventTime + " <> " + prevEventTime + " (" + event.getAction() + ")"); 
      prevEventTime = curEventTime; 
      break; 
      case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 
      Log.i(TAG, "KEYCODE_MEDIA_PREVIOUS"); 
      break; 
      default: 
     } 
     }  
    } 
    } 

} 

が謎を理解しようとすると、私は、そのような各出現のためのイベントの時間を記録します

この場合も、このダブルオカレンスはAndroid 4.1では発生しません。 Android 2.xでのみ発生します。

任意のアイデアなぜですか?

(私は、同じ出来事時間のロギング技術を使って2番目の出来事をフィルターにかけることができますが、私は何が起こっているのかを最初に理解しています(私の側にプログラミングミスがありますか?( "どのように正確にあなたがあなたの受信機を登録する")アプリのマニフェストで

まず:

以下の質問に答えること)


this tipあたり)、OnCreateイベントで()私のライブラリの活動のその後

、:

mRemoteControlReceiver = new ComponentName(this, RemoteControlReceiver.class); 
mAudioManager.registerMediaButtonEventReceiver(mRemoteControlReceiver); 

私は、これがこの謎を解決することができ、より完全な画像を提供したいと考えています。

+0

どのように受信機を正確に登録しますか? – clover

+0

今、私は賞品のテキストを編集できません(哀れです)。 「私はライブラリを使用していません」とは、同じリスナーを登録するアプリケーション以上のことがないということです。 – matteo

答えて

8

このレシーバーはライブラリ(マニフェストの「mylib」部分)で使用しています。

これは確かにケースであり、あなたが同じ登録コードを共有する2つのアプリケーションによって登録されている受信機を持っている場合は、これらのイベント二回が表示されます。

3つのアプリケーションは、その受信機を登録しておけば、あなたは三倍にこれらのイベント...

は、各アプリケーションが異なる(ユニーク) <receiver android:name使用していることを確認してくださいを受け取ることになります。

+0

もう一度あなたは目標に向かいました(無意識のうちに:) :) – an00b

+0

私の場合ではなく、私は問題を守っています。私はマニフェストで定義されたフィルターしか持っていません。これはAndroid 2.xでのみ発生します。これは明らかにバグです。自分のレシーバがインスタンス化され、2回起動された(UPの2回とDOWNの2回)ことを確認したので、これは1つしか登録されませんでした(PackageManager.queryBroadcastReceivers経由でチェックされます)。それは唯一のものですか? – matteo

0

初めてのことを確実にするために、フラグを使用して最初のアクションであることを伝えることができます。

boolean firstAction= false; 
if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { 
    firstAction= !firstAction; 
    if(!firstAction) 
    { 
     return true; 
    } 

    KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
    long curEventTime = event.getEventTime(); 
    if (event != null && (event.getAction() == KeyEvent.ACTION_UP) /*&& (curEventTime != prevEventTime)*/) { 
     int keycode = event.getKeyCode(); 
     switch (keycode) 
     { 
      case KeyEvent.KEYCODE_MEDIA_NEXT: 
      Log.i(TAG, "KEYCODE_MEDIA_NEXT"); 
      break; 
      case KeyEvent.KEYCODE_HEADSETHOOK: 
      Log.i(TAG, "KEYCODE_HEADSETHOOK" + " " + curEventTime + " <> " + prevEventTime + " (" + event.getAction() + ")"); 
      prevEventTime = curEventTime; 
      break; 
      case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 
      Log.i(TAG, "KEYCODE_MEDIA_PREVIOUS"); 
      break; 
      default: 
     } 
    }  
} 
+0

私の元のコードでコメントアウトされた '/ * &&(curEventTime!= prevEventTime)* /'に注意してください:これはすでに上記の問題を回避しています。私が尋ねていたのは**なぜ**これが起こっているのか、問題を回避する方法ではありません。助けてくれてありがとう。 :) – an00b

6

私は、この問題を横断して、壁に頭をぶつけて、ボタンを押すたびにKeyEvent.ACTION_DOWNとKeyEvent.ACTION_UPの2つのイベントが生成されることに気付きました。だから、二つの試験がメディアボタンを使用するために必要な:誰にも同じ過ちの結果として、ここで自分自身を発見した場合

if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {} 

if (event.getAction() == KeyEvent.ACTION_DOWN) {} 

ので、おそらくこの回答は役立ちます。

+1

これは私のために解決しました。今明らかになっているようですが、それ以前に考えていなかったです。ありがとう – SteveEdson

+0

これは魔法でした。問題ありがとう! –

関連する問題

 関連する問題