上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个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<String, String> numMap;//用来存储来电号码@Overridepublic 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<String, String>();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() {@Overridepublic void onClick(View v) {Editor editor = sp.edit();editor.putString("sms", sms.getText().toString());editor.commit();//这里是默认自动保存用户编辑过的回复短信内容的,finish();}});}class MyPhoneStateListener extends PhoneStateListener {@Overridepublic 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<TelephonyManager> 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<String> 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<TelephonyManager> 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);  }          }  

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

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

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

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

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

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

作者:jason0539

微博:http://weibo.com/2553717707

博客:http://blog.csdn.net/jason0539(转载请说明出处)

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

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

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

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

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

  3. Android开发 亲测可用--多种方式获取手机短信验证码自动填入

    Android开发 静态注册.动态注册.短信中心库监控获取手机验证码,自动复制到剪切板或或填入输入框. 友情提醒初学者:这是广播接收器的类,写在xml中静态注册或写在启动类的Oncreate方法下动态 ...

  4. android开发笔记之锁屏界面未读短信未接来电提醒(android 4.4)

    客户需求 最近在做一个项目,android 4.4系统,客户要求在锁屏界面有未读短信未接来电的提醒功能.而平台没有此功能,要自己实现.并且时间非常紧,---.(其实软件工程师基本上都是这样,坑,坑,坑 ...

  5. android查询未读短信,Android实现获取未接来电和未读短信数量的方法

    本文实例展示了Android实现获取未接来电和未读短信数量的方法,在Android程序开发中非常常见,是非常实用的功能,现分享给大家供大家参考.具体如下: 一.未读短信 首先注册Observer,当有 ...

  6. wp8 导出短信 到android,如何从outlook同步联系人头像以及管理短信呢

    1. 无网络的情况下如何同电脑同步通讯录? (不是导入,请不要让我导出csv)  只是添加,编辑个别打电话, 可以做个类似以前的activesync的连接器吗? 这个连接器太强大了.搞不明白为什么你们 ...

  7. android接听ios电话,教程】教你用电脑连接 iPhone 、 Android ,在电脑上接打电话、收发短信。...

    原标题:教程]教你用电脑连接 iPhone . Android ,在电脑上接打电话.收发短信. 你有「手机依赖症」吗?相信大家对自己的手机都是机不离手,眼不离机吧~那么在办公或者学习的时间里,怎么不接 ...

  8. 某校教务管理系统post分析,Python实现自动查询成绩并发送短信

    某校教务管理系统post分析,Python实现自动查询成绩并发送短信 前言 本人是一名大三大学生,考完试不久,由于自己不知道期末考试什么时候出考试成绩,并且每次查询成绩特别麻烦(首先得登录VPN连接学 ...

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

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

最新文章

  1. 量子计算,后摩尔时代计算能力提升的解决方案
  2. 打成jar包_keras, tensorflow模型部署通过jar包部署到spark环境攻略
  3. 你知道现在的.net是什么样的吗,一张图告诉你
  4. 关于Latex一个简单例子
  5. 为 Python Web App 编写 Dockerfiles
  6. cad lisp 背景遮罩_给文字批量添加边界偏移因子为1.1(或其他值)的背景遮罩的源程序(有详细注解)...
  7. 删表出现mysql错误1051_无法删除mySQL表. (错误1050)
  8. HMM前向算法,维比特算法,后向算法,前向后向算法代码
  9. Spring 整合 Mybatis
  10. 9个offer,12家公司,35场面试,从微软到谷歌,我的求职之路!
  11. Banner设计技巧总结
  12. SQL server卸载软件(可修复注册表)
  13. NOIP2017大总结
  14. Matlab绘制多组柱状图的方法(可直接复制)
  15. CVPR ECCV ICCV 计算机视觉顶会论文下载
  16. (转)对冲基金:AQR合伙人:“沉闷”股票回报更好
  17. 【语义地图】Ubuntu18.04 Suma++代码配置运行
  18. Java基础--object类详解
  19. mysql无法执行二进制文件_kail系统64,mysql64,出现-bash: bin/mysqld: 无法执行二进制文...
  20. SpringMVC基础学习之Restful风格的简单使用

热门文章

  1. bugku 做个游戏
  2. c 语言桌面应用开发,用Go语言开发桌面应用--By TSL
  3. Luch简介— Android上的BLE信标扫描新库
  4. Python 下载无水印的短视频
  5. 《开发Microsoft Visio解决方案》学习总结
  6. tensorflow读取jpg格式图片报错 ValueError: Only know how to handle extensions: ['png']; with Pillow installed
  7. iOS后台定位,实时向服务器发送最新位置
  8. 商业智能BI工具Qlik入门第二步:创建可视化、数据权限管理和发布
  9. delphi cef4Delphi CEF binaries missing !
  10. R720蓝牙突然消失解决方案