当前位置: 首页 > 知识库问答 >
问题:

双sim Android手机,sim接收呼叫

宋康安
2023-03-14

我有一个android应用程序可以检测来电,我需要改进这个应用程序,使其能够在duos移动设备上工作。因此,我创建了一个在清单中注册的广播接收器,用于操作:电话状态已更改,在onReceive方法中,我需要检查哪个sim卡接收呼叫。这是我的密码

   Protected void onReceive(Context c, Intent i)
   {
     Int whichSim = intent
      getIntExtra("simSlot",-1);
      // so this methof return 0            for sim 1 and 1 for sim2
     If(whichSim==-1)
    WhichSim=intent.getIntExtra("com.androie.phone.extra.slot",-1);
     }

我运行这个应用程序上的设备4.2 2和其正常工作,但当我运行它上的设备4 4.4所以这个方法不工作,我的意思是,其中sim返回-1在所有情况下。有人能帮帮我吗?

共有3个答案

壤驷英叡
2023-03-14

您是否尝试过此方法:-在此方法中,您将为1个Sim卡获得0,为第二个Sim卡获得1//4.4手机KitKat的工作代码

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        whichSIM = intent.getExtras().getInt("subscription");


        if (whichSIM == 0) {
            whichSIM = 1;
            editor.putLong("ChooseSim", whichSIM);
            editor.commit();
            // Incoming call for SIM1

        } else if (whichSIM == 1) {
            whichSIM = 2;
            editor.putLong("ChooseSim", whichSIM);
            editor.commit();

        }
子车勇锐
2023-03-14

这个问题表明“com.android.phone.extra.slot”可能也适用于某些手机。也许可以同时尝试这两种方法并使用未返回-1的方法?

陆飞捷
2023-03-14

Android在Android 5.1之前不支持双sim手机,因此支持双sim手机的任何扩展都可能是特定于设备和版本的。以下是使用MultiSimTelephonyManager变体来处理双SIM卡的特定手机类别,包括Android 4.4下的三星duos galaxy J1。4.

基本上,这类双sim手机使用两个MultiSimTelephonyManager实例作为控制手机的接口,该实例从常规TelephonyManager中派生出来,每个实例负责一个sim卡插槽。

检测进线量的方法之一是使用PhoneStateListener类(而不是使用接收器)来检测电话状态的变化。这些电话中的PhoneStateListener被修改(而不是子类化),以包括一个应指示监听器的SIM卡槽的mSubcription字段。

标准SDK中不包含PhoneStateListenerMultiSimTelephonyManager类和mSubscription字段。要编译应用程序以使用这些接口,需要Java反射。

下面的代码应该大致说明如何从传入呼叫中获取sim插槽信息。我没有要测试的设备,所以代码可能需要改进。

在初始化阶段设置监听器-

try {
    final Class<?> tmClass = Class.forName("android.telephony.MultiSimTelephonyManager");
    // MultiSimTelephonyManager Class found
    // getDefault() gets the manager instances for specific slots
    Method methodDefault = tmClass.getDeclaredMethod("getDefault", int.class);
    methodDefault.setAccessible(true);
    try {
        for (int slot = 0; slot < 2; slot++) {
            MultiSimTelephonyManager telephonyManagerMultiSim = (MultiSimTelephonyManager)methodDefault.invoke(null, slot);     
            telephonyManagerMultiSim.listen(new MultiSimListener(slot), PhoneStateListener.LISTEN_CALL_STATE);
        }
    } catch (ArrayIndexOutOfBoundsException e) {
        // (Not tested) the getDefault method might cause the exception if there is only 1 slot
    }
} catch (ClassNotFoundException e) {
    // 
} catch (NoSuchMethodException e) {
    //
} catch (IllegalAccessException e) {
    //
} catch (InvocationTargetException e) {
    //
} catch (ClassCastException e) {
    //
}

覆盖PhoneStateListener并设置mSubscription字段以侦听电话状态更改:

public class MultiSimListener extends PhoneStateListener {

    private Field subscriptionField;
    private int simSlot = -1;

    public MultiSimListener (int simSlot) {
        super();            
        try {
            // Get the protected field mSubscription of PhoneStateListener and set it 
            subscriptionField = this.getClass().getSuperclass().getDeclaredField("mSubscription");
            subscriptionField.setAccessible(true);
            subscriptionField.set(this, simSlot);
            this.simSlot = simSlot; 
        } catch (NoSuchFieldException e) {

        } catch (IllegalAccessException e) {

        } catch (IllegalArgumentException e) {

        }
    }

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        // Handle the event here, with state, incomingNumber and simSlot
    }

}

您还需要创建一个名为MultiSimTelephonyManager的文件。java位于[project]/src/android/telephony目录。

package android.telephony;

public interface MultiSimTelephonyManager {
    public void listen(PhoneStateListener listener,int events);
}

您可能应该做一些错误检查,特别是检查手机是否是目标型号,当使用html" target="_blank">代码时。请注意(再次),上述不会在大多数其他手机和同一手机的其他Android版本中工作。

 类似资料:
  • 经过论坛上的大量研究,现在我知道没有办法找到双SIM卡手机中两个SIM卡的IMSI或SIM序列号(除了联系制造商)。现在我改变的问题是,我们能检测到手机有两个模拟人生吗?我相信只要有一些情报就可以检测到。我能想到的几个方法是: > 拨打USSD代码并跟踪IMEI号码的日志(我在印度尝试了*139#。它起作用了。)这将给我IMEI号码的SIM卡,我从其中拨打USSD代码。(据推测,这款手机遵循And

  • 我想知道两个sim卡的运营商名称时,移动是双sim卡。在单一的SIM卡,我得到了操作员的名字,但决斗SIM卡,我不能,虽然经过这么多的搜索和尝试。 如果我在双sim手机上运行我的应用程序,我可以在我的应用程序中同时获得两个sim卡运营商名称,例如:Idea、沃达丰。 编辑: 是否有人知道如何获得IMEI号码的sim卡操作员姓名,然后我有IMEI号码。 代码:

  • 本文向大家介绍Android手机卫士之绑定sim卡序列号,包括了Android手机卫士之绑定sim卡序列号的使用技巧和注意事项,需要的朋友参考一下 现在开始具体 处理每一个导航页面的逻辑,首先看第二个导航页 这里需要实现绑定sim卡序列号的功能,注意添加相应的权限:uses-permission android:name="android.permission.READ_PHONE_STATE"

  • 本文向大家介绍Android获取手机SIM卡运营商信息的方法,包括了Android获取手机SIM卡运营商信息的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android获取手机SIM卡运营商信息的方法,对于Android程序设计有非常实用的价值。分享给大家供大家参考之用。具体方法如下: 主要功能代码如下: 权限代码如下: 希望本文所述对大家的Android程序设计有所帮助

  • sim

    sim 是一个简单的 C++ 网络服务器框架。使用这个框架,可以帮助你快速上手编写自定义的 C++ 服务器应用,避免繁琐的网络 IO 和连接管理等细节。 Sim 的报文协议设计得非常巧妙, 使得你可以用 nc/telnet 等工具配置进行调试, 快速开发。例如, 你可以用 nc 连接到 Sim 框架编写的服务器, 然后输入: ping hello world! 发给服务器请求。 demo: #in

  • null 有人帮忙吗? 谢谢,拉胡尔