如何在Android Pie和UP中以编程方式打开/关闭扬声器

Vas*_*tov 7 android

与这个问题以及几年前的其他问题相同: 如何在Android 4.0中以编程方式打开/关闭扬声器

似乎Android已经改变了它的处理方式。

这是我尝试拨出电话以编程方式设置免提电话的操作。这些解决方案都无法在Android Pie上使用。虽然它们似乎在Android Nougat和Oreo上运行良好

解决方案1。

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);
Run Code Online (Sandbox Code Playgroud)

2。

AudioManager audioManager = (AudioManager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
   audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
   audioManager.setSpeakerphoneOn(true);
Run Code Online (Sandbox Code Playgroud)

3。

AudioManager audioManager = (AudioManager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
   audioManager.setMode(AudioManager.MODE_IN_CALL);
   audioManager.setSpeakerphoneOn(true);
Run Code Online (Sandbox Code Playgroud)

4。

Thread thread = new Thread() {
    @Override
    public void run() {
        try {
            while(true) {
                sleep(1000);
                audioManager.setMode(AudioManager.MODE_IN_CALL);
                if (!audioManager.isSpeakerphoneOn())
                    audioManager.setSpeakerphoneOn(true);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};
thread.start();
Run Code Online (Sandbox Code Playgroud)

该应用程序具有以下众多其他授予的权限:

<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
Run Code Online (Sandbox Code Playgroud)

我还尝试了以下解决方案,仅适用于去电。而且也没有用。

Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.putExtra("speaker", true);
callIntent.setData(Uri.parse("tel:" + number));
context.startActivity(callIntent);
Run Code Online (Sandbox Code Playgroud)

odg*_*and 6

在 Android Pie 中,我也遇到了同样的问题。我使用 InCallService 解决了这个问题

setAudioRoute(ROUTE_SPEAKER)
Run Code Online (Sandbox Code Playgroud)

您的应用程序需要是默认手机应用程序。


小智 5

我很惊讶没有人提到TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE。

作为一个意图:

val uri = Uri.fromParts("tel", PHONE_NUMBER, null)
val intentCall = Intent(Intent.ACTION_CALL, uri).apply {
    putExtra(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, true)
    flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
startActivity(intentCall)
Run Code Online (Sandbox Code Playgroud)

使用 TelecomManager.placeCall:

val uri = Uri.fromParts("tel", PHONE_NUMBER, null)
val extras = Bundle().apply { putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, true) }
val telecomManager = getSystemService(TELECOM_SERVICE) as TelecomManager
telecomManager.placeCall(uri, extras)
Run Code Online (Sandbox Code Playgroud)

默认的手机应用程序应该处理这些额外的数据并启用扬声器。

记得征求android.permission.CALL_PHONE许可。


小智 -1

对于这个问题,请尝试以下代码,它对我有用。

AudioManager myAudioManager;
myAudioManager.setMode(AudioManager.MODE_NORMAL);
myAudioManager.setSpeakerphoneOn(true);
Run Code Online (Sandbox Code Playgroud)