Android-使用AIDL挂断电话

1.AIDL简单操作

package org.zrf.demo;

import java.lang.reflect.InvocationTargetException;
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() ;                // 定义IBinder
    class BinderImpl extends Binder implements IService {
        @Override
        public String getInterfaceDescriptor() {                // 取得接口描述信息
            return "过滤电话“" + PhoneService.this.phoneNumber
                    + "”设置成功!";                                 // 返回Service类的名称
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        this.phoneNumber = intent.getStringExtra("phonenumber"); // 取得电话号码
        this.telephony = (TelephonyManager) super
                .getSystemService(Context.TELEPHONY_SERVICE);     // 取得服务
        this.audio = (AudioManager) super
                .getSystemService(Context.AUDIO_SERVICE);        // 取得服务
        this.telephony.listen(new PhoneStateListenerImpl(),
                PhoneStateListener.LISTEN_CALL_STATE);             // 设置电话监听
        return this.myBinder;                                    // 返回IBinder对象
    }

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;
            }
        }
    }
 private ITelephony getITelephony(){
     ITelephony iTelephony=null;
     Class<TelephonyManager>cls=TelephonyManager.class;
     Method getITelephonyMethod=null;
     try {
        getITelephonyMethod=cls.getDeclaredMethod("getITelephony");
        getITelephonyMethod.setAccessible(true);//取消封装
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
     try {
         iTelephony=(ITelephony)getITelephonyMethod.invoke(this.telephony);
         return iTelephony;
        }  catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
     return iTelephony;
 }
}

package com.android.internal.telephony;
interface ITelephony{
    boolean endCall();
    void answerRingingCall();
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.zrf.demo"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="10" />

<application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MyPhoneDemo"
                  android:label="@string/app_name">
            <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>
    <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 android:name="android.permission.CALL_PHONE"/>
</manifest>

时间: 2024-10-19 07:11:37

Android-使用AIDL挂断电话的相关文章

挂断电话demo

<!-- 结束通话和打电话的权限 --> <uses-permission android:name="android.permission.CALL_PHONE"/> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" and

android 接听和挂断实现方式

参考:android 来电接听和挂断 支持目前所有版本 注意:android2.3版本及以上不支持下面的自动接听方法. (会抛异常:java.lang.SecurityException: Neither user xxxxx nor current process has android.permission.MODIFY_PHONE_STATE.) 原因:android2.3版本及以上android.permission.MODIFY_PHONE_STATE权限限制已经改为系统权限. 普通应

android 手机后台播音乐,设置闹钟,打一通电话,挂断电话后,闹钟与音乐同时响起

修改: frameworks\base\media\java\android\media\MediaFocusControl.java: 1.import packages: import com.android.internal.telephony.ITelephony; import android.os.ServiceManager; 2.增加获取当前Phone Call State的方法getPhoneCallState(): private int getPhoneCallState(

Android 电话自动接听和挂断详解

1.通过aidl及反射实现挂断电话 具体分三步: (1)ITelephony.aidl ,必须新建com.android.internal.telephony包并放入ITelephony.aidl文件(构建后在gen下有ITelephony.java文件,这是aidl生成的接口),文件内容如下: package com.android.internal.telephony; interface ITelephony{ boolean endCall(); void answerRingingCa

Android开发之黑名单来电自动挂断

本实例允许用户动态添加号码到黑名单,并实现黑名单来电自动挂断.程序通过创建PhoneStateListener监听器来监听TelephonyManager的通话状态来实现该功能. 由于自Android 10之后Android不再对外公开挂断电话的API,如果需要挂断电话必须使用AIDL与电话管理Service进行通信,并调用服务中的API实现结束电话. 为了调用远程的AIDL Service,开发者需要将Android源码中的如下两个文拷到指定位置: com.android.internal.t

Android之——自动挂断电话的实现

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47072451 通过<Android之--AIDL小结>与<Android之--AIDL深入>两篇博文,相信大家已经对Android AIDL有了一定的了解,下面,我们就利用Android的AIDL实现自动挂断电话的功能,好了,不多说了,我们直接进入主题. 1.准备AIDL文件 挂断电话的AIDL文件都是Android自带的文件,我们可以从Android的源代码中找到

Service-黑名单来电自动挂断

这只是一个学习例程,很多功能有待完善 允许用户动态加载手机通讯录中的电话号码,勾选某些号码作为黑名单,一旦将某些号码设为黑名单,当该号码自动挂断该号码 Android没有对外公开挂断电话的API,如果需要挂断电话,必须使用AIDL与电话管理Service进行通信,并调用服务中的API实现结束通话 为了调用远程的AIDL Service,需要上图所示的两个aidl文件 BlockMain.java  界面提供一个按钮让用户打开对话框来勾选黑名单. public class BlockMain ex

解决低电量自动关机时如果有来电自动关断电话

1.问题描述: 低电量时,由于系统已经无法继续提供通话服务,为了不影响通话服务质量或其它问题,因此在自动关机时应自动挂断电话 2.解决思路: 在低电量自动关机时,如果此时有来电,调用挂断电话的接口,挂断电话. 3.实现方式: BatteryService.java private void shutdownIfNoPowerLocked() { // shut down gracefully if our battery is critically low and we are not powe

Android 对电话进行监听和挂断

1.添加权限 <!--拨打电话的权限--><uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!--电话拦截--><receiver android:name="