2016-09-26 10 views
1

ヘッドセットボタンイベントを処理するための作業コードを作成するのが最善の方法です。私はAndroid developer guideを読んでいますが、明らかに間違っています。クラス名の登録を聞いて聴くように頼んでいるからです。Android:ヘッドセットボタンイベントを処理してMainActivityに情報を送信

am.registerMediaButtonEventReceiver(RemoteControlReceiver); // Wrong 

コードを修正するために他の例を確認します。例えば、多くの秘密の提案がthis questionで公開されている、私はまた、このようなthisなどの他のコードを試みたが、MediaSessionで別の解決策、そして、私はこのコードを書いた不要なのクリーニング:

私はクラスRemoteControlReceiverを実施しました。どうやら静的内部クラスの必要がない、実際には、this commentを参照してください。

public class RemoteControlReceiver extends BroadcastReceiver { 

     public RemoteControlReceiver() { 
      super(); 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Toast.makeText(context, "EVENT!!", Toast.LENGTH_SHORT).show(); 
      if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { 
       KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
       if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) { 
        Toast.makeText(context, "EVENT!!", Toast.LENGTH_SHORT).show(); 

       } 
      } 
     } 
    } 

その後、私はMainActivityのonCreate(内部の意図を登録){ ...

AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); 
    ComponentName mReceiverComponent = new ComponentName(this, RemoteControlReceiver.class); 
    am.registerMediaButtonEventReceiver(mReceiverComponent); 

registerMediaButtonEventReceiver途中で廃止されました...

アクティビティタグの後にマニフェストを記録します:

<activity> 
... 
</activity> 

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

注:静的内部クラスは、たとえば「.MainActivity $ RemoteControlReceiver」となります。

  • なぜregisterMediaButtonEventReceiverが廃止されました:

    私はここで

    compileSdkVersion 24 
    buildToolsVersion "24.0.0" 
    ... 
    minSdkVersion 21 
    targetSdkVersion 24 
    

    私の質問に取り組んでいますか?最近このパラダイムは間違っているようですが、これらの問題をAndroid Developer Portalで処理する方法に関する情報は見つかりませんでした。

  • MainActivityとどのように対話できますか?私の目的は、いくつかのヘッドセット操作が実行されたときにMainActivityでアクションを実行することです。
+0

マニフェストには 'MainActivity $ MediaButtonReceiver'がありますが、あなたのクラスは' RemoteControlReceiver'と呼ばれています。どちらですか? – ianhanniballake

+0

ニアンニーニングのための@ianhanniballakeありがとうございました。私はすべての実験中に多くの受信機を実装しました。今私はそれを訂正しました。 – donnadulcinea

答えて

1

API 21では、メディアアプリAPI全体が変更されました(現在はMediaSessionを中心に行われています)。 BroadcastReceiver(API18以前に必要だったもの)またはPendingIntentregisterMediaButtonEventReceiver(PendingIntent))を登録する代わりに、MediaSession.Callbackで直接コールバックを受け取ることができます。

あなたは以下のコードを経由してMediaSessionを設定することができます。

MediaSession.Callback callback = new MediaSession.Callback() { 
    @Override 
    public void onPlay() { 
    // Handle the play button 
    } 
}; 
MediaSession mediaSession = new MediaSession(context, 
    TAG); // Debugging tag, any string 
mediaSession.setFlags(
    MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | 
    MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS); 
mediaSession.setCallback(callback); 

// Set up what actions you support and the state of your player 
mediaSession.setState(
    new PlaybackState.Builder() 
    .setActions(PlaybackState.ACTION_PLAY | 
       PlaybackState.ACTION_PAUSE | 
       PlaybackState.ACTION_PLAY_PAUSE); 
    .setState(PlaybackState.STATE_PLAYING, 
     0, // playback position in milliseconds 
     1.0); // playback speed 

// Call this when you start playback after receiving audio focus 
mediaSession.setActive(true); 

あなただけのアクティビティが表示されている間、メディアボタンを処理したい場合、あなたは自分のMediaSessionは、活動自体によって扱われていることができます(これは希望Callbackをアクティビティの変数にすることができます)。

Best practices in media playback talk from I/O 2016は詳細とMedia playback and the Support Library blog postで説明するように、それはMediaSessionCompatを使用することに注意してくださいと他のサポートライブラリのクラスが、偉大なメディアアプリケーションを構築するために必要な他のAPIのすべてを通過します。

+0

それは@ianhanniballakeです。新しいベストプラクティスについての情報を探したかったのです。添付されたすべての参考文献も有用である。ありがとうございました! – donnadulcinea

関連する問題