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挂断电话相关推荐

  1. Android的AIDL以及挂断电话

    最新实战教程,让你了解Android自动化刷量.作弊与防作弊的那些事,案例:刷友盟统计.批量注册苹果帐号 Android的AIDL是什么呢,AIDL就是Android Interface Defina ...

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

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

  3. android 挂断 电话 反射,Android实现来电自动挂断实现机制

    通过aidl及反射实现挂断电话 具体分三步: (1)ITelephony.aidl ,必须新建com.Android.internal.telephony包并放入ITelephony.aidl文件(构 ...

  4. android挂断电话广播,android实现接通和挂断电话

    android实现接通和挂断电话 发布时间:2020-08-21 01:52:02 来源:脚本之家 阅读:230 作者:WillenWu 本文实例为大家分享了android实现接通和挂断电话的具体代码 ...

  5. android 关闭蓝牙打电话功能,Android蓝牙开发【八】hfp接听、挂断电话

    继续研究hfp相关功能.蓝牙耳机可以控制手机接听.拒接.挂断电话,拨打电话等功能.本文主要分析下起这些操作的大致流程. 在系统应用Bluetooth中com_android_bluetooth.cpp ...

  6. Android 蓝牙开发(八)hfp接听、挂断电话

    转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/71429860 本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底 ...

  7. android之挂断电话

    //挂断电话,需要调用系统底层的方法,要用哪个到反射拿底层方法public void endcall(){//加载serviceManager的字节码Class clazz=CallSmsSafeSe ...

  8. HFP:不活跃的车载设备在打电话时,不能挂断电话

    Android P:Only active device can hung up call . 非 active device 不能挂断电话. step1:车载先连接 手机 step2:蓝牙耳机再连接 ...

  9. android 挂断 电话 反射,android  接听和挂断实现方式

    注意:android2.3版本及以上不支持下面的自动接听方法. (会抛异常:java.lang.SecurityException: Neither user xxxxx nor current pr ...

  10. 黑科技小demo,实现定时自动打电话,挂断电话

    好久没写博客了,实在是太忙了,又鉴于鄙人天生爱睡觉.幸运的是,上周终于把自己的第一个Apk写好了,,接下来,就写个小系列来记录一下吧.不过,在此之前,先把这篇黑科技写起来(研究了小段时间,确实好玩). ...

最新文章

  1. memcache缓存失效
  2. 【转】 [C/OC的那点事儿]NSMutableArray排序的三种实现(依赖学生成绩管理系统).
  3. Hyperledger Fabric 链码(3) 生命周期和API
  4. mysql jpa总分数_JPA 查询COUNT示例
  5. nssl1230-序列【位运算】
  6. 字符串替换方法的优劣
  7. P60 ---AI 在P60 上的人应用
  8. mysql数据库腾讯云添加用户,解决腾讯云cdb的基础版mysql不支持新建账号
  9. PIX525-IPSEC-×××配置
  10. 怎样将纸质文档转换成图片,然后转换成word文字
  11. 一个人知道自己为什么而活,他就可以忍受生活加诸他的一切苦难
  12. android 自动语音提醒,Android 语音播报实现方案
  13. python编程从入门到实践——16章
  14. and desgin Vue页面,使用watch监视, <a-input>内的值, 自动计算出填入框的值,用vue中watch监听input组件的变化
  15. java rds 数据库_JDBC(java数据库连接)和阿里云RDS数据库
  16. Vue 3.0终于来了!官方凌晨开源代码,导读一波
  17. 吕本富:中国Web2.0缺乏创新 与美国差距拉大
  18. 【迷人的爪哇】—Java数据类型和变量
  19. week5_神经网络
  20. ghost Ubuntu环境下安装

热门文章

  1. 数学专业学c语言,数学专业C语言教学方法研究.pdf
  2. 计算机屏幕地图是不是地图,地图软件 如何在截图时超出一个屏幕?
  3. JAVA加密或混淆技术总结
  4. 网易云音乐NCM格式转化为mp3
  5. WPF 视频教程+笔记
  6. Qt Data Visualization 3D可视化
  7. 通达信期货接口有必要开通五档行情?
  8. Axure组件库资源
  9. 在Windows搭建私人蚂蚁云笔记服务器
  10. hualinux0.9 网络篇:CCNA学习及思科模拟器选择