在来电期间,用户可以将手机铃声静音,但按下音量调高或Android手机中的开机按钮。我正在创建一个说话来电者姓名应用程序,在我的应用程序中将说出呼叫者的姓名。我不会将当前的铃声静音。在我的应用程序中一切正常,除非在来电期间电话响铃并且用户通过按音量或电源按钮将其置于静音状态。我无法处理此触发器。我试过AudioManager和RingToneManager类但是徒劳无功。 我的应用程序有一个活动(应用程序设置),一个BroadCast接收器类(用于捕获来电)和一个服务(用于触发TTS引擎)。
代码:
private void SpeakCallerName(String txtSpeak) {
Runnable runnable = new Runnable() {
@Override
public void run() {
Ringtone ringtone = null;
_status = "SpeakService speak Runnable phoneRinging: " + phoneRinging;
Log.i("Test", _status);
int i =0;
try {
while(phoneRinging) {
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
_status = "SpeakService speak Runnable inside while loop count: "+i + "phoneRinging:" + phoneRinging;
Log.i("Test", _status);
int Mode = audioManager.getMode();
_status = "SpeakService speak Runnable inside while loop count: "+i + ":audioManager.getMode():" + Mode;
Log.i("Test", _status);
int ringerMode=audioManager.getRingerMode();
_status = "SpeakService speak Runnable inside while loop count: "+i + ":audioManager.getRingerMode():" + ringerMode;
Log.i("Test", _status);
int StreamVolume=audioManager.getStreamVolume(AudioManager.STREAM_RING);
_status = "SpeakService speak Runnable inside while loop count: "+i + ":audioManager.getStreamVolume:" + StreamVolume;
Log.i("Test", _status);
myTts.speak(_txtSpeak,TextToSpeech.QUEUE_FLUSH,null);
Thread.sleep(5000);
_status = "SpeakService speak Runnable count: "+i + " slept for 8 sec";
Log.i("Test", _status);
i+=1;
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
catch (Exception e) {
_status = "SpeakService speak Runnable count: "+i + " EXCEPTION: " + e.getMessage();
Log.i("Test", _status);
}
}
};
Thread mythread = new Thread(runnable);
mythread.start();
}
我的日志是这样的:
SpeakService在循环计数内说Runnable:1phoneRinging:true SpeakService在循环计数内部说Runnable:1:audioManager.getMode():1 SpeakService在循环计数内部说Runnable:1:audioManager.getRingerMode():2 SpeakService在循环计数内部说Runnable:1:audioManager.getStreamVolume:7
当用户按下音量或电源按钮时,我仍然可以在日志中获得上述值。
答案 0 :(得分:0)
您可以利用不同频道的音量,如铃声音量或音乐/媒体音量。铃声音量对你的情况来说是显而易见的,它应该在铃声本身变得沉默时变得沉默。音乐音量将具有最后播放音乐的音量,但无论如何都会保持静音,任何来电。我还没有看到创建和控制自己频道的方法。
如果您使用SoundPool
,我会选择此行进行设置:
SoundPool soundPool = new SoundPool(1, AudioManager.STREAM_RING, 0);
嗯,这就是理论上应该如何运作的。我有控制音池的音量的经验,但没有与接听电话一起使用。所以,你最好试一试。