博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android-使用AIDL挂断电话
阅读量:5038 次
发布时间:2019-06-12

本文共 4078 字,大约阅读时间需要 13 分钟。

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>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/codestyle/p/5617077.html

你可能感兴趣的文章
编译Linux驱动程序 遇到的问题
查看>>
大型分布式网站架构技术总结
查看>>
HDU 1017[A Mathematical Curiosity]暴力,格式
查看>>
[算法之美] KMP算法的直观理解
查看>>
EntityFramework 性能优化
查看>>
【ASP.NET开发】菜鸟时期的ADO.NET使用笔记
查看>>
静态代码块、构造代码块
查看>>
批量管理服务器,批量分发文件
查看>>
白盒测试概述
查看>>
求基于fca算法的网页分类技术
查看>>
leetcode:Longest Consecutive Sequence
查看>>
ExtJS4之Ext.MessageBox的各种用法
查看>>
Linux系统编程@进程管理(二)
查看>>
Jconsole连接Tomcat JVM
查看>>
[C# 开发技巧系列]C#如何实现图片查看器
查看>>
vs2015编译boost 64位
查看>>
TensorFlow加载图片的方法
查看>>
第6章 计算机视觉加强之机器学习 6-1 机器学习章节介绍
查看>>
第3章 机器学习的典型应用 3-1 典型应用-关联规则
查看>>
语法解析改进及代码生成
查看>>