欢迎加入Unity业内qq交流群:956187480
qq扫描二维码加群
上一篇简单记录了一下unity获取通讯录的过程,这一篇咱们就了解一下通话记录跟app列表的获取,其实大体流程跟上一篇的获取通讯录一样的,只不过代码不一样而已,时间因素我就不详细解说直接上代码有疑问的可以在下面留言我看到了能帮就会帮。
我会把源码跟工程地址直接贴给大家
获取通话记录:最后输出类型是json数据,如果大家有特殊需求的话可以自定义
package com.crf.xfd.entrty;
public class CallLogInfoBean {
private int id;
private String name; // 名称
private String number; // 号码
private String date; // 日期
private int type; // 来电:1,拨出:2,未接:3
private int count; // 通话次数
private long duration;//通话时长
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public long getDuration() {
return duration;
}
public void setDuration(long duration) {
this.duration = duration;
}
@Override
public String toString() {
return "{\"call_no\":" + "\""+ number + "\","
+ "\"call_date\":" +"\""+ date + "\","
+"\"call_type\":" +"\""+ type +"\","
+ "\"duration\":" +"\""+ duration +"\","
+ "\"call_name\":" + "\""+name + "\","
+ "\"count\":" +"\""+ count +"\"}";
}
}
package com.crf.xfd.tools;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.CallLog;
import com.crf.xfd.entrty.CallLogInfoBean;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class CallLogUtils {
// private static final Uri uri = CallLog.Calls.CONTENT_URI;
private static final Uri uri = Uri.parse("content://call_log/calls");
private static final String[] projection = {
CallLog.Calls.DATE, // 日期
CallLog.Calls.NUMBER, // 号码
CallLog.Calls.TYPE, // 类型
CallLog.Calls.CACHED_NAME, // 名字
CallLog.Calls._ID, // id
CallLog.Calls.DURATION//通话时长
};
public static List getCallLogInfos(Context context, long lastPostTime) {
List callLogInfos = new ArrayList();
SimpleDateFormat sfd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//获取ContentResolver
ContentResolver contentResolver = context.getContentResolver();
if (lastPostTime == 0) {
lastPostTime = System.currentTimeMillis() - 90 * 24 * 60 * 60 * 1000l;
}
Cursor cursor = contentResolver.query(uri, projection, null, null,
CallLog.Calls.DEFAULT_SORT_ORDER);
if (cursor != null && cursor.getCount() > 0) {
Date date;
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToPosition(i);
if (lastPostTime > cursor.getLong(cursor
.getColumnIndex(CallLog.Calls.DATE))) {
continue;
}
date = new Date(cursor.getLong(cursor
.getColumnIndex(CallLog.Calls.DATE)));
String number = cursor.getString(cursor
.getColumnIndex(CallLog.Calls.NUMBER));
int type = cursor.getInt(cursor
.getColumnIndex(CallLog.Calls.TYPE));
String cachedName = cursor.getString(cursor
.getColumnIndex(CallLog.Calls.CACHED_NAME));
int id = cursor.getInt(cursor
.getColumnIndex(CallLog.Calls._ID));
long duration = cursor.getLong(cursor
.getColumnIndex(CallLog.Calls.DURATION));
CallLogInfoBean callLog = new CallLogInfoBean();
callLog.setId(id);
callLog.setNumber(number);
callLog.setName(cachedName);
callLog.setDuration(duration);
if (null == cachedName || "".equals(cachedName)) {
callLog.setName(number);
}
callLog.setType(type);
callLog.setDate(sfd.format(date));
callLogInfos.add(callLog);
}
}
return callLogInfos;
}
}
跟unity交互的主要的类
package com.crf.xfd;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.widget.Toast;
import com.crf.xfd.entrty.CallLogInfoBean;
import com.crf.xfd.entrty.ContactBean;
import com.crf.xfd.entrty.NativeAppInfoBean;
import com.crf.xfd.tools.CallLogUtils;
import com.crf.xfd.tools.ContactUtil;
import com.crf.xfd.tools.NativeAppUtils;
import com.crf.xfd.tools.PermissionUtil;
import com.unity3d.player.UnityPlayerActivity;
import java.util.List;
public class GetInfoManager extends UnityPlayerActivity{
private int callLogRequestCode = 1;
private int contactRequestCode = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// 获取本机安装应用的列表
public String GetAppList(){
try {
List allApps = NativeAppUtils.getAllApps(this, 0);
return "{\"app_list\":"+ allApps.toString()+"}";
} catch (Throwable throwable) {
throwable.printStackTrace();
return null;
}
}
//获取本机通讯录
@RequiresApi(api = Build.VERSION_CODES.M)
public String GetContact(){
boolean isReadContact = checkPermission(Manifest.permission.READ_CONTACTS);
if (isReadContact) {
return readContact();
} else {
requestPerssion(new String[]{Manifest.permission.READ_CONTACTS}, contactRequestCode);
return null;
}
}
//读取本机通话记录
@RequiresApi(api = Build.VERSION_CODES.M)
public String GetCallLog(){
boolean b = checkPermission(Manifest.permission.READ_CALL_LOG);
if (b) {
return readCallLog();
} else {
requestPerssion(new String[]{Manifest.permission.READ_CALL_LOG}, callLogRequestCode);
return null;
}
}
/**
* 读取通话记录
*/
private String readCallLog() {
List callLogInfos = CallLogUtils.getCallLogInfos(this, 0);
return "{\"records\":" + callLogInfos.toString()+"}";
}
/**
* 读取本机通讯录信息
*
* @throws Throwable
*/
private String readContact() {
try {
List allContact = ContactUtil.getAllContact(this);
return "{\"phones\":" + allContact.toString() +"}";
} catch (Throwable throwable) {
throwable.printStackTrace();
return null;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == callLogRequestCode) {
readCallLog();
} else if (requestCode == contactRequestCode) {
readContact();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (callLogRequestCode == requestCode) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//已经授权
readCallLog();
} else {
//点击了不再提示,拒绝权限
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
//跳转到设置界面
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, callLogRequestCode);
} else {
Toast.makeText(this, "权限拒绝", Toast.LENGTH_SHORT).show();
}
}
} else if (contactRequestCode == requestCode) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//已经授权
readContact();
} else {
//点击了不再提示,拒绝权限
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
//跳转到设置界面
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, callLogRequestCode);
} else {
Toast.makeText(this, "权限拒绝", Toast.LENGTH_SHORT).show();
}
}
}
}
/**
* 检查权限
*
* @param permission
* @return
*/
@RequiresApi(api = Build.VERSION_CODES.M)
public boolean checkPermission(String permission) {
boolean b = PermissionUtil.checkPermissionWrapper(this, permission);
return b;
}
/**
* 申请权限
*
* @param permission
* @param requestCode
*/
public void requestPerssion(String[] permission, int requestCode) {
PermissionUtil.requestPermissionsWrapper(this, permission, requestCode);
}
}
上一篇忘了帖AndroidManifest的代码如下
最后打包运行截图
我会把源码跟工程地址直接贴给大家
安卓端工程代码:https://download.csdn.net/download/qq_37310110/10471920
Unity端工程代码:https://download.csdn.net/download/qq_37310110/10471930
二合一最新优化更新简单易懂版本:https://download.csdn.net/download/qq_37310110/10472555
下一篇简单讲解app列表的获取
欢迎加入Unity业内qq交流群:956187480
qq扫描二维码加群