安卓手机导出通话记录到Excel

因工作需要统计工作手机的通话记录,在网上找了很多手机管理软件都不能实现记录的导出。后面查了CSDN有很多代码,尝试自己实现。

逻辑:

1、安装安卓开发环境:Android Studio,创建一个APP项目;Android Studio界面与Eclipsel类似,安卓开发的代码有点像Visual Studio的Winform开发;

2、在安卓界面添加一个按钮:在App/res/layout/activity_main.xml中,添加按钮,有相应的图形化界面直接拖控件进来面板,然后配置需要的控件属性,代码如下:

<Button
    android:id="@+id/btCount"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:hint="统计时长不能超过40天"
    android:text="统计"
    app:layout_constraintStart_toStartOf="@+id/endDate"
    app:layout_constraintTop_toBottomOf="@+id/endDate"
    />

3、添加App的权限:在App/minifests/AndroidManifest.xml中添加访问通讯记录、写入文件的权限,不过好像没有用,主文件中还是要动态申请权限,代码如下:

<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

4、加载java读写Excel的包,下载“jxl-2.6.12.jar”并拷贝至项目(搜索android studio 导入jar包),导入成功后在app/GradleSctipts/build.gradle的dependencies中会显示导入路径;

5、在app/java/com.example.xxx目录下(即MainActivity主文件目录),创建对象类CallLogInfo和工具类ExcelUtil,代码如下:

CallLogInfo类:

package com.example.getcalllog;

import java.util.Date;

public class CallLogInfo {
    public String name;
    public String mynumber;
    public long longdate;
    public String mydate;
    public String mytime;
    public int type;
    public int duration;
    public CallLogInfo() {
        super();
    }
}
ExcelUtil类:CSDN很多,我就不拷贝了;

6、编写主函数app/java/com.example.xxx/MainActivity.java

        a)动态获取权限

        b)读取通话记录保存到对象类CallLogInfo;

        c)创建excel文件;

        d) 写入数据到excel文件;

MainActivity.java整体代码如下:

package com.example.getcalllog;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.CallLog;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        List<CallLogInfo> callLogInfoList = new ArrayList<>();

        getPersimmionInfo();
        Button bt = (Button) findViewById(R.id.btCount);
        bt.setOnClickListener(new Button.OnClickListener()
                              {
                                  @Override
                                  public void onClick(View v)
                                  {
                                      // TODO Auto-generated method stub
                                      // 在这里添加功能代码
                                      List<CallLogInfo> callLogInfos = new ArrayList<>();
                                      String result = "";

                                      callLogInfos = getCallLogInfoList();

                                      result = exportExcel(callLogInfos);

                                      TextView tv = (TextView) findViewById(R.id.tvSavePath);
                                      tv.setText("导出"+ result);
                                  }
                              });
    }

    //**************授权信息
private void getPersimmionInfo() {
    if (Build.VERSION.SDK_INT >= 23) {
        //1. 检测是否添加权限   PERMISSION_GRANTED  表示已经授权并可以使用
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
            //手机为Android6.0的版本,权限未授权去i请授权
            //2. 申请请求授权权限
            //1. Activity
            // 2. 申请的权限名称
            // 3. 申请权限的 请求码
            ActivityCompat.requestPermissions(this, new String[]
                    {Manifest.permission.READ_CALL_LOG,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE,
                            Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS
                    }, 1005);
        } else if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this, new String[]
                    {Manifest.permission.WRITE_EXTERNAL_STORAGE
                    }, 1005);
        }
    } else if (ContextCompat.checkSelfPermission(this, Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS) != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this, new String[]
                {Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS
                }, 1005);
    }
}

@SuppressLint("Range")
private List<CallLogInfo> getCallLogInfoList()
{
    List<CallLogInfo> rs = new ArrayList<>();
    Uri uri = Uri.parse("content://call_log/calls");
    Cursor cursor = getContentResolver().query(uri, null
            , null, null, CallLog.Calls.DEFAULT_SORT_ORDER// 按照时间逆序排列,最近打的最先显示
    );
    Log.d("getCallLogInfoList","cursor count:" + cursor.getCount());
    while (cursor.moveToNext()) {
        CallLogInfo info = new CallLogInfo();

        info.name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));  //姓名
        info.mynumber = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));  //号码
        info.longdate = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)); //获取通话日期
        info.mydate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(info.longdate));
        info.mytime = new SimpleDateFormat("HH:mm").format(new Date(info.longdate));
        info.duration = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION));//获取通话时长,值为多少秒
        info.type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)); //获取通话类型:1.呼入2.呼出3.未接

        rs.add(info);
    }
    return  rs;
}

@RequiresApi(api = Build.VERSION_CODES.R)
private String exportExcel(List<CallLogInfo> infos)
{
    String rs = "";

    String filePath = Environment.getExternalStorageDirectory() + "/export";
    File file = new File(filePath);
    if (!file.exists()) {
        file.mkdirs();
    }


    String excelFileName = "/export.xls";


    String[] title = {"姓名", "电话号码", "通话日期", "通话时间", "通话通话时间2", "通话类型", "通话时长"};
    String sheetName = "通话记录";


    filePath = filePath + excelFileName;

    Log.d("exportExcel",filePath);
    ExcelUtil.initExcel(filePath, sheetName, title);


    try {
        ExcelUtil.writeObjListToExcel(infos, filePath);
        rs = "成功:" + filePath;
    }catch (Exception ex){
        rs = "失败!请检查!";
        Log.d("exportExcel2",ex.getMessage());
    }

    return rs;
}

}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值