sim卡接收电话的双卡安卓手机

时间:2015-09-22 01:49:04

标签: android telephonymanager

我有一个检测来电的Android应用程序,我需要改进这个应用程序才能在二重奏移动设备上运行。 所以我创建了一个在清单中注册的广播接收器用于操作:电话状态已更改,在我的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 个答案:

答案 0 :(得分:3)

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

基本上这类双卡手机使用两个MultiSimTelephonyManager实例,从常规TelephonyManager继承,每个实例负责一个SIM插槽,作为控制手机的界面。

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

MultiSimTelephonyManager类和mSubscription PhoneStateListener字段都不在标准SDK中。要编译应用程序以使用这些界面,需要Java Reflection。

以下代码应粗略说明如何从来电中获取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版本。

答案 1 :(得分:0)

This question建议<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="25dp" android:paddingRight="25dp"> <LinearLayout android:orientation="vertical" android:id="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true"/> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitCenter" android:layout_above="@id/linearLayout" android:layout_centerHorizontal="true" android:src="@mipmap/ic_launcher" /> </RelativeLayout> 也可能适用于某些手机。也许尝试两个并使用没有返回"com.android.phone.extra.slot"的那个?

答案 2 :(得分:0)

您是否尝试过此方法:- 在这种方法中,对于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();

        }