[英]Android - How to turn on speakerphone and max volume for phone call
我以為我可以打開免提電話並在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
應用程序,但它會強制您實施某些活動和服務,這些活動和服務可能超出您的應用程序的 scope。
您需要實現自己的撥號盤活動來撥打電話,自己的InCallService
用於處理活動呼叫,以及您自己的通話 UI 以允許用戶靜音、打開揚聲器、連接到藍牙、撥打電話 -等待,在通話中發送撥號音等。
您可以查看這一系列關於如何使您的應用程序成為默認電話應用程序的中型帖子。
將您的應用設置為默認手機應用,並且您的應用控制當前應用后,您可以使用setAudioRoute
開啟免提電話。
編輯:
您可以嘗試在 AudioManager 中使用setSpeakerphoneOn
( isX
始終用於檢查值, setX
用於修改值),但是文檔說:
此方法應僅由替換音頻設置的平台范圍管理或主要電話應用程序的應用程序使用。
我不確定 Android 是否通過阻止應用程序調用此方法來強制執行此操作,如果是,則在哪個 Android 平台上執行此操作,但您可以嘗試一下。
還有一種方法可以使用 java 反射來訪問隱藏的 API,請參見此處,但使用反射幾乎肯定會破壞最新版本的 Android,並可能阻止您的應用程序進入 Google Play。 即便如此,可能值得一玩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.