黑科技小demo,实现定时自动打电话,挂断电话
好久没写博客了,实在是太忙了,又鉴于鄙人天生爱睡觉。幸运的是,上周终于把自己的第一个Apk写好了,,接下来,就写个小系列来记录一下吧。不过,在此之前,先把这篇黑科技写起来(研究了小段时间,确实好玩)。
原理思路:1、利用alarm机制来定时
2、利用广播,启动新的Activity拨打电话
3、利用反射机制,取得手机状态,接通后一定时间挂断
先上图片吧
接下来上详细的代码块:
一、点设置之后会有一个timepickDialog弹出,用来设置AlarmClock的启动时间
btnSettting.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {c.setTimeInMillis(System.currentTimeMillis());new TimePickerDialog(MainActivity.this,new OnTimeSetListener() {@Overridepublic void onTimeSet(TimePicker view,int hourOfDay, int minute) {clockHour = hourOfDay;clockMinute = minute;phoneTime.setText(clockHour + " : "+ clockMinute);}}, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE),true).show();}});
分析:还是很好理解的,clockHour和clockMinute分别用来记录拨打的小时、分钟
二、通过PendingIntent结合Alarm来定时启动广播
btnStart.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);Calendar calendar = Calendar.getInstance();intent = new Intent(MainActivity.this, PhoneBroadcast.class);intent.putExtra("phoneNumber", phoneNumber.getText().toString());pIntent = PendingIntent.getBroadcast(MainActivity.this, 0,intent, 0);calendar.setTimeInMillis(System.currentTimeMillis());calendar.set(Calendar.HOUR_OF_DAY, clockHour);calendar.set(Calendar.MINUTE, clockMinute);calendar.set(Calendar.SECOND, 0);calendar.set(Calendar.MILLISECOND, 0);alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), DURATION_TIME, pIntent);Toast.makeText(MainActivity.this,"已启动,时间是" + clockHour + " : " + clockMinute,Toast.LENGTH_SHORT).show();}});
分析:这边也比较好理解,主要是用到AlarmManager类来管理闹钟,取得实例后,setRepeating方法来设置闹钟。四个参数分别为,闹钟模式(4种,可百度),闹钟启动时间,重复间隔,PendingIntent。
自定义的BroadCast
public class PhoneBroadcast extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {Intent intent2=new Intent(context, PhoneActivity.class);intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent2.putExtra("phoneNumber",intent.getStringExtra("phoneNumber") );context.startActivity(intent2);}}
用来启动打电话的Activity
第三步:难点
这边有点复杂的,老实说我并没有完全弄懂
ITelephony这个接口不能直接用的。需要先在src下
新建包com.android.internal.telephony,在其中新建一个File,后缀为aidl(它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口),内容如下
package com.android.internal.telephony;
interface ITelephony{
boolean endCall();
void answerRingingCall();
}
这之后会在gen目标下生成对应java文件(你无法修改,但是可以用ITelephoney接口了)
回到打电话的Activity,先上代码。
package com.dota.example.autophoneapp;import java.lang.reflect.Method;import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.WindowManager;import com.android.internal.telephony.ITelephony;public class PhoneActivity extends Activity {private ITelephony itelephony;private TelephonyManager manager;public Handler mHandler;private Thread mThread;private static final int END_CALL_REQUEST = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_phone);getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);Intent intent = getIntent();String phoneNumber = intent.getStringExtra("phoneNumber");Intent intentPhone = new Intent(Intent.ACTION_CALL);intentPhone.setData(Uri.parse("tel:" + phoneNumber));startActivity(intentPhone);phoner();mHandler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case END_CALL_REQUEST:try {itelephony.endCall();finish();} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;default:break;}}};mThread=new NewThread();manager.listen(new PhoneStateListener() {@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);try {switch (state) {case TelephonyManager.CALL_STATE_OFFHOOK:mThread.start();break;default:break;}} catch (Exception e) {// TODO: handle exception}}}, PhoneStateListener.LISTEN_CALL_STATE);}public void phoner() {manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);Class<TelephonyManager> class1 = TelephonyManager.class;Method getITelephonyMethod = null;try {getITelephonyMethod = class1.getDeclaredMethod("getITelephony",(Class[]) null);getITelephonyMethod.setAccessible(true);itelephony = (ITelephony) getITelephonyMethod.invoke(manager,(Object[]) null);} catch (Exception e) {// TODO: handle exception}}class NewThread extends Thread implements Runnable {@Overridepublic void run() {super.run();try {Thread.sleep(1000*20);Message message = new Message();message.what = END_CALL_REQUEST;mHandler.sendMessage(message);} catch (Exception e) {// TODO: handle exception}}}
}
来,慢慢分析。先从pnoner()方法入手。这里用到反射的方法,得到TelephonyManager类中的getITelephony方法,将其设置为可操作。
设置电话的监听器
manager.listen(new PhoneStateListener() {@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);try {switch (state) {case TelephonyManager.CALL_STATE_OFFHOOK:mThread.start();break;default:break;}} catch (Exception e) {// TODO: handle exception}}}, PhoneStateListener.LISTEN_CALL_STATE);
三种状态:RINGING(振铃)、OFFHOOK(摘机=接通)、IDLE(空闲)
这边用到Hander Message(异步线程处理的原理),接受到状态后,启动线程,sleep20秒,执行
itelephony.endCall();
即:挂断
还有两块简单说一下:这是用来锁屏时,点亮屏幕并在锁状态下显示的方法(英语很清晰明了的)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
这段是用来打电话的:打电话是ACTION_CALL,设置拨打的号码为Uri.parse("tel:10086");
String phoneNumber = intent.getStringExtra("phoneNumber");Intent intentPhone = new Intent(Intent.ACTION_CALL);intentPhone.setData(Uri.parse("tel:" + phoneNumber));startActivity(intentPhone);
还有一些不重要的就不写了,代码里可以看到,还是很有意思的(最终我被朋友拉黑了)
源代码的百度云链接:http://pan.baidu.com/s/1i3kWH85
黑科技小demo,实现定时自动打电话,挂断电话相关推荐
- 缺氧游戏黑科技计算机,《缺氧》怎么生存?缺氧bug黑科技小技巧使用方法一览...
<缺氧>怎么生存?缺氧bug黑科技小技巧使用方法一览 2017-02-25 10:25:19来源:缺氧游戏吧编辑:君辞-v-评论(0) <缺氧>面向各位玩家开放之后,很多玩家都 ...
- 我花了3天时间整理出这5款黑科技小程序,值得你们玩上一整天
我花了3天时间整理出这5款黑科技小程序,值得你们玩上一整天 1.天天练英语口语 帮助你利用每天碎片时间练习口语的小程序,有不同的学习主题,可以选择每天一句名言或者每天一个词汇,积少成多,你还可以将不认 ...
- 5款黑科技小程序,便利我们的生活,每一款都实用到无法自拔!
现在手机的内存频频告急,越来越多的APP占据我们手机的大部分内存,其实,有些微信小程序完全可以替代原生APP的功能,而且还不用下载安装,用完即走,可以说是非常方便了,今天就来聊聊五款实用的黑科技小程序 ...
- android 自动挂断,android实现接通和挂断电话
本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下 关键代码:[PhoneUtils类] package com.ebupt.phonerecorddemo.se ...
- 【Python黑科技】制作一个定时小闹钟,自动发送系统通知提示(保姆级图文+实现代码)
目录 实现效果 图片素材和源码 实现思路 实现代码 总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列,持续更新中 实现效果 图片素材和源码 已经上传至我 ...
- 微软Win10这些黑科技小功能你都用过吗
本文转载自IT之家,Win10 已经发布好一段时间了,在今年下半年还将会迎来 21H2 的大更新.当前,很多朋友对于 Win10 其实是有所不满的,割裂的 UI.经常变动的功能,让人感觉这就是一个半成 ...
- android 自己写挂电话,MTK Android 如何自动挂断电话
//拨打电话,并定时60S对方未接听自动挂断 public voidCall() { Uri localUri = Uri.parse("tel:" + mPhoneNumber[ ...
- android自动接听和挂断电话
实现android自动接听和挂断电话功能.代码如下: 添加权限 <uses-permission android:name="android.permission.CALL_PHONE ...
- 黑科技小程序,无需前台登记直接刷脸秒住酒店!
相信大家都有过出去住酒店略不爽的经历,就是在酒店前台办理入住或退房要等不少时间,人多的时候还要等更久.因为前台需要确认你的入住订单,没问题了再刷脸登记身份证信息,最后再看哪间房空出来了给你安排上,有时 ...
最新文章
- 整理Simple.Data使用方法
- python和C语言分别实现插入排序
- 敏捷外包工程系列之二:人员结构(敏捷外包工程,敏捷开发,产品负责人,客户价值)...
- 单向链表反转-JS实现
- laravel sql_mode 严格模式
- 加密日记 android,Lifeograph加密日记应用程序
- 【FPGA与深度学习】基于FPGA的深度学习CNN加速器设计
- C语言之输出孪生素数
- 如何在CSDN中发表博客
- 数据仓库中元数据的定义、用途及元数据的分类。
- node封装一个图片拼接插件
- 苹果手机有护眼模式吗_玩手机还能护眼?用这 2 款 App,可能比开深色模式更有效...
- 为什么我的订单管理里没有发货按钮?
- 简明扼要阐述synchronized和lock的区别
- 面向对象封装案例 --- 士兵突击
- Vue:vue2.0和vue3.0同时存在
- 【我的区块链之路】- 谈一谈IPFS原理及玩法
- 基于ARCGIS二次开发可视化开发环境搭建(JAVA)
- 随笔---XXXIII
- 本地宝js爬虫(附代码)