gpt4 book ai didi

android - sim 接听电话的双 sim android 手机

转载 作者:搜寻专家 更新时间:2023-11-01 08:41:00 25 4
gpt4 key购买 nike

我有一个检测来电的 Android 应用程序,我需要改进这个应用程序以在 duos 移动设备上运行。所以我创建了一个在 list 中注册的广播接收器以进行操作:电话状态已更改,并且在我的 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 所以这个方法不起作用,我的意思是 which sim 在所有情况下都返回 -1。谁能帮帮我?

最佳答案

Android 直到 Android 5.1 才支持双卡手机,因此任何支持它的扩展都可能是特定于设备和版本的。以下内容专门针对使用 MultiSimTelephonyManager 变体处理双模拟的手机类别,包括 Android 4.4.4 下的 Samsung duos galaxy J1。

基本上,此类双卡手机使用 MultiSimTelephonyManager 的两个实例,是常规 TelephonyManager 的子类并且各自负责一个SIM卡槽,作为控制手机的接口(interface)。

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

MultiSimTelephonyManager类和PhoneStateListenermSubscription字段均不在标准SDK中。要编译应用程序以使用这些接口(interface),需要 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
}

}

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

package android.telephony;

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

在使用代码时,您可能应该进行一些错误检查,尤其是检查手机是否为目标型号。请(再次)警告,以上内容不适用于大多数其他手机和同一手机的其他 Android 版本。

关于android - sim 接听电话的双 sim android 手机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32707158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com