我试图在服务中以编程方式设置扬声器,audiomanager.setSpeakerphoneOn(true)但似乎它不起作用,我不知道为什么.我应该做别的吗?
谢谢
我在BroadcastReceiver(电话状态监听器)中使用以下代码来启用免提电话:
final Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);
}
}, 500);
Run Code Online (Sandbox Code Playgroud)
当通过我的应用程序启动新的拨出电话时会发生这种情况.当呼叫断开时,我关闭扬声器电话:
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(false);
Run Code Online (Sandbox Code Playgroud)
这一切似乎都很好......第一次.之后,我手机的音频流似乎被搞乱了.后续调用非常安静,即使是从我的应用程序代码外部调用(不触发上述设置).我可以随意看回来的音频,但我不确定是什么导致它返回.
关于我可能做错的任何想法?是否有我不知道的Android错误?如何避免为后续呼叫静音我的音频?
编辑:我正在测试Galaxy S4.
我试图通过按钮在两者之间切换来播放扬声器和耳机的音频.问题是我试图默认音频从耳机播放,但没有任何结果.然后当我按下按钮切换到扬声器时,仍然没有音频播放.我正在播放本地原始文件.
我在Manifest中也有android.permission.MODIFY_AUDIO_SETTINGS.
这是我的代码:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
context = getActivity().getBaseContext();
am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
am.setMode(AudioManager.MODE_IN_CALL);
am.setSpeakerphoneOn(false);
am.setBluetoothScoOn(true);
speakerON = false;
}
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.buttonSpeaker:
if(!speakerON)//speaker off
{
speakerON = true;
am.setMode(AudioManager.MODE_NORMAL);
am.setSpeakerphoneOn(true);
am.setBluetoothScoOn(false);
speaker.setCompoundDrawablesWithIntrinsicBounds(android.R.drawable.ic_lock_silent_mode_off, 0, 0, 0);
}
else
{
speakerON = false;
am.setMode(AudioManager.MODE_IN_CALL);
am.setSpeakerphoneOn(false);
am.setBluetoothScoOn(true);
speaker.setCompoundDrawablesWithIntrinsicBounds(android.R.drawable.ic_lock_silent_mode, 0, 0, 0);
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我设置MediaPlayer的方法:
mediaPlayer = MediaPlayer.create(getActivity().getBaseContext(), R.raw.test_message);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
mediaPlayer.start();
Run Code Online (Sandbox Code Playgroud) 我的要求是每当拨打电话时打开免提电话.我尝试了以下代码,但它无法正常工作.事实上,扬声器电话在通话中间打开,第二个电话来了!
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); …Run Code Online (Sandbox Code Playgroud) 我目前正在编写一个应用程序,要求录制和实时处理音频数据.为此,我正在使用AudioRecord类.除了在我的主要测试设备(一个星系连接点)上录制音频的默认设置是从后置扬声器录制时,这一切都很好.我假设大多数手机默认录音源都是背部或底部麦克风,因为当你使用手机拨打电话时,你的嘴巴接近底部.
但是,我的应用程序要求我从手机正面的扬声器录制,所以我希望有人可以帮助我如何以编程方式更改AudioRecord输入源.我已经广泛搜索了这个问题的答案.
我考虑过的一些事情是:
AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); am.setSpeakerphoneOn(true);
AudioRecord ar = new AudioRecord(AudioSource.????, ..., ..., ..., ...);
我发现API对于哪种AudioSource格式并不太具体,所以我想知道是否有其他人在这个问题上遇到了困难,并且可以指出我正确的方向.
提前致谢,
android speakerphone speaker audiorecord android-audiomanager
在通话期间,我尝试使用pjsip 2.2库将语音从内置扬声器切换到iOS设备上的扬声器.它返回TRUE表示成功,但物理上它不会改变声音目标.
我使用下一个代码
- (BOOL)setLoud:(BOOL)loud {
if (loud) {
@try {
pjmedia_aud_dev_route route = PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER;
pj_status_t pj_status = pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE,
&route, PJ_TRUE);
if (pj_status == PJ_SUCCESS) {
return YES;
}
else
{
return NO;
}
}
@catch (NSException *exception) {
return NO;
}
} else {
@try {
pjmedia_aud_dev_route route = PJMEDIA_AUD_DEV_ROUTE_EARPIECE;
pj_status_t pj_status = pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE,
&route, PJ_TRUE);
if (pj_status == PJ_SUCCESS) {
return YES;
}
else
{
return NO;
}
}
@catch (NSException *exception) {
return NO;
}
}
} …Run Code Online (Sandbox Code Playgroud) 我打电话时试着打开扬声器.我试过这段代码.注册新的电话听众.但这不起作用.它显示吐司信息,但扬声器仍然是静音(默认只有听筒).
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(LOG_TAG, "onCallStateChanged: CALL_STATE_OFFHOOK");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Toast.makeText(mContext,"Call, time to turn speaker on",Toast.LENGTH_SHORT).show();
AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
audioManager.setSpeakerphoneOn(true);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
当然我在AndroidManifest.xml中添加了permisions.
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
Run Code Online (Sandbox Code Playgroud)
编辑
这也不起作用.它返回false(Toast消息为false);
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(LOG_TAG, "onCallStateChanged: CALL_STATE_OFFHOOK");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Toast.makeText(mContext,"Call, time to turn speaker on",Toast.LENGTH_SHORT).show();
audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
((Activity)mContext).setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);
boolean check …Run Code Online (Sandbox Code Playgroud) speakerphone ×7
android ×6
audio ×2
speaker ×2
audiorecord ×1
button ×1
java ×1
pjsip ×1
toggle ×1
voip ×1