使用AIDL挂断电话
AIDL是Android接口描述语言。
最早的Android中提供了自动挂断电话的功能,但是随着版本的升高这些功能已经被
隐藏起来了,所以要想完成挂断电话的功能,则要依靠AIDL技术完成。
在main.xml中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:background="#00ff33">
<EditText
android:id="@+id/phonenumber"
android:layout_margin="8dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/setnumber"
android:layout_width="100dp"
android:layout_height="40dp"
android:textColor="#ffffff"
android:background="#3399ff"
android:text="设置黑名单"/>
<Button
android:id="@+id/cancelnumber"
android:layout_marginLeft="20dp"
android:layout_width="100dp"
android:layout_height="40dp"
android:textColor="#ffffff"
android:background="#3399ff"
android:text="取消黑名单"/>
</LinearLayout>
</LinearLayout>
在src下新建包:com.android.internal.telephony,(包名不能改)
并新建文件ITelephony.aidl
在ITelephony.aidl中:
package com.android.internal.telephony ;
interface ITelephony {
boolean endCall() ; // 挂断电话
void answerRingingCall() ; // 拨打电话
}
在IService.java中:
package com.li.phone;
public interface IService {
}
在PhoneBroadcastReceiver.java中:
package com.li.phone;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class PhoneBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())) { // 去电
String outgoingNumber = intent
.getStringExtra(Intent.EXTRA_PHONE_NUMBER); // 去电号码
Intent pit = new Intent(context, PhoneService.class);
pit.putExtra("outgoingNumber", outgoingNumber);
context.startService(pit);
} else { // 来电
context.startService(new Intent(context, PhoneService.class));
}
}
}
在PhoneService.java中:
package com.li.phone;
import java.lang.reflect.Method;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import com.android.internal.telephony.ITelephony;
public class PhoneService extends Service {
private TelephonyManager telephony = null;
private AudioManager audio = null; // 声音服务
private String phoneNumber = null; // 要过滤的电话
private IBinder myBinder = new BinderImpl();
class BinderImpl extends Binder implements IService {
@Override
public String getInterfaceDescriptor() {
return "黑名单号码" + PhoneService.this.phoneNumber + "设置成功!";
}
}
@Override
public IBinder onBind(Intent intent) {
this.phoneNumber = intent.getStringExtra("phonenumber"); // 取得电话号码
this.audio = (AudioManager) super
.getSystemService(Context.AUDIO_SERVICE); // 声音服务
this.telephony = (TelephonyManager) super
.getSystemService(Context.TELEPHONY_SERVICE);
this.telephony.listen(new PhoneStateListenerImpl(),
PhoneStateListener.LISTEN_CALL_STATE); // 设置监听操作
return this.myBinder;
}
private class PhoneStateListenerImpl extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE: // 挂断电话
PhoneService.this.audio
.setRingerMode(AudioManager.RINGER_MODE_NORMAL); // 正常音
break;
case TelephonyManager.CALL_STATE_RINGING: // 领音响起
if (incomingNumber.equals(PhoneService.this.phoneNumber)) { // 电话号码匹配
ITelephony iTelephony = getITelephony() ;
if (iTelephony != null) {
try {
iTelephony.endCall() ; // 挂断电话
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK: // 接听电话
break;
}
}
}
private ITelephony getITelephony() {
ITelephony iTelephony = null ;
Class<TelephonyManager> cls = TelephonyManager.class ;
Method getITelephonyMethod = null ;
try {
getITelephonyMethod = cls.getDeclaredMethod("getITelephony") ;
getITelephonyMethod.setAccessible(true) ; // 取消封装
} catch (Exception e) {
}
try {
iTelephony = (ITelephony) getITelephonyMethod
.invoke(this.telephony);
return iTelephony ;
} catch (Exception e) {
}
return iTelephony ;
}
}
在MyPhoneDemo.java中:
package com.li.phone;
import com.li.phone.PhoneService.BinderImpl;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MyPhoneDemo extends Activity {
private EditText phoneNumber = null ;
private Button setNumber = null ;
private Button cancelNumber = null ;
private IService service = null ;
private ServiceConnectionImpl serviceConnection = new ServiceConnectionImpl() ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.phoneNumber = (EditText) super.findViewById(R.id.phonenumber) ;
this.setNumber = (Button) super.findViewById(R.id.setnumber) ;
this.cancelNumber = (Button) super.findViewById(R.id.cancelnumber) ;
this.setNumber.setOnClickListener(new SetOnClickListenerImpl()) ;
this.cancelNumber.setOnClickListener(new CancelOnClickListenerImpl()) ;
}
private class SetOnClickListenerImpl implements OnClickListener {
public void onClick(View v) {
Intent intent = new Intent(MyPhoneDemo.this,PhoneService.class) ;
intent.putExtra("phonenumber", MyPhoneDemo.this.phoneNumber
.getText().toString());
MyPhoneDemo.this.bindService(intent,
MyPhoneDemo.this.serviceConnection,
Context.BIND_AUTO_CREATE);
}
}
private class CancelOnClickListenerImpl implements OnClickListener {
public void onClick(View v) {
if(MyPhoneDemo.this.service != null) {
MyPhoneDemo.this.unbindService(MyPhoneDemo.this.serviceConnection) ;
MyPhoneDemo.this.stopService(new Intent(MyPhoneDemo.this,PhoneService.class)) ;
Toast.makeText(MyPhoneDemo.this, "黑名单已取消", Toast.LENGTH_LONG)
.show();
MyPhoneDemo.this.service = null ;
}
}
}
private class ServiceConnectionImpl implements ServiceConnection {
public void onServiceConnected(ComponentName name, IBinder service) {
MyPhoneDemo.this.service = (BinderImpl) service ;
try {
Toast.makeText(MyPhoneDemo.this, service.getInterfaceDescriptor(), Toast.LENGTH_LONG).show() ;
} catch (RemoteException e) {
}
}
public void onServiceDisconnected(ComponentName name) {
}
}
}
修改AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.li.phone"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MyPhoneDemo"
android:label="@string/title_activity_my_phone_demo" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".PhoneService" />
<receiver android:name=".PhoneBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
</application>
</manifest>
使用AIDL挂断电话相关推荐
- Android的AIDL以及挂断电话
最新实战教程,让你了解Android自动化刷量.作弊与防作弊的那些事,案例:刷友盟统计.批量注册苹果帐号 Android的AIDL是什么呢,AIDL就是Android Interface Defina ...
- android 自动挂断,android实现接通和挂断电话
本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下 关键代码:[PhoneUtils类] package com.ebupt.phonerecorddemo.se ...
- android 挂断 电话 反射,Android实现来电自动挂断实现机制
通过aidl及反射实现挂断电话 具体分三步: (1)ITelephony.aidl ,必须新建com.Android.internal.telephony包并放入ITelephony.aidl文件(构 ...
- android挂断电话广播,android实现接通和挂断电话
android实现接通和挂断电话 发布时间:2020-08-21 01:52:02 来源:脚本之家 阅读:230 作者:WillenWu 本文实例为大家分享了android实现接通和挂断电话的具体代码 ...
- android 关闭蓝牙打电话功能,Android蓝牙开发【八】hfp接听、挂断电话
继续研究hfp相关功能.蓝牙耳机可以控制手机接听.拒接.挂断电话,拨打电话等功能.本文主要分析下起这些操作的大致流程. 在系统应用Bluetooth中com_android_bluetooth.cpp ...
- Android 蓝牙开发(八)hfp接听、挂断电话
转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/71429860 本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底 ...
- android之挂断电话
//挂断电话,需要调用系统底层的方法,要用哪个到反射拿底层方法public void endcall(){//加载serviceManager的字节码Class clazz=CallSmsSafeSe ...
- HFP:不活跃的车载设备在打电话时,不能挂断电话
Android P:Only active device can hung up call . 非 active device 不能挂断电话. step1:车载先连接 手机 step2:蓝牙耳机再连接 ...
- android 挂断 电话 反射,android 接听和挂断实现方式
注意:android2.3版本及以上不支持下面的自动接听方法. (会抛异常:java.lang.SecurityException: Neither user xxxxx nor current pr ...
- 黑科技小demo,实现定时自动打电话,挂断电话
好久没写博客了,实在是太忙了,又鉴于鄙人天生爱睡觉.幸运的是,上周终于把自己的第一个Apk写好了,,接下来,就写个小系列来记录一下吧.不过,在此之前,先把这篇黑科技写起来(研究了小段时间,确实好玩). ...
最新文章
- memcache缓存失效
- 【转】 [C/OC的那点事儿]NSMutableArray排序的三种实现(依赖学生成绩管理系统).
- Hyperledger Fabric 链码(3) 生命周期和API
- mysql jpa总分数_JPA 查询COUNT示例
- nssl1230-序列【位运算】
- 字符串替换方法的优劣
- P60 ---AI 在P60 上的人应用
- mysql数据库腾讯云添加用户,解决腾讯云cdb的基础版mysql不支持新建账号
- PIX525-IPSEC-×××配置
- 怎样将纸质文档转换成图片,然后转换成word文字
- 一个人知道自己为什么而活,他就可以忍受生活加诸他的一切苦难
- android 自动语音提醒,Android 语音播报实现方案
- python编程从入门到实践——16章
- and desgin Vue页面,使用watch监视, <a-input>内的值, 自动计算出填入框的值,用vue中watch监听input组件的变化
- java rds 数据库_JDBC(java数据库连接)和阿里云RDS数据库
- Vue 3.0终于来了!官方凌晨开源代码,导读一波
- 吕本富:中国Web2.0缺乏创新 与美国差距拉大
- 【迷人的爪哇】—Java数据类型和变量
- week5_神经网络
- ghost Ubuntu环境下安装