文档章节

android 电话

塔塔米
 塔塔米
发布于 2013/12/30 19:40
字数 481
阅读 43
收藏 0

http://www.cfanz.cn/index.php?c=article&a=read&id=81089

首先感叹一下android强大,它可以把同一个apk里面得不同Actvity分别运行在不同的进程中,比如我想让自己的应用中Activity运行在Phone进程中,那么我需要做三个事情。 本文包含三个知识点: 1.监听去电接通 2.apk获取root权限 3. 运行时将apk push 到system/app (1) <activity android:process="com.android.phone" android:label="@string/app_name" android:name=".AutoCallActivity" > </activity> (2) <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.spreadst.drag" coreApp="true" android:sharedUserId="android.uid.system" android:versionCode="1" (3) LOCAL_PACKAGE_NAME := autocall #LOCAL_CERTIFICATE := shared LOCAL_CERTIFICATE := platform 为什么会有这个需求呢?TelephonyManager 中状态 只有 IDLE 空闲状态, 来电接通状态 ,拨打状态,没有去电接通状态,参考phone中得实现如下: Phone phone = PhoneFactory.getDefaultPhone(); 这个调用是不能运行在phone以外的进程中的,不信你可以试一下,请记住一个进程的主线程的looper是唯一的 原因如下: if (sLooper != Looper.myLooper()) { throw new RuntimeException( "PhoneFactory.getDefaultPhone must be called from Looper thread"); } 去电接通若干秒之后挂断代码如下,由于使用了hide class,所以必须在android源代码底下编译,当然你也可以通过反射、AIDL、class.jar等方式解决这个问题。 CallManager mCM = CallManager.getInstance(); Phone phone = PhoneFactory.getDefaultPhone(); mCM.registerPhone(phone); mCM.registerForPreciseCallStateChanged(mHandler, PHONE_STATE_CHANGED, null); private Handler mHandler=new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case PHONE_STATE_CHANGED: updatePhoneSateChange(); break; default: break; } }; }; private void updatePhoneSateChange(){ Call fgCall = mCM.getActiveFgCall(); if (mCM.hasActiveRingingCall()) { fgCall = mCM.getFirstActiveRingingCall(); } final Call.State state = fgCall.getState(); switch (state) { case IDLE: break; case ACTIVE://去电接通 Log.d("yzy","ACTVIE"); final Timer timer = new Timer(); if(mode == Mode.mode2){ timer.schedule(new TimerTask() { @Override public void run() { try { Log.d("yzy", "endcall()"); mITelephony.endCall(); timer.cancel(); } catch (RemoteException e) { e.printStackTrace(); } } }, holdonDuration * 1000, holdonDuration * 1000); } //mITelephony.endCall(); break; default: break; } } 如果你将这个apk 简单的install 会报告如下错误:不存在该共享用户或签名不匹配,这是因为 android:sharedUserId="android.uid.system" 必须放到system/app目录下才能工作。这就由牵扯出了两个问题,临时获取root权限与运行时拷贝

本文转载自:

上一篇: msdn iso
下一篇: MP3
塔塔米
粉丝 11
博文 660
码字总数 17397
作品 0
朝阳
程序员
私信 提问
处理 Activity 的生命周期事件

一些Activity可能比另外一些要重要,比如一个打进来的电话比正在玩的游戏重要;另外,android作为手机系统,内存小于台式机或者笔记本。 有时,当前的Activity可能会发现被关闭,是因为其他A...

鉴客
2011/12/19
1K
0
在android中监听呼出电话(电话拦截、修改呼出电话)

在android中向外拨打电话时系统会发出一个有序广播,虽然该广播最终会被拔号器里的广播接收者所接收并实现电话拔打,但我们可以在广播传递给拔号广播接收者之前先得到该广播,然后清除传递给...

AlexZhuang
2012/04/13
0
3
Telephone dialer

运行电话拨号器,需要加这个权限,否则不会打通电话。这个权限是用户权限,是谷歌工程师为了跟自己撇清关系,用户需要权限的时候自己加。 运行android程序的时候提示:ActivityManager: Warn...

小步快跑!!!!!
2018/09/15
0
0
android学习code3 布局上

andriod系统是一个基于事件驱动行为一种系统 andirod添加事件驱动有四种方式 第一种自定义一个内部类实现OnclickListener private class MyListenner implements OnclickListener{ public vo...

wsl_Mr
2015/08/06
0
0
android编程语言如何实现一个简单的手机打电话应用程序

手机打电话是最常用的功能了,用Android手机开发当中打电话的功能是怎样实现的呢?我来看下简单的拨打电话的代码实例: Android开发环境有很多,这里以Androidstudio为例 步骤一::新建一个Andro...

crossmix
2015/07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

tomcat 莫名奔溃问题

Apr 24, 2019 6:18:11 PM org.apache.coyote.AbstractProtocol pause INFO: Pausing ProtocolHandler ["http-nio-8080"] Apr 24, 2019 6:18:12 PM org.apache.coyote.AbstractProtocol pause......

mellen
18分钟前
0
0
组件开发规范 class名身份识别

组件需要通过一个组件共有的class来标识这个组件,外部调用的时候,可以通过锁定这个class来方便地改变组件的css样式。 设置方式 .my-checkbox { width: 20px; height: 20px; font-...

Carbenson
26分钟前
1
0
如何在工作中快速成长?致工程师的10个简单技巧

阿里妹导读:阿里有句非常经典的土话,“今天的最好表现,是明天的最低要求。”如何挖掘潜能、发现更好的自己?今天,阿里巴巴高级无线开发专家江建明将认知升级的方法总结出来,帮助你获得快...

阿里云云栖社区
45分钟前
2
0
PHP和Redis实现在高并发下的抢购及秒杀功能

抢购、秒杀是平常很常见的场景,面试的时候面试官也经常会问到,比如问你淘宝中的抢购秒杀是怎么实现的等等。 抢购、秒杀实现很简单,但是有些问题需要解决,主要针对两个问题: 一、高并发对...

xiaogg
47分钟前
1
0
从数据上看:谁才是漫威的绝对C位

复联4上映了!这次比美国还早了两天。当然,我还没看,不会给你们剧透,当然也不想不剧透。 这一部不仅是灭霸这一线剧情的结局,也被认为漫威第三阶段的收官之作。据说此部之后,不少影迷熟知...

crossin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部