如何在通话日志中访问未接来电



我已经搜索了许多访问呼叫日志的解决方案,但大多数都不推荐使用,我真的需要访问呼叫日志并为我的毕业项目获取未接来电的解决方案大多数代码必须具有使用权限读取和写入呼叫日志,但它不能太

这是我在清单中添加的使用权限代码。

Uri allCalls = Uri.parse("content://call_log/calls");
Cursor c = managedQuery(allCalls, null, null, null, null);
String num= c.getString(c.getColumnIndex(CallLog.Calls.NUMBER));// for  number
String name= c.getString(c.getColumnIndex(CallLog.Calls.CACHED_NAME));// for name
String duration = c.getString(c.getColumnIndex(CallLog.Calls.DURATION));// for duration
int type = Integer.parseInt(c.getString(c.getColumnIndex(CallLog.Calls.TYPE)));// for call type, Incoming or out going.
Toast.makeText(MainActivity.this, num, Toast.LENGTH_SHORT).show();

错误:

java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.CallLogProvider from ProcessRecord{6cd48b2 23881:com.example.d_actions/u0a108} (pid=23881, uid=10108) requires android.permission.READ_CALL_LOG or android.permission.WRITE_CALL_LOG

编辑:则不赞成使用CCD_ 1。

将其添加到上面的manifest.xml标签中:

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

您还需要在6.0中获得运行时权限>设备

final String[] NECESSARY_PERMISSIONS = new String[] {Manifest.permission.GET_ACCOUNTS };
if (ContextCompat.checkSelfPermission(DialerHomeActivity.this,
Manifest.permission.GET_ACCOUNTS) == PackageManager.PERMISSION_GRANTED) {
//Permission is granted
} else {
//ask for permission
ActivityCompat.requestPermissions(
DialerHomeActivity.this,
NECESSARY_PERMISSIONS, 123);
}

1。Manifest.xml

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

注意:Google Play限制使用高风险或敏感权限,包括SMS或呼叫日志权限组。所以在简而言之,即使您在运行时请求许可,也很有可能您的应用程序将不允许在Google Play中使用。

不过,您可以申请例外。Google Play将审查根据具体情况请求和批准例外情况。的标准允许例外情况。

2样本

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
checkLogList()
}
private fun checkLogList() {
if (checkPermission()) {
readCallHistory()
} else {
requestPermission()
}
}
private fun requestPermission() {
ActivityCompat.requestPermissions(
this,
arrayOf(permission.READ_CALL_LOG),
PERMISSION_REQUEST_CODE
)
}
private fun checkPermission(): Boolean {
val result = ContextCompat.checkSelfPermission(applicationContext, permission.READ_CALL_LOG)
return result == PackageManager.PERMISSION_GRANTED
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
PERMISSION_REQUEST_CODE -> if (grantResults.size > 0) {
val locationAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED
if (locationAccepted) Snackbar.make(
findViewById(android.R.id.content),
"Permission Granted, Now you can access log list",
Snackbar.LENGTH_LONG
).show() else {
Snackbar.make(
findViewById(android.R.id.content),
"Permission Denied, You cannot access log list.",
Snackbar.LENGTH_LONG
).show()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (shouldShowRequestPermissionRationale(permission.READ_CALL_LOG)) {
showMessageOKCancel(
"You need to allow access to the permissions"
) { dialog, which ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(
arrayOf(permission.READ_CALL_LOG),
PERMISSION_REQUEST_CODE
)
}
}
return
}
}
}
}
}
}
private fun showMessageOKCancel(message: String, okListener: DialogInterface.OnClickListener) {
AlertDialog.Builder(this@MainActivity)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show()
}
fun readCallHistory() {
val managedCursor =
this.contentResolver.query(CallLog.Calls.CONTENT_URI, null, null, null, null)
val number = managedCursor!!.getColumnIndex(CallLog.Calls.NUMBER)
val type = managedCursor.getColumnIndex(CallLog.Calls.TYPE)
val date = managedCursor.getColumnIndex(CallLog.Calls.DATE)
val duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION)
while (managedCursor.moveToNext()) {
val phNumber = managedCursor.getString(number)
val callType = managedCursor.getString(type)
val callDate = managedCursor.getString(date)
val callDayTime = Date(java.lang.Long.valueOf(callDate))
val callDuration = managedCursor.getString(duration)
var dir: String? = null
val dircode: Int = callType.toInt()
when (dircode) {
CallLog.Calls.OUTGOING_TYPE -> dir = "OUTGOING"
CallLog.Calls.INCOMING_TYPE -> dir = "INCOMING"
CallLog.Calls.MISSED_TYPE -> dir = "MISSED"
}
Log.e("print_output", "Phone Number:--- $phNumber")
Log.e("print_output", "Call Type:--- $dir")
Log.e("print_output", "Call Date:--- $callDayTime")
Log.e("print_output", "Call duration in sec :--- $callDuration")
}
managedCursor.close()
}
companion object {
private const val PERMISSION_REQUEST_CODE = 200
}

}

最新更新