1、闲聊
今天闲来无事,刚好一个朋友需要做一个来电自动接听的功能,我一想,咦,这尼玛我还没做过,好吧,去看看!好吧,看就看吧那么我提来了,我该从哪儿入手呢?算了还是走老步奏把,我想去看了看Andorid api 文档找到了一个东西:
这个包 提供用于监视基本电话信息的api,如网络类型和连接状态,以及操作电话号码字符串的实用程序。
然后呢?我就在这里面找到了一个来电的监听器:
我以为到了这一步就好做了,然而我监听到了来电,却接听不了!What?怎么会这样?于是我就去逛一下博客,结果博客的来带你自动接听一团糟,思前想后,不是个办法啊,最总皇天不负有心人,我还是找到了一个关键的东西“aidl”!
2、AIDL
到了这里我们了解一下“aidl”是做啥的!AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。AIDL这门语言非常的简单,基本上它的语法和 Java 是一样的,只是在一些细微处有些许差别——毕竟它只是被创造出来简化Android程序员工作的。对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互。当然它在我开发中最常用的还是写一些插件,如:Android ButterKnife Zelezny , Android Parcelable code generator , GsonFormat , Parcelable Code Generator(for kotlin)等。
多说无用,现在我们像一个小白一样的去使用它就行了,以后深入了解!
说到这儿,我就分享一个 Android系统aidl 的github地址:
3、找到被Android系统隐藏的方法
那么我就需要,建立一个aidl的文件夹,并且与java文件夹同级!如图:
来吧,我们直接上这几个文件的源码,上源码之前必须说的一点是,包名必须与android系统框架下的包名相同!
CellInfo.aidl
package android.telephony;
parcelable CellInfo;
NeighboringCellInfo.aidl
package android.telephony;
parcelable NeighboringCellInfo;
ITelephony.aidl
package com.android.internal.telephony;
interface ITelephony {
boolean endCall();
void answerRingingCall();
boolean enableDataConnectivity();
boolean disableDataConnectivity();
boolean isDataConnectivityPossible();
}
到了这里我们编译一下就会发现:在编译文件中多了一个.class文件 : ( ITelephony ) ,如图位置:
ITelephony .class 源码如下:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.android.internal.telephony;
import android.os.Binder;
import android.os.IBinder;
import android.os.IInterface;
import android.os.Parcel;
import android.os.RemoteException;
public interface ITelephony extends IInterface {
boolean endCall() throws RemoteException;
void answerRingingCall() throws RemoteException;
boolean enableDataConnectivity() throws RemoteException;
boolean disableDataConnectivity() throws RemoteException;
boolean isDataConnectivityPossible() throws RemoteException;
public abstract static class Stub extends Binder implements ITelephony {
private static final String DESCRIPTOR = "com.android.internal.telephony.ITelephony";
static final int TRANSACTION_endCall = 1;
static final int TRANSACTION_answerRingingCall = 2;
static final int TRANSACTION_enableDataConnectivity = 3;
static final int TRANSACTION_disableDataConnectivity = 4;
static final int TRANSACTION_isDataConnectivityPossible = 5;
public Stub() {
this.attachInterface(this, "com.android.internal.telephony.ITelephony");
}
public static ITelephony asInterf