我想检查哪个 SIM 正在为 DUAL SIM android 手机拨打电话。阅读本文Android:检查手机是否为双卡。
像魅力一样工作,检测 sim 状态以及手机是否为双 SIM 卡。下一步是在拨出呼叫请求期间获取 SIM 信息,以便我知道哪个 SIM 正在拨打电话并据此采取一些措施。
有人可以帮我吗?
我想检查哪个 SIM 正在为 DUAL SIM android 手机拨打电话。阅读本文Android:检查手机是否为双卡。
像魅力一样工作,检测 sim 状态以及手机是否为双 SIM 卡。下一步是在拨出呼叫请求期间获取 SIM 信息,以便我知道哪个 SIM 正在拨打电话并据此采取一些措施。
有人可以帮我吗?
我已经测试过,对于果冻豆,我能够成功识别拨号 SIM 卡。还使用三重 SIM 卡设备进行了测试,效果非常好。
BroadcastReceiver 中的代码片段:
int whichSIM = 0; // this for security fallback to SIM 1
if (intent.getExtras().containsKey("subscription")) {
whichSIM = intent.getExtras().getInt("subscription");
}
// do whatever you need to with the information
您可以在通话后使用 PhoneStateListener,您可以确定拨出电话来自 sim 1 或 sim2,如下面的代码所示。
private class CallStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
//super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
Log.i(TAG, "Idle " + state);
//when Idle i.e no call
if (flag.equals("outgoingcall") ) {
// Put in delay because call log is not updated immediately
// when state changed
// The dialler takes a little bit of time to write to it
// 500ms seems to be enough
handler.postDelayed(new Runnable() {
@Override
public void run() {
// get start of cursor
Log.i("CallLogDetailsActivity","Getting Log activity...");
cur = ctx.getContentResolver().query(CallLog.Calls.CONTENT_URI, null, null,null, CallLog.Calls.DATE + " desc");
int number = cur.getColumnIndex(CallLog.Calls.NUMBER);
int type = cur.getColumnIndex(CallLog.Calls.TYPE);
int date = cur.getColumnIndex(CallLog.Calls.DATE);
int duration = cur.getColumnIndex(CallLog.Calls.DURATION);
//Check if call was made from sim 1 or sim 2 , if it returns 0 its from sim 1 else if 1 its from sim 2.
int idSimId = getSimIdColumn(cur);
String callid = "0";
if (cur.moveToFirst() == true) {
phNumber = cur.getString(number);
callType = cur.getString(type);
callDate = cur.getString(date);
callDayTime = new Date(Long.valueOf(callDate));
callDuration = Integer.valueOf(cur.getString(duration));
dir = null;
int dircode = Integer.parseInt(callType);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "INCOMING";
break;
case CallLog.Calls.MISSED_TYPE:
dir = "MISSED";
break;
}
if(idSimId >= 0){
callid = cur.getString(idSimId);
}
cur.close();
TelephonyInfo telephonyInfo = TelephonyInfo.getInstance(ctx);
boolean isDualSIM = telephonyInfo.isDualSIM();
if (isDualSIM) {
if(callid.equals("1")){
simserailno = telephonyInfo.getImeiSIM2();
}else {
simserailno = telephonyInfo.getImeiSIM1();
}
} else {
simserailno = tmgr.getSimSerialNumber();
}
if (tmgr.isNetworkRoaming()) {
roaming = 1;
} else {
roaming = 0;
}
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
StringBuffer sb = new StringBuffer();
sb.append("Outgoing Call Log"
+ "\nPhone Number:--- " + phNumber
+ " \nCall Type:--- " + dir
+ " \nCall Date:--- " + sdfDate.format(Long.valueOf(callDate))
+ " \nDual isDualSIM:--- " + isDualSIM
+ " \nSIM 1 imei:--- " + telephonyInfo.getImeiSIM1()
+ " \nSIM 2 imei:--- " + telephonyInfo.getImeiSIM2()
+ " \nCalling Sim:--- " + callid
+ " \nDevice Number :--- " + Imeinumber
+ " \nSim Number :--- " + simserailno
+ " \nSubcscriber Number :--- " + subidno
+ " \nRoaming :--- " + tmgr.isNetworkRoaming()
+ " \nCall duration in sec :--- " + callDuration);
sb.append("\n----------------------------------");
Log.i("sb", sb.toString());
Toast.makeText(ctx, sb.toString(),Toast.LENGTH_LONG).show();
}
flag = "";
}
}, 1500);
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(TAG, "offhook " + state);
flag= "outgoingcall";
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.i(TAG, "Ringing " + state);
//when Ringing
// Log.i(TAG, "Incomng Number to sim1: " + incomingNumber);
String msg = "Detected Incoming Call number: " + incomingNumber;
Toast.makeText(ctx, msg, Toast.LENGTH_LONG).show();
flag = "oncall";
break;
default:
break;
}
}
}
用于检测是否从 sim 1 或 sim 2 进行呼叫的代码片段
public static int getSimIdColumn(final Cursor c) {
for (String s : new String[] { "sim_id", "simid", "sub_id" }) {
int id = c.getColumnIndex(s);
if (id >= 0) {
Log.d(TAG, "sim_id column found: " + s);
return id;
}
}
Log.d(TAG, "no sim_id column found");
return -1;
}
您可以创建 BroadcastReceiver,它将接受所有拨出电话。然后:
String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
int slot=intent.getIntExtra("com.android.phone.extra.slot",-1);
//0 or 1 are valid in my case
number is dialed number
slot 是您拨打电话的插槽
您需要注册该接收器,并提供适当的权限。这也适用于拨打的 USSD 代码。它在 Privileg GSM S7589 2 SIM 卡上测试,Android 4.2.1
intent.putExtra("simSlot", 0); //For sim 1
intent.putExtra("simSlot", 1); //For sim 2
参考这个链接
network
数据库中有CallLog.Calls
,你可以从那里得到它。