android 获取通话记录对应卡槽,短信记录对应卡槽

最新公司有需求 要求屏蔽监听插入双卡后的用户指定一张卡,找了半天资料现在总结一下

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中测试没有问题

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值