首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在android 4.0中以编程方式打开/关闭扬声器

如何在android 4.0中以编程方式打开/关闭扬声器
EN

Stack Overflow用户
提问于 2012-08-20 18:42:16
回答 7查看 44.9K关注 0票数 22

我通过媒体播放器播放一个文件,我想给出像扬声器开/关,通过耳机播放,蓝牙等选项。我尝试了下面的代码,它在android 2.2上工作得很好,但我想要的东西也可以在2.2和4.0两者都工作。你能帮我通过编程打开/关闭扬声器并通过耳机播放吗?

代码语言:javascript
复制
AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    if(isOn){
        audioManager.setMode(AudioManager.MODE_IN_CALL);    
        audioManager.setMode(AudioManager.MODE_NORMAL); 
    }else{
        //Seems that this back and forth somehow resets the audio channel
        audioManager.setMode(AudioManager.MODE_NORMAL);     
        audioManager.setMode(AudioManager.MODE_IN_CALL);        
    }
    audioManager.setSpeakerphoneOn(isOn);

附言:我在manifest中给出了这个权限:

代码语言:javascript
复制
android.permission.MODIFY_AUDIO_SETTINGS 
EN

回答 7

Stack Overflow用户

发布于 2012-08-20 20:33:24

这样的东西可能会在一些设备上工作(我只在XPeria P上测试过):

代码语言:javascript
复制
final static int FOR_MEDIA = 1;
final static int FORCE_NONE = 0;
final static int FORCE_SPEAKER = 1;

Class audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
setForceUse.invoke(null, FOR_MEDIA, FORCE_SPEAKER);
// To get back to the default behaviour, use the combination FOR_MEDIA,FORCE_NONE.

组合FOR_MEDIA, FORCE_SPEAKER通常仅在内部用于将FM无线电音频路由到扬声器(因为FM无线电需要插入有线头戴式耳机/耳机作为天线)。没有FM无线电功能(或使用替代实现)的设备可能会忽略此参数组合,因此此方法在此类设备上不起作用。

票数 27
EN

Stack Overflow用户

发布于 2016-03-21 20:59:52

代码语言:javascript
复制
AudioManager mAudioMgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 

Button mVolumeButton = (Button)findViewById(R.id.btn_Volume);
        mVolumeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mAudioMgr.isWiredHeadsetOn()){
                    mAudioMgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
                    mAudioMgr.setWiredHeadsetOn(false);
                    mAudioMgr.setSpeakerphoneOn(true);
                    mAudioMgr.setMode(AudioManager.MODE_IN_COMMUNICATION);

                    Toast.makeText(getApplicationContext(), "SpeakerPhone On", Toast.LENGTH_LONG).show();
                }else{
                    mAudioMgr.setMode(AudioManager.MODE_IN_COMMUNICATION);
                    mAudioMgr.setSpeakerphoneOn(false);
                    mAudioMgr.setWiredHeadsetOn(true);
                    Toast.makeText(getApplicationContext(), "Wired Headset On", Toast.LENGTH_LONG).show();
                }
            }
        });
票数 6
EN

Stack Overflow用户

发布于 2018-08-24 17:04:01

试试下面的代码片段:

代码语言:javascript
复制
//for speakerphone on
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(true);

//for headphone on
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(false);

顺便说一句,我在Android7.0(Redmi 4x)上测试过,它工作得很好。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12036221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档