私は、ContentObserverとサービス(フォアグラウンドで実行)を使用してコールログをバックグラウンドで追跡するアプリケーションを作成しました。 Manifest.permission.CALL_PHONE これは私がクラッシュ:android.permission.READ_CALL_LOGまたはandroid.permission.WRITE_CALL_LOGが必要です一部のデバイスで
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)
}
をチェックしています許可私はアップロードは私が接触に
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
}
をフェッチサービスで、サーバーに
override fun onRunTask(p0: TaskParams?): Int {
val callLogs = CallTrackingHelper.getCallLog(lastSyncedIndex, this)
//
}
を電話ログgcmtaskserviceを開始しています
まだ私はsecurityExceptionがたくさん出ているので、tryとcatchを追加する必要があります
入手しているセキュリティ例外を貼り付けてください。 – vishalk
java.lang.Exception:許可が拒否されました:プロバイダcom.android.providers.contacts.CallLogProviderをProcessRecord {d34d85f 31295 :(pid = 31295、uid = 10132)から開くにはandroid.permission.READ_CALL_LOGまたはandroid.permission.WRITE_CALL_LOGが必要です。 –
がありますこれらのアクセス許可をマニフェストに追加します –