2011-12-23 96 views
6

我的要求是在启动拨出电话时打开扬声器电话。我尝试了下面的代码,但它不起作用。实际上,在通话过程中,免提电话开启,第二个电话就会来临!每当打出电话时打开扬声器电话

package in.co.allsolutions; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
//import android.view.View; 
import android.widget.Toast; 
import android.media.AudioManager; 

public class MyTelephonyBroadcastReceiver extends BroadcastReceiver { 

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

      AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
      audioManager.setSpeakerphoneOn(true); 
      Bundle extras = intent.getExtras();    
      if (extras != null) { 

        String state = extras.getString(TelephonyManager.EXTRA_STATE); 
        Log.i("AS", "Message Received. State = " + state + ", Mode = " + audioManager.getMode()); 
        //audioManager.setMode(AudioManager.MODE_NORMAL); 
        //audioManager.setSpeakerphoneOn(true); 
//     if (state.equals("OFFHOOK")) 
//     {     
        //audioManager.setMode(AudioManager.MODE_CURRENT); 
        //audioManager.setSpeakerphoneOn(true); 
        //audioManager.setMode(AudioManager.MODE_IN_CALL); 
        //audioManager.setSpeakerphoneOn(true); 
        //audioManager.setMode(AudioManager.MODE_RINGTONE); 
        //audioManager.setSpeakerphoneOn(true); 
        if (audioManager.isSpeakerphoneOn()) { 
         Log.i("AS", "Speaker on - SUCCESS."); 
        } else { 
         Log.i("AS", "Speaker could not be turned on."); 
        } 
//     } 
      } else { 
        Toast.makeText(context, "Message Received without any state", Toast.LENGTH_LONG).show(); 
      } 
     } 
} 

谢谢。

+0

我在这里发现了一个类似的问题,也没有回答:http://www.anddev.org/novice-tutorials-f8/how-to-programmatically-turn-on-loudspeaker-when-make-receiv- t49421.html。这是Android的错误吗? – AllSolutions 2012-01-12 16:24:35

+0

在这里看到我的答案:http://stackoverflow.com/a/25346769/2826409 – 2014-08-17 06:24:16

回答

5

类似的问题被提出和回答here.

我想答案可能是你的项目的AndroidManifest.xml。尝试添加:

uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" 

到您的清单,这将允许您的应用程序修改设备的音频设置。
您还需要改变你的audioManager模式MODE_IN_CALL:

audioManager.setMode(AudioManager.MODE_IN_CALL) 
9

您可以设置它通过编程方式如下:

AudioManager audioManager = (AudioManager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE); 
audioManager.setMode(AudioManager.MODE_IN_CALL); 
audioManager.setSpeakerphoneOn(true); 

但是,请记住,不要忘了把扬声器关闭时停止呼叫:

audioManager.setSpeakerphoneOn(false); 

而且,设置权限在清单:

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> 

这段代码对我来说工作正常,希望对你有所帮助。

+0

谢谢。在Kitkat 4.4.2中,不需要RECORD_AUDIO权限,我不能说其他Android版本。 – 2017-04-01 09:51:01