2017-02-23 6 views
1

Я разрабатываю своеобразное легкое приложение в Android Studio, и я хочу иметь код, который обнаруживает, когда нажата кнопка наушников (так что затем вызывает и действие) ,Обнаружение при нажатии кнопки наушников

Я искал в Интернете и искал везде, и все написанные мной сценарии не сработали.

Либо из-за проблем с версиями Android, либо из-за того, что код просто «краснеет» и по причинам, которые я не знаю, он просто не работает. Я действительно отчаянный и нуждающийся в этом коде. Поэтому я был бы так благодарен, если кто-то сможет поделиться им.

Например, вот код, который я использовал:

public static class MediaButtonIntentReceiver extends BroadcastReceiver { 
    // int E=0; 

    public MediaButtonIntentReceiver() { 
     super(); 
    } 


    @Override 
    public void onReceive(Context context, Intent intent) { 
     String intentAction = intent.getAction(); 
     if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { //Si la acción capturada en intentaction no equivale a una puñsación de boton entonces sale de el método debido al return 
      MainActivity.E= 7; 
      return; 
     } 
     KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); //extra key se refiere a el de los auriculares 
     if (event == null) {   //Si event es null, return. Event equivale a extrakeyevent. osea que si no hay extrakey event, return 
      MainActivity.E= 7; return; 
     } 
     int action = event.getAction(); 
     if (action == KeyEvent.ACTION_DOWN) { //Lo que hará cuando sea pulsado 

      MainActivity.E= MainActivity.E+1; 


      // do something 




     } 
     abortBroadcast(); 
    } 


} 

следующее в манифесте:

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

Дело в том, что, когда я запустить приложение, и я нажимаю медиа-кнопка в наушниках, ничего не происходит с MediaPlayer для Android (как это обычно бывает), и это указывает на то, что на самом деле приложение имеет приоритет для этих кнопок над медиаплеер Android. Однако в приложении ничего не происходит ни с прессами (когда это должно произойти что-то). Мне тоже нужно добавить, что, когда пресса длинна, открывается открытое приложение Google. Тем не менее, меня не интересуют длинные прессы.

Кроме того, я должен отметить, что, откуда я почерпнул это, там было больше кода помимо уже видели, например, были такие вещи, как:

//AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     //ComponentName mReceiverComponent = new ComponentName(this, MediaButtonIntentReceiver.class); 

    //mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent); 

    // mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent); 

(эти линии были отброшены мной) Во всяком случае этот код не работал, потому что Android-студия говорит, что они устарели.

Я также нашел:

// BroadcastReceiver MediaButtonIntentReceiver = новый MediaButtonIntentReceiver(); // MediaButtonIntentReceiver mMediaButtonReceiver = new MediaButtonIntentReceiver(); // IntentFilter mediaFilter = новый IntentFilter (Intent.ACTION_MEDIA_BUTTON); //mediaFilter.setPriority (1000000000); // registerReceiver (mMediaButtonReceiver, mediaFilter);

Я положил его в onCreate of MainActivity. И не получилось.

Я нашел последний код в другом вопросе этого форума. Коды не работают, так как некоторые части кода отображаются красным цветом (обратный вызов, возврат истины (и появляется «возврат внешнего метода») ...

MediaSession audioSession = новый MediaSession (getApplicationContext(), "ТЕГ"); audioSession.setCallback (новый MediaSession.Callback) {

//@Override 
    public static boolean onMediaButtonEvent(final Intent mediaButtonIntent) { 
     String intentAction = mediaButtonIntent.getAction(); 
     if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { 
      KeyEvent event = mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 

      if (event != null) { 

       stopTimeOfGame_millis = event.getDownTime(); 
       double usersReactionTime = (event.getDownTime() - startTimeOfGame_millis)/1000.0; 
       UtilsRG.info("event.getDownTime(): " + usersReactionTime); 


       double getEventTime = (event.getEventTime() - startTimeOfGame_millis)/1000.0; 
       UtilsRG.info("event.getEventTime(): " + getEventTime); 

       int action = event.getAction(); 
       if (action == KeyEvent.ACTION_DOWN) { 
        long action_down = android.os.SystemClock.uptimeMillis(); 
        double actionDown = (action_down - startTimeOfGame_millis)/1000.0; 
        UtilsRG.info("ACTION_DOWN: " + actionDown); 
       } 

       if (action == KeyEvent.ACTION_UP) { 
        long action_up = android.os.SystemClock.uptimeMillis(); 
        double actionUp = (action_up - startTimeOfGame_millis)/1000.0; 
        UtilsRG.info("ACTION_UP: " + actionUp); 
       } 
      } 
     } 
     return true; 
    } 


}; 

В этом, я также имел надстройку: уплотнительное

PlaybackState state = new PlaybackState.Builder() 
     .setActions(PlaybackState.ACTION_PLAY_PAUSE) 
     .setState(PlaybackState.STATE_PLAYING, 0, 0, 0) 
     .build(); 
audioSession.setPlaybackState(state); 

audioSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS); 

