上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去.

当然了,需要权限的.

尝试做了个雏形出来.

界面如下:

主要代码如下:

package jason.teacher;

import java.lang.reflect.Method;

import java.util.HashMap;

import java.util.List;

import android.app.Activity;

import android.content.Context;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.os.Bundle;

import android.telephony.PhoneStateListener;

import android.telephony.SmsManager;

import android.telephony.TelephonyManager;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import com.android.internal.telephony.ITelephony;

public class MainActivity extends Activity {

public final static String TAG = "jason.com";

TelephonyManager tpm;

String num;//存储来电号码

Button end;//退出按钮

EditText sms;//回复短信的内容编辑框

SharedPreferences sp;

int count = 0;//来电总数

int peo = 0;//来电的号码个数,跟来电总数有区别,这个不包括重复来电,

TextView counttext;//拦截数量通知的显示

HashMap numMap;//用来存储来电号码

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

sp = this.getSharedPreferences("SP", MODE_PRIVATE);

counttext = (TextView) findViewById(R.id.count);

sms = (EditText) findViewById(R.id.sms);

end = (Button) findViewById(R.id.start);

numMap = new HashMap();

if(sp.getString("sms", null) != null){

sms.setText(sp.getString("sms", "我现在正在上课,一会儿下课了联系你"));

}

tpm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);//获取电话通讯服务

tpm.listen(new MyPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);//给电话服务增加状态监听器,监听来电,通话,挂断等状态

end.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Editor editor = sp.edit();

editor.putString("sms", sms.getText().toString());

editor.commit();//这里是默认自动保存用户编辑过的回复短信内容的,

finish();

}

});

}

class MyPhoneStateListener extends PhoneStateListener {

@Override

public void onCallStateChanged(int state, String incomingNumber) {

num = incomingNumber;

switch(state) {

case TelephonyManager.CALL_STATE_IDLE: //空闲

break;

case TelephonyManager.CALL_STATE_RINGING: //来电

endCall();//自动挂断

if(!numMap.containsKey(num)){//如果之前没有来电,则把这个号码加入已经来电过的列表

sendMes();

numMap.put(num, null);

peo ++;

updateUi();//更新来电数目

}

break;

case TelephonyManager.CALL_STATE_OFFHOOK: //摘机(正在通话中)

break;

}

}

private void updateUi(){

if(count > 0){

counttext.setVisibility(View.VISIBLE);

}

counttext.setText("已拒接" + count + "个来电,共" + peo +"个人联系过您,请到通话记录查看");

}

private void endCall()//估计这里是唯一有点难度的,用到了java的反射

{

Class c = TelephonyManager.class;

try

{

Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);

getITelephonyMethod.setAccessible(true);

ITelephony iTelephony = null;

iTelephony = (ITelephony) getITelephonyMethod.invoke(tpm, (Object[]) null);

iTelephony.endCall();

count ++;

updateUi();

}

catch (Exception e)

{

Log.e(TAG, "Fail to answer ring call.", e);

}

}

private void sendMes(){

//直接调用短信接口发短信

SmsManager smsManager = SmsManager.getDefault();

List divideContents = smsManager.divideMessage(sms.getText().toString());

for (String text : divideContents) {

smsManager.sendTextMessage(num, null, text, null, null);

}

}

}

}

这里解释一下,在android在1.1版本后就已经把Phone类的相关API给隐藏起来了,想要用代码实现挂断电话的功能,就必须通过AIDL才行,然后利用反射来使用其方法。

第一步:在程序中新建一个包,包名必须为:com.android.internal.telephony,因为要使用aidl。

第二步:在这个包里面新建一个名为ITelephony.aidl的文件,然后在文件里面写入代码:

package com.android.internal.telephony;

interface ITelephony{

boolean endCall();

void answerRingingCall();

}

这样就可以通过如下代码进行进一步获取拒接电话的api的操作了.

private void endCall()

{

Class c = TelephonyManager.class;

try

{

Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);

getITelephonyMethod.setAccessible(true);

ITelephony iTelephony = null;

iTelephony = (ITelephony) getITelephonyMethod.invoke(tpm, (Object[]) null);

iTelephony.endCall();

count ++;

updateUi();

}

catch (Exception e)

{

Log.e(TAG, "Fail to answer ring call.", e);

}

}

还有就是别忘了加权限,否则是一点效果都没有的.

不过有一点不解的是在这里没有用到打电话的权限,但是如果不加

的话,来电话的时候竟然不会进行挂断操作,尝试了好几次都是如此,最后只能再把这个权限加上,虽然在我看来完全没用,安装的时候还会让人觉得你这个应用会不会偷偷打电话啊.

