我想写一个应用程序,可以通过查看应用程序内部的表(例如SQLite数据库表)来识别来电(未知)的电话号码。
我已经使用Call Directory Extension在iOS中实现了这一点,但对于安卓系统,我能找到的唯一选择就是使用BroadcastReceiver with a popup above the native incoming call screen来显示联系信息。
ContactsContract.Directory似乎提供了创建自定义目录的可能性,本地呼叫应用程序可以在其中查找呼叫者id。不幸的是,我找不到任何好的例子来说明如何做到这一点。
有没有人知道是否可以使用ContactsContract.Directory实现呼叫者id,或者在安卓中是否有类似于安卓中的呼叫目录扩展的东西?如果是这样的话,示例代码将非常有用。
发布于 2019-08-31 06:02:35
我刚刚写了一篇关于如何让它工作的教程。点击这里查看:https://simplenexus.dev/2019/08/27/android-caller-id.html
如何使其正常工作的基本方法是:
AndroidManifest.xml
<provider
android:name=".callerid.CallerIDProvider"
android:authorities="@string/callerid_authority"
android:readPermission="android.permission.READ_CONTACTS"
android:enabled="true"
android:exported="true">
<meta-data
android:name="android.content.ContactDirectory"
android:value="true"/></provider>CallerIDProvider.kt
private var userRepository: UserRepository? = null
private val uriMatcher = UriMatcher(UriMatcher.NO_MATCH)
override fun onCreate(): Boolean {
context?.let {
val userDao = UserDatabase.getDatabase(it).userDao()
userRepository = UserRepository(userDao)
val authority = it.getString(R.string.callerid_authority)
uriMatcher.addURI(authority, "directories", DIRECTORIES)
uriMatcher.addURI(authority, "phone_lookup/*", PHONE_LOOKUP)
}
return true
}
override fun query(uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor? {
when (uriMatcher.match(uri)) {
DIRECTORIES -> {
val label = context?.getString(R.string.app_name) ?: return null
val cursor = MatrixCursor(projection)
projection?.map { column ->
when (column) {
Directory.ACCOUNT_NAME,
Directory.ACCOUNT_TYPE,
Directory.DISPLAY_NAME -> label
Directory.TYPE_RESOURCE_ID -> R.string.app_name
Directory.EXPORT_SUPPORT -> Directory.EXPORT_SUPPORT_SAME_ACCOUNT_ONLY
Directory.SHORTCUT_SUPPORT -> Directory.SHORTCUT_SUPPORT_NONE
else -> null
}
}?.let { cursor.addRow(it) }
return cursor
}
PHONE_LOOKUP -> {
userRepository?.let { userRepo ->
val phoneNumber = uri.pathSegments[1]
val cursor = MatrixCursor(projection)
val user = runBlocking(Dispatchers.IO) { userRepo.getUser(phoneNumber) }
user?.let { u ->
projection?.map { column ->
when (column) {
PhoneLookup._ID -> -1
PhoneLookup.DISPLAY_NAME -> u.fullName
PhoneLookup.LABEL -> u.phoneLabel
else -> null
}
}?.let { cursor.addRow(it) }
}
return cursor
}
}
}
return null
}https://stackoverflow.com/questions/48870782
复制相似问题