Android: 未经许可的来电监听
Android: Incoming call listener without permission
我知道我们可以通过带过滤器的广播接收器收听phone状态
action android:name="android.intent.action.PHONE_STATE"
但是这种方式需要权限
uses-permission android:name="android.permission.READ_PHONE_STATE"
如何判断没有此权限的GSM来电?
P.S.
我确定这可能是因为 Whatsapp 在做。
当我在 Whatsapp 音频通话中通话,然后收到 gsm 来电时 - whatsapp 检查它并将自我通话设置为暂停。他们如何理解需要设置暂停?
Whatsapp 在 Manifest 文件中有 READ_PHONE_STATE 权限,但我检查了 Android 6 上的调用,但未授予此权限。此权限已被禁用。
禁用此权限后,我的接收器不会收到操作 android.intent.action.PHONE_STATE 并且 PhoneStateListener 无法正常工作。
当 android 设备收到 Activity
的 phone 呼叫 onPause
时,在 phone 呼叫被自动呼叫之前显示,您可以在那里暂停通话。
首先,whatsapp 使用了获得 phone 状态所需的权限
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
这是 WhatsApp 清单文件 link。
你可以看到他们已经在里面添加和使用了。
Android 本身提供了使用广播处理它的最佳解决方案 receiver.You 应该使用这些,否则你的系统会很糟糕。
按照这些 link 与广播接收器一起检测 phone 呼叫。
希望这些对你有帮助。
我在未经许可的情况下找到了解决方案。
首先(当我们的 sip 呼叫开始时)我们需要使用 lisener 请求音频焦点
mAudioManager.requestAudioFocus(afChangeListener, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN);
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**
}
}
};
您可以使用带有 phone 号码的 onReceive 方法和来电的所有详细信息来获取此信息。
简答:
1-检查来电功能
private boolean isIncomingCall(Context context) {
AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
return manager.getMode() == AudioManager.MODE_IN_CALL || manager.getMode() == AudioManager.MODE_RINGTONE;
}
2- 处理程序每 2 秒重复一次
Handler handler = new Handler();
Runnable runnableCheckOngoingCall;
runnableCheckOngoingCall = new Runnable() {
@Override
public void run() {
if (handler != null) {
if (isIncomingCall(ActivityName.this)) {
// Write your logic code here
handler.removeCallbacks(runnableCheckOngoingCall);
} else {
handler.postDelayed(runnableCheckOngoingCall, 2000);
}
}
}
};
handler.postDelayed(runnableCheckOngoingCall, 2000);
3- 销毁 activity
时不要忘记删除处理程序回调
@Override
public void onDestroy() {
super.onDestroy();
if (handler != null) handler.removeCallbacks(runnableCheckOngoingCall);
}
我知道我们可以通过带过滤器的广播接收器收听phone状态
action android:name="android.intent.action.PHONE_STATE"
但是这种方式需要权限
uses-permission android:name="android.permission.READ_PHONE_STATE"
如何判断没有此权限的GSM来电?
P.S.
我确定这可能是因为 Whatsapp 在做。
当我在 Whatsapp 音频通话中通话,然后收到 gsm 来电时 - whatsapp 检查它并将自我通话设置为暂停。他们如何理解需要设置暂停?
Whatsapp 在 Manifest 文件中有 READ_PHONE_STATE 权限,但我检查了 Android 6 上的调用,但未授予此权限。此权限已被禁用。
禁用此权限后,我的接收器不会收到操作 android.intent.action.PHONE_STATE 并且 PhoneStateListener 无法正常工作。
当 android 设备收到 Activity
的 phone 呼叫 onPause
时,在 phone 呼叫被自动呼叫之前显示,您可以在那里暂停通话。
首先,whatsapp 使用了获得 phone 状态所需的权限
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
这是 WhatsApp 清单文件 link。
你可以看到他们已经在里面添加和使用了。
Android 本身提供了使用广播处理它的最佳解决方案 receiver.You 应该使用这些,否则你的系统会很糟糕。
按照这些 link 与广播接收器一起检测 phone 呼叫。
希望这些对你有帮助。
我在未经许可的情况下找到了解决方案。
首先(当我们的 sip 呼叫开始时)我们需要使用 lisener 请求音频焦点
mAudioManager.requestAudioFocus(afChangeListener, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN);
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**
}
}
};
您可以使用带有 phone 号码的 onReceive 方法和来电的所有详细信息来获取此信息。
简答:
1-检查来电功能
private boolean isIncomingCall(Context context) {
AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
return manager.getMode() == AudioManager.MODE_IN_CALL || manager.getMode() == AudioManager.MODE_RINGTONE;
}
2- 处理程序每 2 秒重复一次
Handler handler = new Handler();
Runnable runnableCheckOngoingCall;
runnableCheckOngoingCall = new Runnable() {
@Override
public void run() {
if (handler != null) {
if (isIncomingCall(ActivityName.this)) {
// Write your logic code here
handler.removeCallbacks(runnableCheckOngoingCall);
} else {
handler.postDelayed(runnableCheckOngoingCall, 2000);
}
}
}
};
handler.postDelayed(runnableCheckOngoingCall, 2000);
3- 销毁 activity
时不要忘记删除处理程序回调@Override
public void onDestroy() {
super.onDestroy();
if (handler != null) handler.removeCallbacks(runnableCheckOngoingCall);
}