当然了,这个完全可以做成后台服务的形式,不过老师就是上课才用,也没那么多要求,如果继续丰富一下,还是比较实用的.

作者:jason0539

android 来电拒接_[置顶] android开发之来电自动拒接并自动回复短信_上课模式app...相关推荐

  1. android之来电自动拒接并自动回复短信_上课模式app

    上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去. 当然了,需要权限的. 尝试做了个雏形出来. 界面如下: 主要代码如下: pac ...

  2. android开发之来电自动拒接并自动回复短信_上课模式app

    上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去. 当然了,需要权限的. 尝试做了个雏形出来. 界面如下: 主要代码如下: pac ...

  3. android布局置顶_[置顶] Android系统五大布局详解Layout

    我们知道Android系统应用程序一般是由多个Activity组成,而这些Activity以视图的形式展现在我们面前,视图都是由一个一个的组件构成的.组件就是我们常见的Button.TextEdit等 ...

  4. java 置顶_[置顶]java开发之基础篇2

    一.java开发环境的搭建 下载和安装jdk.版本自己看着办! 1 JAVA_HOME C:\Program Files\Java\jdk1.7.0_25 2 path C:\Program File ...

  5. python钉钉自动打卡_用Python来实现钉钉自动打卡并发送邮件短信提醒

    用Python来实现钉钉自动打卡并发送邮件短信提醒 自从用钉钉打卡,老忘记打,只会python语言,所以用Python写了一个自动跑的脚本,每天定时跑.这样就避免忘记了. 之后把adb.exe所在的文 ...

  6. android listview标题置顶,Android仿QQ左滑删除置顶ListView操作

    最近闲来无事,于是研究了一下qq的左滑删除效果,尝试着实现了一下,先上效果图: 大致思路原理: - 通过设置margin实现菜单的显示与隐藏 - 监听onTouchEvent,处理滑动事件 上代码 i ...

  7. [置顶] Android自定义控件 芝麻信用分雷达图

    [置顶] Android自定义控件 芝麻信用分雷达图 标签: android自定义雷达芝麻信用 2016-10-23 20:11  3548人阅读  评论(24)  收藏  举报   分类: 自定义控 ...

  8. android 发短信带链接,Android 点击Url(短信链接)打开App

    前言 先说一下要实现的效果吧: 在产品运营过程中时常会有一些消息或者活动通知到用户,且需要唤醒沉睡的用户 综合考量之下决定选用通过短信发送一条活动链接,通过点击这条链接可以直接跳转到我们的APP 用户 ...

  9. android列表实现置顶,Android利用RecyclerView实现全选、置顶和拖拽功能示例

    Android利用RecyclerView实现全选.置顶和拖拽功能示例 发布时间:2020-08-23 16:26:42 来源:脚本之家 阅读:159 作者:爱开发 前言 今天给大家分享是如何在Rec ...

最新文章

  1. python3+selenium调用浏览器驱动时报错的解决方法
  2. wayland与linux_将Linux与Wayland一起使用? 您需要知道的 | MOS86
  3. java 递归 堆栈_Java中的堆栈安全递归
  4. ln: failed to create symbolic link ‘/usr/bin/mysql’: File exists
  5. ncurses窗口机制:newwin(),wprintw(),delwin(),box(),wborder(),
  6. 被高估了的测试驱动开发?
  7. AWS 技术峰会真的50%都是技术
  8. 【Python】调用WPS V9 API,实现Word转PDF
  9. 图说设计模式-结构型设计模式笔记
  10. GHOST XP SP3 遐想网络 纯净驱动预览版 2.0
  11. flutter11 - 调试程序
  12. 为什么中国神仙比较负责任?
  13. element ui 兼容低版本浏览器
  14. Rotator和Vector之间的转换
  15. 如果我们现在要做一个库存盘点的系统,你怎么设计表结构,设计哪些表
  16. 勇者与羁绊 游戏开发日志(一)
  17. Python实例1—打印购物小票
  18. UCI数据集和源代码数据挖掘的数据集资源
  19. 图解最常用的10个机器学习算法
  20. Boom 3D序列号授权超赞的音效增强及播放工具

热门文章

  1. 火狐浏览器安全常用插件简介
  2. Java实现求2的100次方
  3. 计算机知识的表格,【计算机知识】Excel表格公式大全
  4. 华为的全局复制怎么用不了了_史上最强大复制神器>全局复制来了
  5. 刷脸支付大环境趋势决定格局
  6. MYSQL导入数据列名有空格处理办法
  7. 跨越汽车智能化鸿沟,平台级领导者Apollo的解法
  8. 基于layui框架的登录验证
  9. 壁纸小程序云开发 -- 分享心得
  10. 幂律分布现象-power-law