Android 通过反射及AIDL获取双卡手机SIM卡相关信息,及注册监听

在Android 5.0之前,虽然也有手机是双卡手机,但是双卡方案都是ODM厂商自己做的,或者是有芯片厂商提供的源码完成。因此,如果要在4.4甚至更早之前的手机上获取双卡信息,基本上不是一向巨大的工程。虽然之前尝试过使用反射方法去获取

  • 高通的“android.telephony.MSimTelephonyManager”类
  • MTK的"com.mediatek.common.telephony.ITelephonyEx.aidl"类,

打印出函数的方法和参数以及类属性,然后去猜测,但是由于无法直接阅读源码,而且ODM厂商也会自己去修改对应的代码实现其他用户痒点功能(主卡3/4G网络,副卡流量)等。

因此在Lollipop之前,双卡问题是暂时就放弃了。但是其他的功能调用还是有办法的。

例如在自己的项目下新建如下文件夹

把ITelephony.aidl放进来,然后通过反射TelephonyManager的getITelephony()方法获取 ITelephony实例,进而调用如endCall()等方法来实现如果来电黑名单拦截等方式

eg:

在Android 5.0以后,Google 官方API开始支持多SIM卡,这对开发者来说是一件好事,意味着应用能够实现的功能也越来越多。

在Lollipop上Google又新增了一个Isub.aidl的文件,从命名上就可以看出这是一个进程服务,所以在使用时和ITelephony.adil一样,在自己的项目里建立对应adil文件夹,把ISub.aidl拉进来就行了。使用时调用方式如下:

举个例子,假设现在是一台双卡双待的手机系统是Lollipop,我们想知道现在使用的是哪一张卡作为流量卡,那么久必须知道默认的流量的subId。具体方法是调用ISub.aidl的getDefaultDataSubId()。

对应的流量卡subId后则需要调用到TelephonyManager下的getSubscriberid(long subId)方法,但是这个方法有点坑的地方,就是在5.0的时候参数书long类型的,但是到了5.1的时候有换成了int类型,所以在使用时必须注意

具体使用

通过将系统的AIDL引入,还可以调用其他的方法来是显示更多的功能。

在6.0上Google进一步开放了SIM卡相关的API我们可以使用 SubscriptionManager这个API

这个使用管理类使用更简单,类似于TelephonyManager。

获取实例:

获取默认数据卡信息:

获取激活的SIM 卡数量:

,既然能获得SIM卡的信息,那还有个重要的东西想要获取,就是如何监听两张SIM的信号场强信息以及对应的基站邻区信息。

在5.0以前这是无法做到的,因为5.0以前,PhoneStateListener这个方法只有一个不带参数的构造函数,所以无法注册监听,但是到了5.0以后的版本就有了

但是一个大大的@hide就给你隔绝了监听的可能。

而且连参数protected也加了@hide明显是不对普通开发者开放的。

但是,我们都知道,反射是可以获取到类的参数,当然也可以设置参数值。

具体设置方法,在继承PhoneStateListener时实现构造函数

并且在构造函数中对监听进行设置。

时间: 2024-08-06 15:58:39

Android 通过反射及AIDL获取双卡手机SIM卡相关信息,及注册监听的相关文章

Android开发之获取手机SIM卡信息

TelephonyManager是一个管理手机通话状态.电话网络信息的服务类.该类提供了大量的getXxx(),方法获取电话网络的相关信息. TelephonyManager类概述: 可用于訪问有关设备上的电话服务信息. 应用程序能够使用这个类的方法来确定电话服务和状态,以及訪问某些类型的用户信息.应用程序还能够注冊一个侦听器以接收的电话状态变化通知. 你不能直接实例化这个类;相反,你能够通过Context.getSystemService(Context.TELEPHONY_SERVICE)方

三种尺寸:手机SIM卡使用指南

