首页 文章 精选 留言 我的

精选列表

搜索[网络应用],共10000篇文章
优秀的个人博客,低调大师

Android四大组件应用系列——实现电话拦截和电话录音

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 使用BordercastReceiver和Service组件实现下述功能: 1.当手机处于来电状态,启动监听服务,对来电进行监听录音。 2.设置电话黑名单,当来电是黑名单电话,则直接挂断。 当拨打电话或电话状态发生改变时,系统就会发出有序广播,因此我们可以使用BordercastReceiver接受广播,因BordercastReceiver执行时间短不能执行耗时任务也不能使用子线程,因此我们应启动一个Service来监听电话并进行处理 二、加入AIDL文件 Android没有对外公开结束通话的API,要结束通话就必须使用AIDL与电话管理服务进行通信,并调用服务中的API实现结束通话,这样需要android 源码文件NeighboringCellInfo.aidl和ITelephony.aidl添加到项目中,如图所示: Android Studio 会自动编译产生对应的类文件 三、编写TelReceiver组件 publicclassTelReceiverextendsBroadcastReceiver{ publicTelReceiver(){ } @Override publicvoidonReceive(Contextcontext,Intentintent){ Intenti=newIntent(context,ListenPhoneService.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.setAction(intent.getAction()); i.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER, intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER));//电话号码 i.putExtra(TelephonyManager.EXTRA_STATE, intent.getStringExtra(TelephonyManager.EXTRA_STATE));//电话状态 context.startService(i);//启动服务 } } 注册广播: <receiverandroid:name=".TelReceiver"> <intent-filterandroid:priority="1000"> <actionandroid:name="android.intent.action.PHONE_STATE"/> <actionandroid:name="android.intent.action.NEW_OUTGOING_CALL"/> </intent-filter> </receiver> 四、编写ListenPhoneService组件 publicclassListenPhoneServiceextendsService{ privateAudioManagermAudioManager; privateTelephonyManagertm; publicListenPhoneService(){ } @Override publicvoidonCreate(){ super.onCreate(); mAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE); tm=(TelephonyManager)getSystemService(Service.TELEPHONY_SERVICE); } @Override publicintonStartCommand(Intentintent,intflags,intstartId){ if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){//去电广播,android没有来电话广播 }else{//去掉拨打电话就是来电状态了 //方法1 //获得来电电话 //Stringnumber=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); //获得电话状态 //Stringstate=intent.getStringExtra(TelephonyManager.EXTRA_STATE); //Log.d("jereh","incomingphone:"+number); //Log.d("jereh","callstate:"+state); //TelephonyManager.EXTRA_STATE_IDLE:没有来电或者挂断 //TelephonyManagerEXTRA_STATE_OFFHOOK:接起电话 //TelephonyManager.EXTRA_STATE_RINGING:当电话呼入时,响铃时 //if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){ //if(number.equals("13280998858")){//拦截指定的电话号码 //mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); //Log.d("jereh","电话被拦截"); //stopCall(); //mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//恢复铃声 //} //}elseif(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){ //接起电话 //recordCall();//开始录音 //}elseif(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){ //stopCall();//停止录音 //} //方法2 //设置一个监听器,监听电话状态 tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE); } returnsuper.onStartCommand(intent,flags,startId); } /** *挂断电话 */ privatevoidstopCall(){ try{ //Android的设计将ServiceManager隐藏了,所以只能使用反射机制获得。 Methodmethod=Class.forName("android.os.ServiceManager").getMethod("getService",String.class); IBinderbinder=(IBinder)method.invoke(null,newObject[]{"phone"});//获得系统电话服务 ITelephonytelephoney=ITelephony.Stub.asInterface(binder); telephoney.endCall();//挂断电话 stopSelf();//停止服务 }catch(Exceptione){ e.printStackTrace(); } } PhoneStateListenerlistener=newPhoneStateListener(){ @Override publicvoidonCallStateChanged(intstate,StringincomingNumber){ switch(state){ //手机空闲了 caseTelephonyManager.CALL_STATE_IDLE: stopCall();//停止录音 break; //接起电话 caseTelephonyManager.CALL_STATE_OFFHOOK: recordCall();//开始录音 break; //响铃时 caseTelephonyManager.CALL_STATE_RINGING: Log.e("jereh","来电号码是:"+incomingNumber); //如果该号码属于黑名单 if(incomingNumber.equals("123456")){ //如果是黑名单,就进行屏蔽 stopCall(); } break; } } }; /** *停止录音 */ privatevoidstopRecord(){ if(recording){ recorder.stop(); recorder.release(); recording=false; stopSelf();//停止服务 } } /** *电话录音 */ privateMediaRecorderrecorder; privatebooleanrecording; privatevoidrecordCall(){ Log.d("jereh","recordcalling") if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ recorder=newMediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//读麦克风的声音 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置输出格式 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//编码方式 Filefile=newFile(Environment.getDownloadCacheDirectory().getAbsolutePath(),"recorder"); if(!file.exists()){ file.mkdir(); } recorder.setOutputFile(file.getAbsolutePath()+"/" +System.currentTimeMillis()+"3gp");//存放的位置是放在sd卡recorder目录下 try{ recorder.prepare(); recorder.start(); recording=true; }catch(IOExceptione){ e.printStackTrace(); } } } @Override publicIBinderonBind(Intentintent){ thrownewUnsupportedOperationException("Notyetimplemented"); } } 复制代码 ServiceXML配置 <service android:name=".ListenPhoneService" android:enabled="true" android:exported="true"> </service> 五、***别忘了一些权限的设置 <!--添加访问手机电话状态的权限--> <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/> <!--拨打电话权限--> <uses-permissionandroid:name="android.permission.CALL_PHONE"/> <!--监听手机去电的权限--> <uses-permissionandroid:name="android.permission.PROCESS_OUTGOING_CALLS"/> <!--在SDCard中创建与删除文件权限--> <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!--往SDCard写入数据权限--> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

优秀的个人博客,低调大师

《从知识库到本体驱动应用》第12招 角色与应用地图 Who Should Use It——不是所有人都需要从同一个项目开始

最近很多团队导入一套面向制造业的知识体系,仓库一打开就是九个项目。很多人习惯从第一个开始往下啃,两周后卡在第二个仓库,然后不了了之。我是老李,做过多年企业架构和制造现场改造,见过太多类似场景。问题不是资料不好,而是入口错了。同一条技术路线,对不同角色价值并不一样,学习顺序也不该一样。今天聊聊怎么按自己的位置进入这套体系,而不是把九个仓库当成九本必须读完的书。

优秀的个人博客,低调大师

大容量档案库房多节点温湿度传感器组网方案与网络拓扑选型实践

大容量档案库房跟普通机房、实验室完全不是一个量级。普通机房几百平米、几十个监测点;大容量档案库房动辄几千到上万平米,密集架一排排像迷宫,监测点轻松破千。更要命的是档案库房对温湿度的均匀性要求极高——库房内任意两点温差不能超过 ±2℃,湿度偏差不超过 ±5%RH,否则纸张老化速度会指数级上升。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册