在 Android 中读取通话记录

Android 允许使用 Call Log Provider 读取通话记录。它管理对存储有关地点和已接电话信息的中央存储库的访问。Call Log Provider 是一个内容提供程序组件。

应用程序应该有权读取通话记录。因此,我们需要READ_CALL_LOG在清单文件中请求权限。

app/src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">

    <uses-permission android:name="android.permission.READ_CALL_LOG" />

    <application>
        ...
    </application>

</manifest>

ContextCompat.checkSelfPermission()使用我们检查是否授予所需权限的方法。如果没有,那么我们通过调用方法请求许可ActivityCompat.requestPermissions()

对象ContentResolver将 URI 解析为呼叫日志提供程序。该方法ContentResolver.query()返回一个Cursor. 我们遍历Cursor使用该方法moveToNext()来检索电话号码列表、通话时长(以秒为单位)和通话类型(1 – 来电,2 – 去电,3 – 未接)。

app/src/main/java/com/example/app/MainActivity.kt

package com.example.app

import android.Manifest
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.CallLog
import android.util.Log
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

class MainActivity : AppCompatActivity()
{
    private val permission: String = Manifest.permission.READ_CALL_LOG
    private val requestCode: Int = 1

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if (ContextCompat.checkSelfPermission(this, permission)
            != PackageManager.PERMISSION_GRANTED
        ) {
            ActivityCompat.requestPermissions(this, arrayOf(permission), requestCode)
        } else {
            readCallLog()
        }
    }

    private fun readCallLog()
    {
        val numberCol = CallLog.Calls.NUMBER
        val durationCol = CallLog.Calls.DURATION
        val typeCol = CallLog.Calls.TYPE // 1 - Incoming, 2 - Outgoing, 3 - Missed

        val projection = arrayOf(numberCol, durationCol, typeCol)

        val cursor = contentResolver.query(
            CallLog.Calls.CONTENT_URI,
            projection, null, null, null
        )

        val numberColIdx = cursor!!.getColumnIndex(numberCol)
        val durationColIdx = cursor.getColumnIndex(durationCol)
        val typeColIdx = cursor.getColumnIndex(typeCol)

        while (cursor.moveToNext()) {
            val number = cursor.getString(numberColIdx)
            val duration = cursor.getString(durationColIdx)
            val type = cursor.getString(typeColIdx)

            Log.d("MY_APP", "$number $duration $type")
        }

        cursor.close()
    }
}

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论