audioSession.setActive(true); 

Чтобы быть более конкретным: enter image description here

я получаю с ума это. Пожалуйста помоги. ха-ха. Спасибо всем заранее!

+1

Что вы пробовали до сих пор? Вы только пытаетесь прослушивать нажатия кнопок, когда ваша деятельность находится на переднем плане или когда ваше приложение также находится в фоновом режиме? – ianhanniballake

+0

Check: http://stackoverflow.com/questions/9056814/how-do-intercess-button-presses-on-the-headset-in-android – user2025187

+0

Спасибо, что ответили. Я уже пробовал коды, показанные там. Дело в том, что они не работают, потому что я все еще так новичок, и я не знаю, как справляться с некоторыми проблемами, возникающими при копировании этих кодов или из-за проблем с версиями Android. Поэтому в основном то, что мне кажется, что я должен сделать, - объявить новый класс, который простирается от Broadcastreceiver, затем установить его приоритет максимум в манифесте, а затем вызвать его из mainActivity .. не так ли? Как я могу назвать это из mainActivity? (да простите мое невежество) и что такое MediaSession, AudioManager ..? – BlueMath

ответ

0

Попробуйте

ACTION_MEDIA_BUTTON намерения.

или просто переопределить метод активности OnKeyDown:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_HEADSETHOOK){ 
     //handle click 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

Большое спасибо. Я все еще так новен. Итак, где я должен положить этот код? внутри mainActivity или в основном классе, или я создаю новый класс ?. Что я должен писать в манифесте, чтобы придать ему приоритет над музыкальным плейлистом андроида (и другими действиями, которые андроид автоматически выполняет при нажатии этих кнопок). Как мне вызвать этот метод из mainActivity ?. Извините мое невежество, и спасибо вам большое! – BlueMath

+0

всякий раз, когда действие обрабатывает ваше действие, этот метод будет использоваться. – Doc

0

Вы должны использовать MediaSession (MediaSessionCompat для поддержки уровня API < 21). Метод onKeyDown вызывается только в том случае, если отображается ваша активность и устройство разблокировано.

Короче говоря, вам нужно создать новый MediaSession

mediaSession = new MediaSession(getApplicationContext(), SESSION_TAG); 

установить callback на нем

mediaSession.setCallback(new Callback() { 
    // override just the methods you need 
}); 

Установить флаги на сессии:

mediaSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS); 

Установите на interceptable события и установите состояние playback. Установите все состояния, нужно перехватывать только для этих тех, которые вы будете получать события на обратном вызове:

PlaybackState state = new PlaybackState.Builder() 
    .setActions(PlaybackState.ACTION_PLAY|...) 
    .setState(PlaybackState.STATE_STOPPED, PlaybackState.PLAYBACK_POSITION_UNKNOWN, SystemClock.elapsedRealtime()) 
.build(); 
mediaSession.setPlaybackState(state); 

Активировать сессию:

mediaSession.setActive(true); 
+0

Большое спасибо за ответ! Это то, что я получаю сейчас: http://i63.tinypic.com/scf4va.png Я не понимаю, почему обратный вызов, «set ..!» И тег сеанса (который я не знаю, что это такое и что он для) появляются в чтении. – BlueMath

+0

Очень странно. Что ваш минимальный уровень SDK? – Massimo

+0

Он установлен в 21 minSdkVersion 21 targetSdkVersion 25 VersionCode 1 – BlueMath

Смежные вопросы