双卡android设备的通话记录

双卡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() {

我正在使用下面的代码获取通话记录详细信息,这对于单SIM卡设备来说效果很好,但是当涉及到双SIM卡时,问题就出现了。我正试图找到从双sim卡设备获取日志的方法

/**
     * 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来安卓编码室我们将在那里讨论。您能解释一下吗