因工作需要统计工作手机的通话记录,在网上找了很多手机管理软件都不能实现记录的导出。后面查了优快云有很多代码,尝试自己实现。
逻辑:
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类:优快云很多,我就不拷贝了;
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;
}
}
本文介绍了一种通过自定义Android应用程序来导出手机通话记录的方法。主要步骤包括:设置开发环境、添加用户界面元素、配置应用权限、导入必要的库、创建数据模型及工具类,并最终实现在点击按钮后导出通话记录到Excel文件的功能。
3380

被折叠的 条评论
为什么被折叠?



