当前位置: 首页 > 知识库问答 >
问题:

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

苏彦君
2023-03-14

我通过媒体播放器播放文件,我想提供扬声器开/关、通过耳机播放、蓝牙等选项。我尝试了以下适用于android 2.2的代码,但我想要一些也可以同时适用于2.2和4.0的代码。你能帮我以编程方式打开/关闭扬声器并通过耳机播放吗?

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);

P、 S:我已在清单中授予此权限:

android.permission.MODIFY_AUDIO_SETTINGS 

共有3个答案

仲孙小云
2023-03-14

您可以同时获得后扬声器或前耳机。

如果没有连接附件;

使用audioManager。setMode(AudioManager.MODE\u IN\u调用

如果附件已连接;使用audioManager。setMode(AudioManager.MODE\u IN\u调用);

注意:确保audioManager。设置WiredHeadSeton(布尔值开启)和音频管理器。setBluetoothScoOn(布尔启用)设置为false,通过听筒传送音频。并将其设置为true,以相应地路由音频。

唐晗昱
2023-03-14
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();
                }
            }
        });
仇迪
2023-03-14

类似的操作可能会在某些设备上运行(我只在XPeria P上进行了测试):

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.

对于媒体,FORCE\u扬声器的组合通常仅在内部用于将调频收音机音频传送到扬声器(因为调频收音机需要插入有线耳机/耳机作为天线)。没有调频收音机功能(或使用替代实现)的设备可能会忽略此参数组合,因此此方法在此类设备上不起作用。

 类似资料:
  • 问题内容: 我需要像这样打开/关闭模态 $(element).modal(’show’) 怎么做? 问题答案: 您正在寻找的是自定义模式触发器,该触发器使用并允许您自己管理模式状态。您可以控制是否使用模态来实现与以下示例中所要求的效果相同的效果。以下代码来自react-bootstrap网站(http://react- bootstrap.github.io/components.html#mod

  • 问题内容: JFrame与用户按下X关闭按钮或按在Windows上)相同,获得关闭的正确方法是什么? 我通过以下方式设置了我想要的默认关闭操作: 它完全符合我想要的上述控件的功能。这个问题不是关于这个的。 我真正想做的是使GUI的行为与按下X关闭按钮的行为相同。 假设我要扩展,然后通过来添加我的适配器的实例作为侦听器。我想看到的调用相同的序列通过,以及作为将与出现X关闭按钮。可以这么说,撕开窗户与

  • 我的主类扩展了JPanel,我在这个面板上创建了一个表和一个按钮。现在我想在用户按下它时关闭这个面板。在互联网上关闭面板的例子是关于JFrame.JPanel有解决方案吗?

  • 我正在使用netty 4.0。24.4决赛。 我需要以编程方式启动/停止网络服务器。 在启动服务器时,线程在 请提供一些如何正确操作的提示。下面是由主类调用的EchoServer。谢谢 更新:我用以下方式更改了EchoServer类。其想法是在新线程中启动服务器,并保留到EventLoopGroup的链接。这条路对吗?

  • 问题内容: 我想制作一个锁屏应用程序。当手机处于锁定模式时,它将在插入USB时关闭手机,以防止其他用户访问手机数据。有谁知道如何以编程方式关闭Android设备,以使其他人在设备处于锁定模式时无法访问数据? 这是在锁定屏幕活动上锁定主屏幕按钮的代码: 问题答案: 使用公开的Android SDK是不可能的。

  • null 如何禁用此行为?如果谷歌chrome开发者控制台已经打开,我如何关闭它?