毫无疑问目前卖的最火的手机非iPhone 5s莫属,相信仍有不少网友目前处于观望之中,由于iPhone 5s和iPhone 5c采用与iPhone相同的Nano-SIM卡,因此不少新用户在使用之前也徒生了一道工序,就是需要更换Nano-SIM卡,究竟这种SIM卡跟我们以往接触的标准SIM卡和Micro-SIM又有什么区别呢?又有何种渠道才能更换Nano-SIM卡呢? 区分三种SIM卡 在了解SIM卡种类之前,我们先来简单介绍一下SIM卡的功能,众所周知SIM卡就是我们在使用手机时插入的识别卡,S

Android 获取手机SIM卡运营商

直接上代码: /** * 获取SIM卡运营商 * * @param context * @return */ public static String getOperators(Context context) { TelephonyManager tm = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); String operator = null; String IMSI = tm.getSub

【工具类】获取手机sim卡的运营商

加入权限:<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 1 package com.example.textphone; 2 3 import android.content.Context; 4 import android.telephony.TelephonyManager; 5 6 public class SIMCardInfo { 7 /** 8 * Telephon

Android实例-手机安全卫士(二十五)-检查手机SIM卡是否变更

一.目标 1.利用广播接收者(手机重启时会发出相应广播)获取开机时的SIM序列号,与已经保存着的比较.根据比较结果完成相应操作. 2.(可选)强制在防盗设置向导第二步中要求绑定SIM卡后才可进行下一步设置. 3.实现从另一个Activity中获取数据,即点击”选择联系人“人后跳至新建的类(选择联系人)中,并从中获取联系人数据. 二.代码实现. 1.在程序包下新建包(取名com.example.mobilesafe.receiver),用于接收广播.在新建包下新建类(取名BootCompleteR

Android ExpandableListView使用+获取SIM卡状态信息

ExpandableListView 是一个可以实现下拉列表的控件,大家可能都用过QQ,QQ中的好友列表就是用ExpandableListView实现的,不过它是自定义的适配器.本篇 博客除了要介绍ExpandableListView的使用,还整合了获取SIM的状态,这个很简单也就是获取系统服务,再调用相应的方法就可以实现,在 这里只是记录一下. 本篇博客要实现效果图如下: 除了子列表不怎么好看之外,组列表还是蛮好看的,这里只是为了演示,子列表就没做特别的处理. 布局文件: /SIM_Card_

android-----关于通过AIDL注册监听之后无法解除监听的探索

我们在平常使用AIDL时可能会有这样的场景,客户端并不想一直查看服务端有没有有关我的消息,而是想让服务端在有消息的时候能够通知我,随后客户端再去服务端拿消息,这样相对来说比较节省资源,通常我们可以利用观察者模式将客户端注册到服务端,接着有消息的时候服务端相应的通知各个客户端就可以了,这种方式在客户端和服务端处于同一进程的时候使用是没有问题的,因为同一进程内部是可以直接传递对象的,并不会出现注册绑定到服务端和解注册的对象不同的情况,但是如果放到不同进程间的话,因为通信过程中涉及到了序列化反序列化过

手机影音第三天,通过监听底部radiogroup按钮状态来切换中间FragmentLayout里的内容

主要是Fragment的使用,其切换fragment的步骤如下 1.获取FragmentManager 实例,但是需要MainActivity extends FragmentActivity才能去获取FragmentManager. 通过FragmentManager  fragmentManager=getSupportFragmentManager(); 2.开启事务  ,有点类似javaee里的hibernate 操作数据库 FragmentTranaction tranaction=

【Android】各式各样的弹出框与对菜单键、返回键的监听

Android自带各式各样的弹出框,弹出框也是安卓基本的组件之一.同时安卓程序可以对菜单键.返回键的监听,但在安卓4.0之后就禁止对Home键的屏蔽与监听,强制保留为系统守护按键,如果非要对Home键的屏蔽与监听,就会出现java.lang.IllegalArgumentException: Window type can not be changed after the window is added.的错误. 下面写一个小程序,来说明Android各式各样的弹出框,同时,安卓是如何对菜单键.