Unity获取手机通话记录《二》安卓端

上一篇简单记录了一下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<CallLogInfoBean> getCallLogInfos(Context context, long lastPostTime) {
        List<CallLogInfoBean> 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<NativeAppInfoBean> 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<CallLogInfoBean> callLogInfos = CallLogUtils.getCallLogInfos(this, 0);
        return  "{\"records\":" + callLogInfos.toString()+"}";
    }

    /**
     * 读取本机通讯录信息
     *
     * @throws Throwable
     */
    private String readContact() {
        try {
            List<ContactBean> 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的代码如下

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.crf.xfd" >
    <!--读取手机通话记录权限-->
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <!-- 读联系人权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <!--读取短信信息的权限-->
    <uses-permission android:name="android.permission.READ_SMS" />

    <application
        android:theme="@android:style/Theme.NoTitleBar" >
        <activity android:name=".GetInfoManager" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="unityplayer.UnityActivity"
                android:value="true" />
        </activity>
    </application>
</manifest>


最后打包运行截图


我会把源码跟工程地址直接贴给大家

安卓端工程代码: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列表的获取


猜你喜欢

转载自blog.csdn.net/qq_37310110/article/details/80652970
今日推荐