Android:未经许可的来电监听器

Dmi*_*kov 9 android phone-call

我知道我们可以通过带过滤器的广播接收器来收听电话状态

动作android:name ="android.intent.action.PHONE_STATE"

但这种方式需要许可

uses-permission android:name ="android.permission.READ_PHONE_STATE"

如何在没有此权限的情况下确定传入的GSM呼叫?

PS

我确信这可能是因为Whatsapp正在做这件事.
当我正在谈论Whatsapp音频电话,然后接到gsm来电 - whatsapp检查它并设置自己的电话暂停.他们如何理解需要设置暂停?

Whatsapp在Manifest文件中具有READ_PHONE_STATE权限,但是我检查了Android 6上的调用并且未授予此权限.此权限已被禁用.

禁用此权限后,我的Receiver不会收到操作 android.intent.action.PHONE_STATE并且PhoneStateListener无法正常工作.

Dmi*_*kov 11

没有这个许可我找到了解决方案

首先(当我们的sip call开始时)我们需要使用lisener请求音频焦点

 mAudioManager.requestAudioFocus(afChangeListener, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN);
Run Code Online (Sandbox Code Playgroud)

afChangeListener可以告诉我们然后某些人改变了音频焦点然后我们可以检查当前的音频通道.如果当前模式是AudioManager.MODE_IN_CALL或AudioManager.MODE_RINGTONE,那么我们知道gsm调用已启动.

AudioManager.OnAudioFocusChangeListener afChangeListener =
        new AudioManager.OnAudioFocusChangeListener() {
            public void onAudioFocusChange(int focusChange) {

                if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
                    // Permanent loss of audio focus
                    // Pause playback immediately
                } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
                    ScheduledExecutorService scheduler = App.getInstance().obtainScheduler();
                    scheduler.schedule(() -> {
                         Logging.i(TAG, "onAudioFocusChange defer mode = " + mAudioManager.getMode());
                         switch (mAudioManager.getMode()) {
                             case AudioManager.MODE_RINGTONE:
                             case AudioManager.MODE_IN_CALL:
                                 //**there we can start standby mode**
                                 break;
                         }
                    }, 100, TimeUnit.MILLISECONDS);

                } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
                    Logging.i(TAG, "onAudioFocusChange AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");
                    // Lower the volume, keep playing
                } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
                    // Your app has been granted audio focus again
                    //**there we can stop standby mode**
                }

            }
        };
Run Code Online (Sandbox Code Playgroud)