Service:服务,可以理解成一个运行再后台没有界面的Activity,集成于Seriver,是四大组件之一

Service的继承关系:Service-->ContextWrapper-->Context  (与activity一样,都继承与ContextWrapper);

生命周期:Context.startSeriver() 方法开启服务:onCreate()-->onStartCommand()-->onDestory();

    第一次开启服务,服务会执行onCreate()-->onStartCommand();(开启之后再开启服务,不会执行onCreate()方法);

     Context.bindSeriver() 方法开启服务:onCreate()-->onBind()-->onUnbind()-->重载的方法返回true-->Rebind()-->onDestory();

开启 :

   方式一:startService();

   方式二:bindService();

停止:

  方式一:stopService();

  方式二:unBind();

下面开始我们的来电监听:

实现创建一个类继承与Seriver:

 public class MyService extends Service {
     //创建一个录音机的实例
     MediaRecorder recorder = null;
     //绑定服务
     @Nullable
     @Override
     public IBinder onBind(Intent intent) {
         return null;
     }

     //解绑服务
     @Override
     public void unbindService(ServiceConnection conn) {
         super.unbindService(conn);
     }

     //重新绑定服务
     @Override
     public void onRebind(Intent intent) {
         super.onRebind(intent);
     }

     //创建一个Service 第一次开启的时候
     @Override
     public void onCreate() {
         Log.i("wei","onCreate");
         TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
         tm.listen(new MyPhoneStateSeriverListener(),PhoneStateListener.LISTEN_CALL_STATE);
         super.onCreate();

     }

     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
         Log.i("wei","onStartCommand");
         return super.onStartCommand(intent, flags, startId);
     }

     @Override
     public void onDestroy() {
         super.onDestroy();
         Log.i("wei","onDestroy");
     }
     private class MyPhoneStateSeriverListener extends PhoneStateListener{
         @Override
         public void onCallStateChanged(int state, String incomingNumber) {
             switch (state){
                 case TelephonyManager.CALL_STATE_IDLE://空闲状态
                     if (recorder!=null){
                         recorder.stop();
                         recorder.reset();
                         recorder.release();
                     }
                     break;
                 case TelephonyManager.CALL_STATE_OFFHOOK://接听状态
                     recorder.start();//开始录音
                     break;
                 case TelephonyManager.CALL_STATE_RINGING://响铃状态
                     recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);//设置音频的来源  MIC只能录单方的,VOICE_CALL可以录双方的
                     recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置音频的输出格式
                     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频的编码方式
                     recorder.setOutputFile("/mnt/sdcard/luyin.3gp");//设置录音文件的存储位置
                     try {
                         recorder.prepare();//准备录音
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                     break;
             }
             super.onCallStateChanged(state, incomingNumber);
         }
     }
 }

Manifest.xml配置:

 <uses-permission android:name="android.permission.RECORD_AUDIO"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />

报错,空指针异常。

   

Service之来电监听(失败的案例)的更多相关文章

  1. Android来电监听和去电监听

    我觉得写文章就得写得有用一些的,必须要有自己的思想,关于来电去电监听将按照下面三个问题展开 1.监听来电去电有什么用? 2.怎么监听,来电去电监听方式一样吗? 3.实战,有什么需要特别注意地方? 监听 ...

  2. nodejs 80端口监听失败及NODE_PATH不起作用的问题

    nodejs做web服务器,打开80时报错:Error: listen EACCES 0.0.0.0:80 80端口监听失败,是因为1024以下的端口需要root权限,需要sudo或su之后执行.但这 ...

  3. android 呼入电话的监听(来电监听)转

    需要权限: <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 方式一:通过广 ...

  4. ios应用来电监听

    先导入这两个头文件,库文件不用导可以 #import <CoreTelephony/CTCallCenter.h> #import <CoreTelephony/CTCall.h&g ...

  5. browser-sync 文件监听失败的解决方案

    问题 为了方便实时预览前端开发过程中修改源码后的页面,我在全球最大的同性交友网Github中找到了一个非常实用的工具,browser-sync. 安装使用方式请自行到官网https://browser ...

  6. 记一次使用 removeEventListener 移除事件监听失败的经历

    测试一 测试代码如下 var Test = function() { this.element = document.body; this.handler = function() { console ...

  7. Android来电监听

    本文实现来电自动接听,自动录音,自动回拨功能. public class MainActivity extends Activity { @Override protected void onCrea ...

  8. 第八章 watch监听 83 名称案例-使用watch监听文本框数据的变化

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  9. 启动独立的tomcat服务器,没有自动创建ServletContext,对Context生命周期的监听失败

    1.可能web.xml文件里对ContextListener没有进行配置 2.web.xml文件有关对ContextListener的配置,出现了错误的单词拼写问题 比如 <listener&g ...

随机推荐

  1. QT学习第2天

    回顾: 1.构建一个QT工程步骤 (1)qmake -project (2)qmake (3)make   2.两个常用的组件 QLabel 标签 QPushButton 按钮   --------- ...

  2. x01.Lab.StoreApp: XP 停服,微软变脸

    变脸,川剧的一种表演形式,除了哄哄小孩,似乎别无用处.而川剧变脸从业者何其多也,存在时间何其长也.以如此多的从业者,如此长的时间,来进行科研,其成果一定是斐然吧.推而广之,试问天下谁能敌! 微软变脸, ...

  3. Arch Linux sudo: PAM authentication error: Module is unknown [Solved!]

    问题描述: 我的 Arch Linux 已经用了快半年多,由于 Arch Linux 的滚挂问题,我从没有直接升级过系统.软件版本以及库自然落后了一些. 就在我准备需要用到 NFS 时,挂载网络文件系 ...

  4. hdu 5057 Argestes and Sequence(分块算法)

    Argestes and Sequence Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  5. linux线程同步(1)-互斥量

    一.概述                                                   互斥量是线程同步的一种机制,用来保护多线程的共享资源.同一时刻,只允许一个线程对临界区进行 ...

  6. Linux shell if [ -n ] 正确使用方法

    if [ str1 = str2 ]  当两个串有相同内容.长度时为真 if [ str1 != str2 ] 当串str1和str2不等时为真 if [ -n str1 ] 当串的长度大于0时为真( ...

  7. 13款经典BI项目报表&界面风格设计方案

    说明 1.方案取自报表开发工具FineReport案例的配色方案 2.所有设计方案图中已标注了字体.颜色与间隔距离等,可直接调用. 报表&界面风格设计方案展示 灰蓝界面 绿色与金色 蓝绿清新风 ...

  8. [转]VS2010中如何创建一个WCF

    本文转自:http://www.cnblogs.com/zhangliangzlee/archive/2012/08/28/2659701.html 转载:http://www.cnblogs.com ...

  9. [转]html5 js 访问 sqlite 数据库的操作类

    本文转自:http://blog.csdn.net/tsxw24/article/details/7613815 webkit 核心的浏览器提供了 3个 api接口,用于访问本地sqlite数据,但使 ...

  10. VIJOS P1037搭建双塔[DP]

    描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔. Mr. F有N块水晶,每块 ...