Java 获取双sim安卓移动设备中两个sim卡插槽的IMEI

Java 获取双sim安卓移动设备中两个sim卡插槽的IMEI,java,android,imei,dual-sim,Java,Android,Imei,Dual Sim,我正在为双sim手机创建一个应用程序。应用程序应该能够检测用户拨打电话的sim卡。它可以是呼出或呼入电话。我已尝试使用获取设备的两个IMEI编号。但对于第二个IMEI编号,它返回null 我必须如何检测用户在拨打或接听电话时使用的sim卡。 请提出实现这一目标的任何方法 要在控制台中查看SIM1类型的状态: adb shell dumpsys telephony.registry adb shell dumpsys telephony.registry2 要在控制台中查看SIM2类型的状态,

我正在为双sim手机创建一个应用程序。应用程序应该能够检测用户拨打电话的sim卡。它可以是呼出或呼入电话。我已尝试使用获取设备的两个IMEI编号。但对于第二个IMEI编号,它返回null

我必须如何检测用户在拨打或接听电话时使用的sim卡。


请提出实现这一目标的任何方法

要在控制台中查看SIM1类型的状态:

adb shell dumpsys telephony.registry
adb shell dumpsys telephony.registry2
要在控制台中查看SIM2类型的状态,请执行以下操作:

adb shell dumpsys telephony.registry
adb shell dumpsys telephony.registry2
mCallState
在传入/传出呼叫时更改。它可以让你知道哪个SIM卡用于通话


当您从Java应用程序调用
dumpsys
时,您需要清单中的
android.permission.DUMP
。但它在一些新设备上不起作用(它们会因“拒绝许可”而失败)。

这可能会为您提供双sim卡手机的imei

    public static void samsungTwoSims(Context context) {
TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

try{

    Class<?> telephonyClass = Class.forName(telephony.getClass().getName());

    Class<?>[] parameter = new Class[1];
    parameter[0] = int.class;
    Method getFirstMethod = telephonyClass.getMethod("getDefault", parameter);

    Log.d(TAG, getFirstMethod.toString());

    Object[] obParameter = new Object[1];
    obParameter[0] = 0;
    TelephonyManager first = (TelephonyManager) getFirstMethod.invoke(null, obParameter);

    Log.d(TAG, "Device Id: " + first.getDeviceId() + ", device status: " + first.getSimState() + ", operator: " + first.getNetworkOperator() + "/" + first.getNetworkOperatorName());

    obParameter[0] = 1;
    TelephonyManager second = (TelephonyManager) getFirstMethod.invoke(null, obParameter);

    Log.d(TAG, "Device Id: " + second.getDeviceId() + ", device status: " + second.getSimState()+ ", operator: " + second.getNetworkOperator() + "/" + second.getNetworkOperatorName());
} catch (Exception e) {
    e.printStackTrace();
}   
公共静态无效samsungTwoSims(上下文){
TelephonyManager telephony=(TelephonyManager)context.getSystemService(context.telephony_服务);
试一试{
类telephonyClass=Class.forName(telephony.getClass().getName());
Class[]参数=新类[1];
参数[0]=int.class;
方法getFirstMethod=telephonyClass.getMethod(“getDefault”,参数);
Log.d(标记,getFirstMethod.toString());
Object[]对象参数=新对象[1];
obParameter[0]=0;
TelephonyManager first=(TelephonyManager)getFirstMethod.invoke(null,obParameter);
Log.d(标记,“设备Id:+first.getDeviceId()+”,设备状态:“+first.getSimState()+”,运算符:“+first.getNetworkOperator()+”/“+first.getNetworkOperatorName());
对象参数[0]=1;
TelephonyManager second=(TelephonyManager)getFirstMethod.invoke(null,obParameter);
Log.d(标记,“设备Id:+second.getDeviceId()+”,设备状态:“+second.getSimState()+”,运算符:“+second.getNetworkOperator()+”/“+second.getNetworkOperatorName());
}捕获(例外e){
e、 printStackTrace();
}   

}

@Pied Piper请仔细研究这个问题。好吧,双sim卡的实施是OEM特有的,而且设计因供应商而异。您需要使用反射来找到可以返回SIM数据的确切类。试错法[获取双卡android移动设备中两个sim卡插槽的IMEI][1][1]: