【发布时间】:2017-11-22 07:28:25
【问题描述】:
我制作了一个使用 ContentObserver 和服务在后台跟踪呼叫日志的应用程序(在前台运行)。 Manifest.permission.CALL_PHONE 这是我正在检查的权限
if (CallTrackingHelper.isCallPermissionEnabled(appContext)) {
val task = OneoffTask.Builder()
.setService(CallLogService::class.java)
.setExecutionWindow(0, 6)
.setTag("call-track")
.setRequiredNetwork(Task.NETWORK_STATE_ANY)
.setRequiresCharging(false)
.setUpdateCurrent(true)
.build()
val mGcmNetworkManager = GcmNetworkManager.getInstance(appContext)
mGcmNetworkManager.schedule(task)
}
我启动了一个 gcmtaskservice 将呼叫日志上传到服务器
override fun onRunTask(p0: TaskParams?): Int {
val callLogs = CallTrackingHelper.getCallLog(lastSyncedIndex, this)
//
}
在服务中我获取联系人
fun getCallLog(id: Long, service: CallLogService): ArrayList<CallLogModel> {
val callLogList = ArrayList<CallLogModel>()
if (!isCallPermissionEnabled(service)) {
return callLogList
}
var mCursor: Cursor? = null
try {
val args = arrayOf(id.toString())
if (id != 0L) {
mCursor = UCApplication
.getInstance()
.applicationContext
.contentResolver
.query(
CallLog.Calls.CONTENT_URI,
null,
"_id > ? ",
args,
null
)
} else {
mCursor = UCApplication
.getInstance()
.applicationContext
.contentResolver
.query(
CallLog.Calls.CONTENT_URI,
null,
null,
null,
CallLog.Calls._ID + " DESC" + " LIMIT 200 "
)
}
} catch (e: SecurityException) {
//
}
//
return callLogList
}
fun isCallPermissionEnabled(context: Context?): Boolean {
if (context == null || ContextCompat.checkSelfPermission(context, PERMISSIONS)
!= PackageManager.PERMISSION_GRANTED) {
return false
}
return true
}
我仍然收到很多 securityException,所以我必须添加 try and catch
【问题讨论】:
-
请粘贴您得到的安全例外。
-
java.lang.Exception: Permission Denial: 从 ProcessRecord{d34d85f 31295 打开提供程序 com.android.providers.contacts.CallLogProvider: (pid=31295, uid=10132) 需要 android.permission.READ_CALL_LOG 或android.permission.WRITE_CALL_LOG
-
你是否在清单中添加这些权限
-
标签: android