我有一个检测来电的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。任何人都可以帮助我吗?
答案 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();
}