最新公司有需求 要求屏蔽监听插入双卡后的用户指定一张卡,找了半天资料现在总结一下
1.获取通话记录对应卡槽
通话记录数据库(content://call_log/calls)中有存字段simid
Uri callUri = CallLog.Calls.CONTENT_URI;
String[] columns = {CallLog.Calls.CACHED_NAME// 通话记录的联系人
, CallLog.Calls.NUMBER// 通话记录的电话号码
, CallLog.Calls.DATE// 通话记录的日期
, CallLog.Calls.DURATION// 通话时长
, CallLog.Calls.TYPE// 通话类型
, "simid"//卡槽ID
};
Cursor cursor = getContentResolver().query(callUri, columns, null, null, CallLog.Calls.DEFAULT_SORT_ORDER);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME)); //姓名
String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)); //号码
Long dateLong = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)); //获取通话日期
int duration = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION));//获取通话时长,值为多少秒
int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)); //获取通话类型:1.呼入2.呼出3.未接
int simid = cursor.getInt(cursor.getColumnIndex("simid"));
}
这个字段对应SubscriptionInfo类下的mId而这个类的mSimSlotIndex就是对应卡槽位置
SubscriptionManager sManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
List<SubscriptionInfo> mList = sManager.getActiveSubscriptionInfoList();//获取当前插入卡槽的卡信息
for (SubscriptionInfo info : mList){
int simId = info.getSubscriptionId();//获取simid 与通话记录表的simId一致
int slot_id = info.getSimSlotIndex();//获取卡槽位置
}
全部代码
Map<Integer,Integer> simInfo = new HashMap<>();
SubscriptionManager sManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
List<SubscriptionInfo> mList = sManager.getActiveSubscriptionInfoList();//获取当前插入卡槽的卡信息
for (SubscriptionInfo info : mList){
int simId = info.getSubscriptionId();//获取simid 与通话记录表的simId一致
int slot_id = info.getSimSlotIndex();//获取卡槽位置
simInfo.put(simId,slot_id);
}
Uri callUri = CallLog.Calls.CONTENT_URI;
String[] columns = {CallLog.Calls.CACHED_NAME// 通话记录的联系人
, CallLog.Calls.NUMBER// 通话记录的电话号码
, CallLog.Calls.DATE// 通话记录的日期
, CallLog.Calls.DURATION// 通话时长
, CallLog.Calls.TYPE// 通话类型
, "simid"//卡槽ID
};
Cursor cursor = getContentResolver().query(callUri, columns, null, null, CallLog.Calls.DEFAULT_SORT_ORDER);
if(cursor!=null) {
cursor.moveToLast();
String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME)); //姓名
String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)); //号码
Long dateLong = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)); //获取通话日期
int duration = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION));//获取通话时长,值为多少秒
int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)); //获取通话类型:1.呼入2.呼出3.未接
int simid = cursor.getInt(cursor.getColumnIndex("simid"));
int slot_id = simInfo.containsKey(simid)?simInfo.get(simid):-1;//-1为以前插入的卡现在已经移除了 0为卡槽1 1为卡槽2 ....
}
2.获取短信对应的卡槽
同理短信表中也存有sim卡的id 不过字段名跟通话记录表略有不同,为sim_id
Map<Integer,Integer> simInfo = new HashMap<>();
SubscriptionManager sManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
List<SubscriptionInfo> mList = sManager.getActiveSubscriptionInfoList();//获取当前插入卡槽的卡信息
for (SubscriptionInfo info : mList){
int simId = info.getSubscriptionId();//获取simid 与通话记录表的simId一致
int slot_id = info.getSimSlotIndex();//获取卡槽位置
simInfo.put(simId,slot_id);
}
Uri MESSAGE_URI = Uri.parse("content://sms");
String[] ALL_DB_FIELD_NAME = {"_id", "address", "person", "body","date", "type", "thread_id","sim_id" };
Cursor cursor = getContentResolver().query(MESSAGE_URI, ALL_DB_FIELD_NAME,null, null, "_id asc");
if (cursor != null) {
cursor.moveToLast();
long smsdate = Long.parseLong(cursor.getString(cursor.getColumnIndex("date",)));
String strAddress = cursor.getString(cursor.getColumnIndex("address")); // 短信号码
String strbody = cursor.getString(cursor.getColumnIndex("body")); // 在这里获取短信信息
final int type = cursor.getInt(cursor.getColumnIndex("type"));
final int smsid = cursor.getInt(cursor.getColumnIndex("thread_id"));
final int sim_id = cursor.getInt(cursor.getColumnIndex("sim_id"));
int slot_id = simInfo.containsKey(sim_id)?simInfo.get(sim_id):-1;//-1为以前插入的卡现在已经移除了 0为卡槽1 1为卡槽2 ....
}
以上在红米note8中测试没有问题