gpt4 book ai didi

Android - 如何打开免提电话和最大通话音量

转载 作者:行者123 更新时间:2023-12-02 13:27:46 25 4
gpt4 key购买 nike

我以为我可以打开免提电话并将音量设置为最大 PhoneStateListener ,但是当我测试它时我无法让它工作。我正在使用 AudioManager尝试打开扬声器并设置音量。这不是正确的方法吗?为什么以下代码无法启用扬声器?

class PlaceCall : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
telephonyManager.listen(CallListener(this), PhoneStateListener.LISTEN_CALL_STATE)
val callIntent = Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber))
startActivity(callIntent)
...
}
}
class CallListener(cont: Context) : PhoneStateListener() {
private var context: Context = cont

override fun onCallStateChanged(state: Int, phoneNumber: String?) {
val audioManager: AudioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), 0) //I believe this should set call volume to max?
audioManager.isSpeakerphoneOn = true //I believe this should enable speakerphone, but it doesn't during my tests
}
}
AndroidManifest.xml
...
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
...
编辑:
我尝试添加 BroadcastReceiver也一样,但这并没有改变结果。免提电话仍未启用。这没有意义,我不知道我做错了什么。下面是添加了新的 BroadcastReciever 的更新代码(上面的代码仍然相同)。
AndroidManifest.xml (updated)
...
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<application>
<receiver android:name=".ServiceReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
</application>
...
class ServiceReceiver : BroadcastReceiver() {
lateinit var telephonyManager: TelephonyManager

override fun onReceive(context: Context, intent: Intent) {
telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
telephonyManager.listen(CallListener(context), PhoneStateListener.LISTEN_CALL_STATE)
val audioManager: AudioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.mode = AudioManager.MODE_IN_CALL
audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), 0)
audioManager.isSpeakerphoneOn = true
}
}

最佳答案

一个 PhoneStateListener顾名思义,它只是一个监听器,它不能对当前调用执行操作,这是默认 Phone 的责任应用程序。
好消息是您可以让用户将您的应用设置为默认 Phone应用程序,但它会强制您实现某些 Activity 和服务,这些 Activity 和服务可能超出您的应用程序的范围。
您需要实现自己的拨号盘 Activity 来调用电话,您自己的 InCallService 用于处理 Activity 调用,以及您自己的通话用户界面,用于允许用户静音、打开扬声器、连接到蓝牙、在调用等待时调用电话、在通话中发送拨号音等。
您可以查看this series of medium posts关于如何使您的应用程序成为默认电话应用程序。
将您的应用设置为默认手机应用,并且您的应用控制当前应用后,您可以使用 setAudioRoute 打开免提电话。
编辑:
您可以尝试使用 setSpeakerphoneOn 在 AudioManager 中(isX 始终用于检查值,setX 用于修改值),但是文档说:

This method should only be used by applications that replace theplatform-wide management of audio settings or the main telephonyapplication.


我不确定 Android 是否通过阻止应用程序调用此方法来强制执行此操作,如果是,则在哪个 Android 平台上执行此操作,但您可以尝试一下。
还有一种使用java反射访问隐藏API的方法, see here ,但使用反射几乎肯定会在最新版本的 Android 上中断,并且可能会阻止您的应用进入 Google Play。即便如此,可能值得一玩。

关于Android - 如何打开免提电话和最大通话音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63222017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com