2016-10-07 6 views
2

일부 안드로이드 장치에서 수화기로 오디오 파일을 재생할 때 문제가있는 것 같습니다. 예상되는 동작은 이어 피스에서 오디오 파일을 재생해야하지만 Samsung Galaxy note 2 (Android 버전 4.4.2) 및 Sony Xperia XA (Android 버전 6.0)와 같은 일부 장치에서는 스피커를 통해 오디오 파일을 재생할 것으로 예상됩니다.Android - 일부 장치가 이어 피스를 통해 오디오를 재생하지 않습니다.

그러나 Motorola moto g (android version 6.0) 및 nexus 5X (android version 7.0)와 같은 장치에서는 정상적으로 작동합니다.

앱에는 android.permission.MODIFY_AUDIO_SETTINGS 권한이 있습니다.

아래에서이 문제에 대해 자세히 알아보십시오.

오디오를 재생하기 전에 나는 다음과 같은 속성을 설정합니다

audioManager = (AudioManager)configService.getContext().getSystemService(Context.AUDIO_SERVICE); 
audioManager.setSpeakerphoneOn(isEnabled); 
player = new MediaPlayer(); 
player.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
player.setDataSource(path); 

나는 모드 MODE_IN_CALL을 설정하는 시도를하지만 그 중 하나가 작동하지 않았다 : 서로 audioManager.setMode(android.media.AudioManager.MODE_IN_CALL);

나는 또한 시도 솔루션을 비슷한 질문을하는 게시물이지만 많은 도움이되지 못했습니다.

이 문제가 기기에 특정한 지 여부와 동일한 문제를 해결하는 방법을 알고 있으면 도움이됩니다. 도움 주셔서 감사합니다.

답변

2

마지막으로 해결책을 찾았습니다. BroadcastReceiver에 ACTION_HEADSET_PLUG 인 텐트를 등록 할 때 이전 이벤트에서 저장 한 헤드셋 분리 이벤트에 대한 끈적한 의도가 방송되었습니다. 이것은 스피커를 통해서만 오디오를 재생하는 콜백을 발생 시켰습니다.

자세한 사항은 다음 스택 오버플로 게시물을 참조하십시오 : link

내가 과거 이벤트를 필터링 할 isInitialStickyBroadcast() 방법을 사용하는 문제를 해결하려면.

public void onReceive(Context context, Intent intent) { 
    switch (intent.getIntExtra("state", -1)) { 
     case 0: 
      if (!isInitialStickyBroadcast()) { 
       // headset unplugged 
      } 
      break; 
     case 1: 
      // headset plugged in 
      break; 
     default: 
      break; 
    } 
} 
0

나는 ACTION_HEADSET_PLUG를 사용하고 있지만 일부 장치 6.0 +에 이어폰을 통해 소리를 재생과 같은 문제를 가지고 있었어요. 내 솔루션은 LOLLIPOP보다 높은 버전의 기기에 AudioAttributes을 사용하는 것입니다.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
     AudioAttributes mAttributes = new AudioAttributes.Builder() 
       .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) 
       .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) 
       .build(); 
     mMediaPlayer = MediaPlayer.create(this, R.raw.connection, mAttributes, 1); 
    } else { 
     mMediaPlayer = MediaPlayer.create(this, R.raw.connection); 
    } 
관련 문제