2017-01-02 37 views
1

私は、Bluetoothヘッドセットメディアボタンイベントを受信するためにMediaButtonアクションフィルタを使用しています。アクションフィルタはアンドロイドロリポップとそれ以下のバージョンで動作していましたが、アンドロイドM以上では動作していませんでした。Bluetoothヘッドセット(PTT)デバイスからKeyEvent Stopを取得できません

これらのデバイスでは、KeyEvent.KEYCODE_MEDIA_PLAY:が機能しています。

実行されたアクションのリスト。 1. PTT(プッシュツートーク)ボタン をクリック - イベントKeyEvent.KEYCODE_MEDIA_PLAY: 2.リリースPTTボタン とonReceive(Context context, Intent intent)に入ったコールバックが - イベントKeyEvent.KEYCODE_MEDIA_STOP:onReceive(Context context, Intent intent)にコールバックを取得する必要があります - しかし、唯一、上述のデバイスでこのイベントを受信しませんでした。

私は以下で使用したコードについて述べました。

マニフェスト

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.pttsample"> 

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <receiver android:name=".MediaButtonReceiver"> 
     <intent-filter android:priority="1000000"> 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 

     </intent-filter> 
    </receiver> 
</application> 

レシーバ

public class MediaButtonReceiver extends BroadcastReceiver{ 

@Override 
public void onReceive(Context context, Intent intent) { 

    String action = intent.getAction(); 

    if (action.equalsIgnoreCase(Intent.ACTION_MEDIA_BUTTON)) 
    { 

     KeyEvent event = (KeyEvent) intent 
       .getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
     if (event == null) 
      return; 

     if (event.getKeyCode() != KeyEvent.KEYCODE_HEADSETHOOK 
       && event.getKeyCode() != KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE 
       && event.getAction() != KeyEvent.ACTION_DOWN) { 
      return; 
     } 

     Intent i = null; 

       Log.e("MEDIA CONTROLLER","Power Button Play app destroy"); 
     switch (event.getKeyCode()) 
     { 
      case KeyEvent.KEYCODE_HEADSETHOOK: 
       Log.e("MEDIA CONTROLLER","Power Button Play KEYCODE_HEADSETHOOK"); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 
       Log.e("MEDIA CONTROLLER","Power Button Play MEDIA_PLAY_PAUSE"); 
       switch (event.getAction()) 
       { 
        case KeyEvent.ACTION_DOWN: 
         if (event.getRepeatCount() > 0) 
          break; 

         break; 
        case KeyEvent.ACTION_UP: 
         // long click 
         Log.e("MEDIA CONTROLLER","Power Button Play Action Up"); 
         break; 
        case KeyEvent.ACTION_MULTIPLE: 
         Log.e("MEDIA", "Action Multiple"); 
         break; 
       } 
       break; 
      //The following is the received from PTT device button 
      case KeyEvent.KEYCODE_MEDIA_PLAY: 
       Log.e("MEDIA CONTROLLER>>>","Button Play"); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_PAUSE: 
       Log.e("MEDIA CONTROLLER","Power Button Pause"); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK: 
       Log.e("MEDIA CONTROLLER","audio track"); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_CLOSE: 
       Log.e("MEDIA CONTROLLER","close"); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_EJECT: 
       Log.e("MEDIA CONTROLLER","eject"); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: 
       Log.e("MEDIA CONTROLLER","fast forward"); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_NEXT: 
       Log.e("MEDIA CONTROLLER","next"); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 
       Log.e("MEDIA CONTROLLER","previous"); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_RECORD: 
       Log.e("MEDIA CONTROLLER","record"); 
       break; 

      case KeyEvent.KEYCODE_MEDIA_REWIND: 
       Log.e("MEDIA CONTROLLER","rewind"); 
       break; 

      case KeyEvent.KEYCODE_MEDIA_STOP: 
       Log.e("MEDIA CONTROLLER","stop"); 
       break; 
     } 

     if (isOrderedBroadcast()) 
      abortBroadcast(); 
     if (i != null) 
      context.sendBroadcast(i); 
    } 


} 

MainActivity

既に以下を追加して試しました。

mMediaControlClientReceiverComponent = new ComponentName(
      getPackageName(), MediaButtonReceiver.class.getName()); 
    mMediaStopReceiverComponent = new ComponentName(
      getPackageName(), MediaButtonReceiver.class.getName()); 

    audioManager = (AudioManager) this.getSystemService(AUDIO_SERVICE); 
    audioManagerStopOption = (AudioManager) this.getSystemService(AUDIO_SERVICE); 

