android 拨打紧急号码,通话时开启免提功能实现
16lz
2021-12-04
对应拨打电话只需要调用ACTION_CALL加对应电话号码即可如下:
void callPhone(){ Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:110")); //不能调用呼叫 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
但是当你拨打110,119,120等紧急电话时,你会发现无法自动呼出,还需要用户进行确认操作,那么能不能实现直接进行呼叫?
答案是可以的,但是前提app必须用系统级别权限,及system/app/目录下方可。
首先确保应用具有如下权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> <uses-permission android:name="android.permission.CALL_PRIVILEGED" />
同样调用intent来开启功能,不过内容有些变化
void callPhone(String num){ Intent intent = new Intent("android.intent.action.CALL_PRIVILEGED",Uri.parse("tel:"+num)); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
然后在源码下编译,放到/system/app/即可使用。
开启拨通电话后设置开启扬声器功能:
首先,获取音频管理器:
audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
设置电话监听:
private class TelListner extends PhoneStateListener{boolean comingPhone=false;@Overridepublic void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_IDLE:/* 无任何状态 */ Log.d(tag, "phone idle"); if(this.comingPhone){ this.comingPhone=false; backMyApp(); setSpeekModle(false); } break; case TelephonyManager.CALL_STATE_OFFHOOK:/* 接起电话 */ Log.d(tag, "phone answer"); this.comingPhone=true; setSpeekModle(true); break; case TelephonyManager.CALL_STATE_RINGING:/* 电话进来 */ Log.d(tag, "phone coming"); this.comingPhone=true; setSpeekModle(true); break; } }}
注册监听类:
TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); TelListner listener = new TelListner() ; telManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
开启或关闭免提功能:
void setSpeekModle(boolean open){//audioManager.setMode(AudioManager.ROUTE_SPEAKER); currVolume = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL); audioManager.setMode(AudioManager.MODE_IN_CALL); if(!audioManager.isSpeakerphoneOn()&&true==open) { audioManager.setSpeakerphoneOn(true); audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), AudioManager.STREAM_VOICE_CALL); }else if(audioManager.isSpeakerphoneOn()&&false==open){ audioManager.setSpeakerphoneOn(false); audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,currVolume, AudioManager.STREAM_VOICE_CALL); }}
添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
更多相关文章
- Android调用.NET Webservice报org.ksoap2.serialization.SoapPri
- android 自定义view
- Android(安卓)N 指纹框架
- android调用setRequestedOrientation之后
- android 包管理系统分析
- 【Android】使用LiveData KTX Builder让代码更简洁
- bridge和原生交互的简单用法
- Android(安卓)SDK 1.0 电话号码的例子(Demo)
- Hybrid(在Android中的实现)