2013-11-24 7 views
2

AudioManager는 onCallStateChanged에서 신뢰할 수 없습니다. 전화 통화 도중 스피커 폰을 켜고 최대 볼륨으로 설정해야합니다. 스피커폰을 켜기도하고 (일반적으로 두 번째 이후의 통화 중에) 볼륨을 올리는 경우는 거의 없습니다. My PhoneCallListener 클래스는 MainActivity 클래스 내에 있습니다. AudioManager가 신뢰할 수 없습니다.

private class PhoneCallListener extends PhoneStateListener 
{ 
    private boolean isPhoneCalling = false; 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) 
    { 
     AudioManager aM = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     aM.setMode(AudioManager.MODE_IN_CALL); 
     aM.setSpeakerphoneOn(true); 

     if(TelephonyManager.CALL_STATE_RINGING == state) 
     { 
      //phone ringing 
      aM.setSpeakerphoneOn(true); 
      aM.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); 
     } 

     if(TelephonyManager.CALL_STATE_OFFHOOK == state) 
     { 
      //phone active 
      aM.setSpeakerphoneOn(true); 
      aM.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0); 
      isPhoneCalling = true; 
     } 

     if(TelephonyManager.CALL_STATE_IDLE == state) 
     { 
      aM.setSpeakerphoneOn(false); 

      if(isPhoneCalling) 
      {    
       Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); 
       i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(i); 
       isPhoneCalling = false; 
      } 
     } 
    } 
} 

는 CALL_STATE_OFFHOOK 내 나는 그것이 지속적으로 볼륨 UI를 표시하기 때문 AudioManager.FLAG_SHOW_UI를 해제했다. 또, aM.setStreamVolume (AudioManager.STREAM_MUSIC, aM.getStreamMaxVolume (AudioManager.STREAM_MUSIC), 0)을 설정합니다. 어떤 이유로 응용 프로그램을 중단합니다.

매회 AudioManager를 작동시켜 스피커폰이 켜져 있고 전화 통화 중에 볼륨이 최대가되는 방법에 대한 제안이 있으십니까?


편집 : 심지어 즉시 onCallStateChanged 메소드가 호출 될 때 true로 speackphoneon 설정으로, 여전히 신뢰성에 스피커폰을 켜 있지 않습니다. 볼륨도 신뢰할 수 없으며 충돌없이 최대로 설정할 수 없습니다.

+0

전화를받을 때 전화 자체가 스피커폰을 끈다는 것을 알고 계셨습니까? 둘 다 동시에 켜고 끄는 경우 때때로 켜지는 것이 놀랄 일이 아닙니다. –

+0

이 코드는 전화가 걸려 올 때 사용됩니다. 통화가 끝나면 스피커폰을 켜기를 원합니다. – user3001127

+0

같은 차이점 - 전화가 기본적으로 꺼지게되는 경우 전화가 다시 수신되면 전화를 켜기 전에 1 초 동안 기다려야하므로 전화로 다시 겹쳐 쓰지 않도록하는 것이 중요합니다. –

답변

0

아래 코드는이 작업을 수행하는 코드입니다. 롤리팝을 휴대 전화로 테스트했습니다.

private class myPhoneStateListener extends PhoneStateListener { 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     super.onCallStateChanged(state, incomingNumber); 

     switch (state) { 

      case TelephonyManager.CALL_STATE_OFFHOOK: //Call is established 
       Log.d("[email protected]", "Call is Offhook now!"); 
       try { 
        Thread.sleep(500); //We never know when the call is actually OffHook 
       } catch (InterruptedException e) { 
       Log.d("[email protected]","Exception is:"+e); 
       } 
       audioManager.setSpeakerphoneOn(true); 
       break; 

      case TelephonyManager.CALL_STATE_IDLE: //Call is finished 
        //Maintain a flag and do this only if speakerphone has been set on OFFHOOK 
        /*audioManager.setMode(AudioManager.MODE_NORMAL); 
        audioManager.setSpeakerphoneOn(false);*/ 
       break; 
     } 
    } 
} 

전화의 볼륨을 높이 들어 당신이 STREAM_VOICE_CALL의 볼륨을 증가시켜야 :로 PhoneStateListener를 작성합니다. 이 코드 + 호출 스트림의 볼륨을 늘리면 요구 사항을 충족합니다.