我有一个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在所有情况下。有人能帮帮我吗?
您是否尝试过此方法:-在此方法中,您将为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();
}
这个问题表明“com.android.phone.extra.slot”
可能也适用于某些手机。也许可以同时尝试这两种方法并使用未返回-1
的方法?
Android在Android 5.1之前不支持双sim手机,因此支持双sim手机的任何扩展都可能是特定于设备和版本的。以下是使用MultiSimTelephonyManager
变体来处理双SIM卡的特定手机类别,包括Android 4.4下的三星duos galaxy J1。4.
基本上,这类双sim手机使用两个MultiSimTelephonyManager
实例作为控制手机的接口,该实例从常规TelephonyManager中派生出来,每个实例负责一个sim卡插槽。
检测进线量的方法之一是使用PhoneStateListener类(而不是使用接收器)来检测电话状态的变化。这些电话中的PhoneStateListener
被修改(而不是子类化),以包括一个应指示监听器的SIM卡槽的mSubcription
字段。
标准SDK中不包含PhoneStateListener
的MultiSimTelephonyManager
类和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 是一个简单的 C++ 网络服务器框架。使用这个框架,可以帮助你快速上手编写自定义的 C++ 服务器应用,避免繁琐的网络 IO 和连接管理等细节。 Sim 的报文协议设计得非常巧妙, 使得你可以用 nc/telnet 等工具配置进行调试, 快速开发。例如, 你可以用 nc 连接到 Sim 框架编写的服务器, 然后输入: ping hello world! 发给服务器请求。 demo: #in
null 有人帮忙吗? 谢谢,拉胡尔