双卡android设备的通话记录
我正在使用下面的代码获取通话记录详细信息,这对于单SIM卡设备来说效果很好,但是当涉及到双SIM卡时,问题就出现了。我正试图找到从双sim卡设备获取日志的方法双卡android设备的通话记录,android,calllog,dual-sim,Android,Calllog,Dual Sim,我正在使用下面的代码获取通话记录详细信息,这对于单SIM卡设备来说效果很好,但是当涉及到双SIM卡时,问题就出现了。我正试图找到从双sim卡设备获取日志的方法 /** * Get All Call Logs details as JSON * * @param context */ @SuppressLint("SimpleDateFormat") private void getInitialCallDetailsAsJSON() {
/**
* Get All Call Logs details as JSON
*
* @param context
*/
@SuppressLint("SimpleDateFormat")
private void getInitialCallDetailsAsJSON() {
// Print dates of the current week starting on Monday
DateFormat df = new SimpleDateFormat("dd-MMM-yyyy hh:mm aa",
Locale.getDefault());
final Uri contacts = CallLog.Calls.CONTENT_URI;
final Cursor managedCursor = getContentResolver().query(contacts, null,
null, null, null);
final int name = managedCursor
.getColumnIndex(CallLog.Calls.CACHED_NAME);
final int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
final int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
final int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
final int durationOfCall = managedCursor
.getColumnIndex(CallLog.Calls.DURATION);
final JSONObject allDetailsJsonObject = new JSONObject();
final JSONArray array = new JSONArray();
if (managedCursor != null && managedCursor.getCount() > 0) {
while (managedCursor.moveToNext()) {
String contactName = managedCursor.getString(name);
final String phoneNumber = managedCursor.getString(number);
final String callTypeIndex = managedCursor.getString(type);
final String callDate = managedCursor.getString(date);
final String callDurationSeconds = managedCursor
.getString(durationOfCall);
final int totalTime = Integer.parseInt(callDurationSeconds);
int day = (int) TimeUnit.SECONDS.toDays(totalTime);
long hours = TimeUnit.SECONDS.toHours(totalTime) - (day * 24);
long minute = TimeUnit.SECONDS.toMinutes(totalTime)
- (TimeUnit.SECONDS.toHours(totalTime) * 60);
long second = TimeUnit.SECONDS.toSeconds(totalTime)
- (TimeUnit.SECONDS.toMinutes(totalTime) * 60);
String callDurationFormatted = "";
if (hours < 10) {
callDurationFormatted += "0" + hours + "h ";
} else {
callDurationFormatted += hours + "h ";
}
if (minute < 10) {
callDurationFormatted += "0" + minute + "m ";
} else {
callDurationFormatted += minute + "m ";
}
if (second < 10) {
callDurationFormatted += "0" + second + "s";
} else {
callDurationFormatted += second + "s";
}
String callType = null;
final int dircode = Integer.parseInt(callTypeIndex);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
callType = CallAnalyticsConstant.OUTGOING;
break;
case CallLog.Calls.INCOMING_TYPE:
callType = CallAnalyticsConstant.INCOMING;
break;
case CallLog.Calls.MISSED_TYPE:
callType = CallAnalyticsConstant.MISSED;
break;
}
if (contactName == null || contactName.equalsIgnoreCase("")) {
contactName = "UNKNOWN";
}
}
managedCursor.close();
}
/**
*以JSON格式获取所有调用日志详细信息
*
*@param上下文
*/
@SuppressLint(“SimpleDataFormat”)
私有void getInitialCallDetailsAsJSON(){
//打印从星期一开始的当前星期的日期
DateFormat df=新的简化格式(“dd-MMM-yyy-hh:mm-aa”,
Locale.getDefault());
最终Uri联系人=CallLog.Calls.CONTENT\u Uri;
最终游标managedCursor=getContentResolver().query(联系人,null,
空,空,空);
final int name=managedCursor
.getColumnIndex(CallLog.Calls.CACHED_NAME);
final int number=managedCursor.getColumnIndex(CallLog.Calls.number);
final int type=managedCursor.getColumnIndex(CallLog.Calls.type);
final int date=managedCursor.getColumnIndex(CallLog.Calls.date);
最终int durationOfCall=managedCursor
.getColumnIndex(CallLog.Calls.DURATION);
最终JSONObject allDetailsJsonObject=新JSONObject();
final JSONArray数组=新的JSONArray();
if(managedCursor!=null&&managedCursor.getCount()>0){
while(managedCursor.moveToNext()){
String contactName=managedCursor.getString(name);
最终字符串phoneNumber=managedCursor.getString(数字);
最终字符串callTypeIndex=managedCursor.getString(类型);
最终字符串callDate=managedCursor.getString(日期);
最终字符串callDurationSeconds=managedCursor
.getString(调用的持续时间);
final int totalTime=Integer.parseInt(callDurationSeconds);
整数天=(整数)时间单位。秒。今天(总时间);
长时间=时间单位。秒。到小时(总时间)-(天*24);
长分钟=时间单位。秒。至分钟(总时间)
-(时间单位:秒至小时(总时间)*60);
长秒=时间单位。秒。到秒(总时间)
-(时间单位:秒至分钟(总时间)*60);
字符串callDurationFormatted=“”;
如果(小时<10){
callDurationFormatted+=“0”+小时数+“h”;
}否则{
callDurationFormatted+=hours+“h”;
}
如果(分钟<10){
callDurationFormatted+=“0”+分钟+“m”;
}否则{
callDurationFormatted+=分钟+“m”;
}
如果(秒<10){
callDurationFormatted+=“0”+秒+“s”;
}否则{
callDurationFormatted+=第二个+“s”;
}
字符串callType=null;
final int dircode=Integer.parseInt(callTypeIndex);
开关(dircode){
案例CallLog.Calls.OUTGOING_类型:
callType=CallAnalyticsConstant.OUTGOING;
打破
案例CallLog.Calls.INCOMING_类型:
callType=CallAnalyticsConstant.INCOMING;
打破
案例CallLog.Calls.MISSED_类型:
callType=CallAnalyticsConstant.MISSED;
打破
}
if(contactName==null | | contactName.equalsIgnoreCase(“”){
contactName=“未知”;
}
}
managedCursor.close();
}
如果有人有任何想法,请帮助我获取双sim卡电话的呼叫相关详细信息
适用于双卡手机的应用程序-以下是提供所有通话记录详细信息的方法
private void getCallDetails() {
StringBuffer sb = new StringBuffer();
Cursor managedCursor = managedQuery( CallLog.Calls.CONTENT_URI,null, null,null, null);
int number = managedCursor.getColumnIndex( CallLog.Calls.NUMBER );
int type = managedCursor.getColumnIndex( CallLog.Calls.TYPE );
int date = managedCursor.getColumnIndex( CallLog.Calls.DATE);
int duration = managedCursor.getColumnIndex( CallLog.Calls.DURATION);
sb.append( "Call Details :");
while ( managedCursor.moveToNext() ) {
String phNumber = managedCursor.getString( number );
String callType = managedCursor.getString( type );
String callDate = managedCursor.getString( date );
Date callDayTime = new Date(Long.valueOf(callDate));
String callDuration = managedCursor.getString( duration );
String 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;
}
sb.append( "\nPhone Number:--- "+phNumber +" \nCall Type:--- "+dir+" \nCall Date:--- "+callDayTime+" \nCall duration in sec :--- "+callDuration );
sb.append("\n----------------------------------");
}
managedCursor.close();
System.out.println(sb.toString());
}
另外,不要忘记在Manifest.Xml中添加这些权限
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
您可以使用“sub_id”常量值获取有关sim卡的信息
此值CallLog.Calls.SUB_ID=“SUB_ID”的完整路径,但不可用于公共,因此只需在21之前的API中硬编码即可。对于>=21,您可以使用电话\帐户\组件\名称
/**
* The subscription ID used to place this call. This is no longer used and has been
* replaced with PHONE_ACCOUNT_COMPONENT_NAME/PHONE_ACCOUNT_ID.
* For ContactsProvider internal use only.
* <P>Type: INTEGER</P>
*
* @Deprecated
* @hide
*/
public static final String SUB_ID = "sub_id";
/**
*用于拨打此电话的订阅ID。此ID已不再使用,并且已被删除
*替换为电话\帐户\组件\名称/电话\帐户\ ID。
*仅供联系人内部使用。
*类型:整数
*
*@弃用
*@隐藏
*/
公共静态最终字符串SUB_ID=“SUB_ID”;
玩得开心:)什么版本的操作系统(4.0、4.1…)对于单卡和双卡,你测试过哪个版本的双卡?对于单卡Android版本4.1.2-索尼Xperia P.对于双卡Android版本4.0.4-Micromax A110 Canvas 2,我认为这与安全性无关,因为通话记录监视器在两台设备上都能完美地工作。因此,这与安全性无关。我认为这是我们需要解决的一些技巧或工作不知道,但呼叫日志监视器开发人员做到了。因此,我试图找出这一点。希望此帮助扫描u突出差异??(OPs代码适用于单sim卡,而不是双sim卡)@Android Guru,很抱歉,它不起作用。你的代码和我的代码只有一个区别,那就是你使用了managedQuery,我使用了query。感谢你的时间,但不幸的是它不起作用,还有一件事是managedQuery已被弃用,不建议使用。再次感谢,我必须深入了解详细信息才能找到答案swer@Scorpion这段代码对我有效。我正在使用Micro max Canvas HD进行测试。您正在使用哪种设备进行测试?我正在使用Micromax A110,但它不工作,我也在Moto G上进行了测试,但不工作。@Scorpion来安卓编码室我们将在那里讨论。您能解释一下吗