    audioManager.registerMediaButtonEventReceiver(mMediaControlClientReceiverComponent); 
    audioManagerStopOption.registerMediaButtonEventReceiver(mMediaStopReceiverComponent); 
+0

解決策はまだ見つかりませんでした。ここに投稿してください。 – ADM

答えて

0

私は同じ問題を抱えています。 これはAndroidワイドなのかどうかわかりませんが、開発に使用しているSamsung S6で起こっています。

まず、MediaSessionがなくても、UIがアクティブな場合(画面上に表示されている場合)、これも起こっています。 UIがアクティブになると、メディアキーがアクティビティに送信されます。

ここで問題を解決しました。

あなたも、オーディオフォーカスを設定whithout、あなたはマイクPTTを押してトリガMEDIA_PLAYを受け取ることになります、この時点で

audioManager = (AudioManager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE);  
audioManager.setMode(AudioManager.MODE_NORMAL); 

をMODE_NORMALするAudiomanagerを設定する必要があります。 あなたはKeyDownイベントでこれをキャプチャすることができ、あなたの活動に

@Override 
public boolean(int keyCode KeyEvent event){ 
    if (keyCode == 126) startPlay(); 
    return true; 
} 

を引き起こした後、あなたが例えばMediaPlayerのクラスで何かを再生を開始することができます。 実際にMEDIA_STOPや他のキーがアプリケーションに送信されるものを実際に再生しているときだけです。

しかし、あなたは何らかの種類のWalky Talkyアプリを作成していると思います。そしてあなたはRTPをストリーミングします。私自身AudioTrackクラスでこれを行います。また、play()でオーディオトラックを開始すると、他のメディアキーも使用可能になります。

おそらくPTT MICのマイクを使用したいので、Bluetooth scoを使用して接続する必要があります。これは、AudioManagerでも行います。このようなもの

audio.setBluetoothScoOn(true); 
    audio.stopBluetoothSco(); 

ただし、これは上記のすべてを破り、MEDIA_PLAYのみが受信されます。 今まで私は1つの解決策しか見つけておらず、それはBluetoothソケットを使用することです。以下は私が使用するクラスです。これは、6バイトコードは、6バイト目は、プレス80とリリースのための82である場合には、送信され、特にを押すと、PTTボタンを放しDellking PTTマイク

package on4akh.be.remotehamming; 

import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 

import java.io.IOException; 
import java.io.InputStream; 
import java.util.Set; 
import java.util.UUID; 

public class BluetoothPtt { 
    private byte[] mmBuffer = new byte[1024]; 
    private InputStream in; 
    private BluetoothSocket socket; 
    private boolean isRunning = true; 
    private OnMessageReceived pttState = null; 

    public BluetoothPtt(OnMessageReceived listener){ 
     pttState = listener; 
     Set<BluetoothDevice> bs = BluetoothAdapter.getDefaultAdapter().getBondedDevices(); 
     for (BluetoothDevice device : bs){ 
      if (device.getName().equalsIgnoreCase("DellKing PTT Mic")){ 
       try{ 
        socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); 
        start(); 
       } 
       catch (IOException e){ 
        return; 
       } 
      } 
      return; 
     } 
    } 

    private void start(){ 
     new Thread(){ 
      @Override 
      public void run(){ 
       try { 
        socket.connect(); 
        in = socket.getInputStream(); 
       } 
       catch (IOException e){ 
        socket = null; 
        return; 
       } 

       while (isRunning){ 
        try { 
         if (socket.isConnected()){ 
          in.read(mmBuffer); 
          if (mmBuffer[5] == 80){ 
           pttState.isPressed(true); 
          } 
          else 
           { 
            pttState.isPressed(false); 
           } 
         } 
        } catch (IOException e) { 

        } 
       } 
      } 
     }.start(); 
    } 

    public void release(){ 
     isRunning = false; 
     try { 
      socket.close(); 
     } 
     catch (IOException e){ 

     } 
     socket = null; 
    } 

    public interface OnMessageReceived { 
     public void isPressed(boolean state); 
    } 
} 

たびのためです。 クラスは、私は自分のアプリケーションうまくいけば、あなたが私の答えを使用することができます

BluetoothPtt ptt = new BluetoothPtt(new BluetoothPtt.OnMessageReceived(){ 
      @Override 
      public void isPressed(boolean state){ 
       togglePtt(); 
      } 
     }); 

でPTTを切り替えるために使用onMessagedReceivedリスナーを持っています。

関連する問題