android 来电拒接_[置顶] android开发之来电自动拒接并自动回复短信_上课模式app...
上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个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...相关推荐
- android之来电自动拒接并自动回复短信_上课模式app
上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去. 当然了,需要权限的. 尝试做了个雏形出来. 界面如下: 主要代码如下: pac ...
- android开发之来电自动拒接并自动回复短信_上课模式app
上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去. 当然了,需要权限的. 尝试做了个雏形出来. 界面如下: 主要代码如下: pac ...
- android布局置顶_[置顶] Android系统五大布局详解Layout
我们知道Android系统应用程序一般是由多个Activity组成,而这些Activity以视图的形式展现在我们面前,视图都是由一个一个的组件构成的.组件就是我们常见的Button.TextEdit等 ...
- java 置顶_[置顶]java开发之基础篇2
一.java开发环境的搭建 下载和安装jdk.版本自己看着办! 1 JAVA_HOME C:\Program Files\Java\jdk1.7.0_25 2 path C:\Program File ...
- python钉钉自动打卡_用Python来实现钉钉自动打卡并发送邮件短信提醒
用Python来实现钉钉自动打卡并发送邮件短信提醒 自从用钉钉打卡,老忘记打,只会python语言,所以用Python写了一个自动跑的脚本,每天定时跑.这样就避免忘记了. 之后把adb.exe所在的文 ...
- android listview标题置顶,Android仿QQ左滑删除置顶ListView操作
最近闲来无事,于是研究了一下qq的左滑删除效果,尝试着实现了一下,先上效果图: 大致思路原理: - 通过设置margin实现菜单的显示与隐藏 - 监听onTouchEvent,处理滑动事件 上代码 i ...
- [置顶] Android自定义控件 芝麻信用分雷达图
[置顶] Android自定义控件 芝麻信用分雷达图 标签: android自定义雷达芝麻信用 2016-10-23 20:11 3548人阅读 评论(24) 收藏 举报 分类: 自定义控 ...
- android 发短信带链接,Android 点击Url(短信链接)打开App
前言 先说一下要实现的效果吧: 在产品运营过程中时常会有一些消息或者活动通知到用户,且需要唤醒沉睡的用户 综合考量之下决定选用通过短信发送一条活动链接,通过点击这条链接可以直接跳转到我们的APP 用户 ...
- android列表实现置顶,Android利用RecyclerView实现全选、置顶和拖拽功能示例
Android利用RecyclerView实现全选.置顶和拖拽功能示例 发布时间:2020-08-23 16:26:42 来源:脚本之家 阅读:159 作者:爱开发 前言 今天给大家分享是如何在Rec ...
最新文章
- python3+selenium调用浏览器驱动时报错的解决方法
- wayland与linux_将Linux与Wayland一起使用? 您需要知道的 | MOS86
- java 递归 堆栈_Java中的堆栈安全递归
- ln: failed to create symbolic link ‘/usr/bin/mysql’: File exists
- ncurses窗口机制:newwin(),wprintw(),delwin(),box(),wborder(),
- 被高估了的测试驱动开发?
- AWS 技术峰会真的50%都是技术
- 【Python】调用WPS V9 API,实现Word转PDF
- 图说设计模式-结构型设计模式笔记
- GHOST XP SP3 遐想网络 纯净驱动预览版 2.0
- flutter11 - 调试程序
- 为什么中国神仙比较负责任?
- element ui 兼容低版本浏览器
- Rotator和Vector之间的转换
- 如果我们现在要做一个库存盘点的系统,你怎么设计表结构,设计哪些表
- 勇者与羁绊 游戏开发日志(一)
- Python实例1—打印购物小票
- UCI数据集和源代码数据挖掘的数据集资源
- 图解最常用的10个机器学习算法
- Boom 3D序列号授权超赞的音效增强及播放工具