好久没写博客了,实在是太忙了,又鉴于鄙人天生爱睡觉。幸运的是,上周终于把自己的第一个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,实现定时自动打电话,挂断电话相关推荐

  1. 缺氧游戏黑科技计算机,《缺氧》怎么生存?缺氧bug黑科技小技巧使用方法一览...

    <缺氧>怎么生存?缺氧bug黑科技小技巧使用方法一览 2017-02-25 10:25:19来源:缺氧游戏吧编辑:君辞-v-评论(0) <缺氧>面向各位玩家开放之后,很多玩家都 ...

  2. 我花了3天时间整理出这5款黑科技小程序,值得你们玩上一整天

    我花了3天时间整理出这5款黑科技小程序,值得你们玩上一整天 1.天天练英语口语 帮助你利用每天碎片时间练习口语的小程序,有不同的学习主题,可以选择每天一句名言或者每天一个词汇,积少成多,你还可以将不认 ...

  3. 5款黑科技小程序,便利我们的生活,每一款都实用到无法自拔!

    现在手机的内存频频告急,越来越多的APP占据我们手机的大部分内存,其实,有些微信小程序完全可以替代原生APP的功能,而且还不用下载安装,用完即走,可以说是非常方便了,今天就来聊聊五款实用的黑科技小程序 ...

  4. android 自动挂断,android实现接通和挂断电话

    本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下 关键代码:[PhoneUtils类] package com.ebupt.phonerecorddemo.se ...

  5. 【Python黑科技】制作一个定时小闹钟,自动发送系统通知提示(保姆级图文+实现代码)

    目录 实现效果 图片素材和源码 实现思路 实现代码 总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列,持续更新中 实现效果 图片素材和源码 已经上传至我 ...

  6. 微软Win10这些黑科技小功能你都用过吗

    本文转载自IT之家,Win10 已经发布好一段时间了,在今年下半年还将会迎来 21H2 的大更新.当前,很多朋友对于 Win10 其实是有所不满的,割裂的 UI.经常变动的功能,让人感觉这就是一个半成 ...

  7. android 自己写挂电话,MTK Android 如何自动挂断电话

    //拨打电话,并定时60S对方未接听自动挂断 public voidCall() { Uri localUri = Uri.parse("tel:" + mPhoneNumber[ ...

  8. android自动接听和挂断电话

    实现android自动接听和挂断电话功能.代码如下: 添加权限 <uses-permission android:name="android.permission.CALL_PHONE ...

  9. 黑科技小程序,无需前台登记直接刷脸秒住酒店!

    相信大家都有过出去住酒店略不爽的经历,就是在酒店前台办理入住或退房要等不少时间,人多的时候还要等更久.因为前台需要确认你的入住订单,没问题了再刷脸登记身份证信息,最后再看哪间房空出来了给你安排上,有时 ...

最新文章

  1. 整理Simple.Data使用方法
  2. python和C语言分别实现插入排序
  3. 敏捷外包工程系列之二:人员结构(敏捷外包工程,敏捷开发,产品负责人,客户价值)...
  4. 单向链表反转-JS实现
  5. laravel sql_mode 严格模式
  6. 加密日记 android,Lifeograph加密日记应用程序
  7. 【FPGA与深度学习】基于FPGA的深度学习CNN加速器设计
  8. C语言之输出孪生素数
  9. 如何在CSDN中发表博客
  10. 数据仓库中元数据的定义、用途及元数据的分类。
  11. node封装一个图片拼接插件
  12. 苹果手机有护眼模式吗_玩手机还能护眼?用这 2 款 App,可能比开深色模式更有效...
  13. 为什么我的订单管理里没有发货按钮?
  14. 简明扼要阐述synchronized和lock的区别
  15. 面向对象封装案例 --- 士兵突击
  16. Vue:vue2.0和vue3.0同时存在
  17. 【我的区块链之路】- 谈一谈IPFS原理及玩法
  18. 基于ARCGIS二次开发可视化开发环境搭建(JAVA)
  19. 随笔---XXXIII
  20. 本地宝js爬虫(附代码)

热门文章

  1. 记录一次支付宝接口对接遇到的问题
  2. 全局变量 的全局有多大??
  3. 一卡通消费记录管理系统(c语言实现)
  4. 沿全尺寸模型水平轴 MHK 涡轮机(DOE RM1)叶片性能表征计算(Matlab代码实现)
  5. #21天学习挑战赛—深度学习实战100例#——验证码识别
  6. 江民科技创始人王江民:传奇一生
  7. mysql中的笛卡尔积与解决办法
  8. 丹青携手日本奇幻大师梦枕貘先生推出巨著《暗狩之师》中文版
  9. 基于ESP-01S的USB电压电流表
  10. SuperMap iPortal门户安全性最佳做法