因工作需要统计工作手机的通话记录,在网上找了很多手机管理软件都不能实现记录的导出。后面查了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; } }