Android - Как включить громкую связь и максимальную громкость для телефонного звонка - PullRequest
1 голос
/ 03 августа 2020

Я думал, что могу включить громкую связь и установить максимальную громкость в пределах 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
    }
}

1 Ответ

1 голос
/ 04 августа 2020

a PhoneStateListener, как следует из названия, является просто слушателем, он не может выполнять действия в текущем вызове, это ответственность приложения Phone по умолчанию.

Хорошая новость в том, что вы пользователь может установить ваше приложение как приложение по умолчанию Phone, но это заставит вас реализовать определенные действия и службы, которые могут выходить за рамки вашего приложения.

Вам нужно будет реализовать собственную панель набора номера активность для совершения звонков, ваш собственный InCallService для обработки активных вызовов и собственный пользовательский интерфейс во время разговора, позволяющий пользователю отключать звук, включать динамик, подключаться к Bluetooth, переводить вызов в режим ожидания вызова , отправьте тональные сигналы во время разговора и т.д. c.

Вы можете проверить эту серию средних сообщений о том, как сделать ваше приложение приложением для телефона по умолчанию. * После того, как вы сделали свое приложение телефоном по умолчанию и ваше приложение управляет текущим приложением, вы можете использовать setAudioRoute для включения громкой связи.

РЕДАКТИРОВАТЬ:

Вы можете попробовать использовать setSpeakerphoneOn в AudioManager (isX всегда используется для проверки значения, setX используется для изменения значения), однако в документации сказано:

Этот метод должен использоваться только приложения, которые заменяют общесистемное управление настройками звука или основное приложение телефонии.

Я не уверен, что Android обеспечивает это, запрещая приложениям вызывать этот метод, и если да, то на какая платформа Android, но вы можете попробовать это.

Существует также способ использовать java отражение для доступа к скрытому API, см. здесь , но использование отражения почти наверняка не работает в последней версии Android и может заблокировать доступ вашего приложения в Google Play. Тем не менее, возможно, стоит поиграться.

...