2012-05-10 8 views
7

BroadcastReceiverを使用してメディアボタン(ヘッドセットから「再生ボタン」)をキャプチャするサービスを作成しました。アンドロイド2.3.x(HTC Nexus OneまたはHTC Desire)Androidでのキャプチャボタン> = 4.0(2.3で動作する)

私はAndroid 4.0.3(Samsung Nexus S)で動作させようとしましたが、動作しませんでした。アプリケーションが意図的に "android.intent.action.MEDIA_BUTTON"と " 「再生」ボタンは通常どおり動作します:音楽を停止/開始します)。マニフェストの

内容:

... 
<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <receiver android:name=".buttonreceiver.MediaButtonIntentReceiver" > 
     <intent-filter android:priority="10000" > 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
    </receiver> 
... 

が、それはアンドロイド4.0.3


編集に取り組むようにする方法があります:私は、提案された解決策を試してみましたが、私はアクションと実行を追加しましたしかし、私の受信機はまだ意図を受けていません。さらに奇妙なコードでレシーバを登録すると動作しません:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.about_and_activation_view); 

    Log.d("MR", "onCreate - " + getIntent().getAction()); 

    mReceiver = new MediaButtonIntentReceiver(); 
    registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_MEDIA_BUTTON)); 
} 

今私は完全に混乱しています。

+0

注意また、その意図優先順位は、私は音声認識を実行し、他のいくつかのintetsを送るだけのサービスを持っている-1000より大きく、1000 – William

答えて

12

あなたのアプリにアクティビティがあり、そのボタンを押す前にこのアクティビティを実行していることを確認してください。それまでは、<receiver>will not receive any broadcastsです。アンドロイド4.0以降で


UPDATE

、あなたもイベントを受け取るためにregisterMediaButtonEventReceiver() on AudioManagerを呼び出す必要と思われます。その状態は、registerMediaButtonEventReceiver()に電話するか、unregisterMediaButtonEventReceiver()に電話するまで保留されます。例えば

、このような活動:

public class MediaButtonActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(
                             this, 
                             MediaButtonReceiver.class)); 
    } 
} 

はACTION_MEDIA_BUTTONイベントを取得するには、マニフェスト登録MediaButtonReceiverを可能にします。

+0

未満でなければなりません。これはAndroid 2.3.x上でうまく動作します。これは唯一可能な修正ですか?アクティビティを実行するにはアクティブな画面でインテントを受信する必要があり、これは私にとっては受け入れられません。 –

+0

@MarekR: "これは可能な修正ですか?" - はい、私はあなたが修正を理解していないと思う。アクティビティを実行中のままにする必要はありません。彼らはあなたのアプリケーションを一度手動で起動して、この停止状態からアプリを移動させるだけです。私の答えにリンク先のブログ記事を読んでください。 – CommonsWare

+0

これは動作しませんでした。つまり、アクティビティを追加して実行しても、それでも "android.intent.action"をキャプチャできません。 –

2

あなたのアプリをデフォルトにしたいが、ボタンを押すだけで何もする必要がない場合は、次の方法を使用することができます。

は、(「アプリケーション」ノードで)マニフェストファイルにこれを追加します。

<receiver android:name="BroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
</receiver> 

が主な活動でのonCreate()にこれを追加するか、どこでもアプリが実行されたときには呼ばれたいです。あまりにonResume()イベントに有用であり得る:

mAudioManager = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE); 
    mRemoteControlResponder = new ComponentName(getActivity().getPackageName(), BroadcastReceiver.class.getCanonicalName()); 

    mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder); 
関連する問題