安卓如何在通话记录中添加号码

12
有没有可能写入通话记录数据库?我的意思是我想将选定的号码添加到通话历史记录中。我尝试在网络上搜索教程,但找不到任何...虽然有一件事是肯定的,它可以完成。因为我在网上看到了很多应用程序,可以恢复通话记录,所以我猜我们可以以某种方式修改通话历史记录数据库(但我不清楚具体方法)。
我已经阅读了这篇帖子,但它发表的时间很久以前。
任何帮助都将不胜感激!谢谢!

此外,恢复整个日志文件与向其中注入内容非常不同。 - GalacticCowboy
然而,您正在链接的软件并不是将项目“插入”通话记录,而是完全替换(覆盖)它。正如我上面所说的那样,这完全是不同的。 - GalacticCowboy
Android 是开源的(http://source.android.com),因此您可能能够找到通话记录的存在位置,并根据这一点进行阅读/修改。 Android SDK 公开的所有内容似乎都是只读的。 - GalacticCowboy
@GalacticCowboy 谢谢你的信息,但我非常清楚它是开源的 :) 问题是我想知道如何以最佳方式完成我的任务,如果有人知道在上述应用程序中如何完成它的话......不管怎样,还是谢谢! - JaVadid
显示剩余2条评论
3个回答

17

您可以使用此代码片段向现有通话记录内容提供程序添加新记录:

public static void insertPlaceholderCall(ContentResolver contentResolver, String number){
    ContentValues values = new ContentValues();
    values.put(CallLog.Calls.NUMBER, number);
    values.put(CallLog.Calls.DATE, System.currentTimeMillis());
    values.put(CallLog.Calls.DURATION, 0);
    values.put(CallLog.Calls.TYPE, CallLog.Calls.OUTGOING_TYPE);
    values.put(CallLog.Calls.NEW, 1);
    values.put(CallLog.Calls.CACHED_NAME, "");
    values.put(CallLog.Calls.CACHED_NUMBER_TYPE, 0);
    values.put(CallLog.Calls.CACHED_NUMBER_LABEL, "");
    Log.d(TAG, "Inserting call log placeholder for " + number);
    contentResolver.insert(CallLog.Calls.CONTENT_URI, values);
}

(代码取自Google Voice Callback for Android

记得在清单文件中添加权限。

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

这个版本在我的运行ICS的Galaxy Nexus上完美运行。谢谢Roberto! - mikerowehl
你好,我想做同样的事情,但即使添加了这两个权限,它仍然抛出Permission denial异常。有什么猜测吗? - Suresh Sharma
3
好的回答。但是你需要添加以下权限:<uses-permission android:name="android.permission.READ_CALL_LOG"/> <uses-permission android:name="android.permission.WRITE_CALL_LOG"/> - Ton
此权限包含在API 16中。但是,如果您的应用程序使用了READ_CONTACTS / WRITE_CONTACTS权限,并且minSdkVersion和targetSdkVersion值均设置为15或更低,则系统会隐式授予您的应用程序此权限。 - Roberto Leinardi
Ton似乎是正确的。如果没有这些权限,它对我来说无法工作。 - kcpr
@Roberto,我需要获取通话记录,我正在使用通话日志读取所有通话记录,但如果我使用双卡,那么我只需要SIM1的历史记录,这可能吗? - saravanan

1

这篇链接的帖子已经很好地解释了,所以我不知道你为什么要再问一遍。除非你保留自己的数据库或自己的固件,否则无法修改通话记录。


请检查此链接:http://android.riteshsahu.com/apps/call-logs-backup-restore。安卓市场中的许多应用程序都证明了这种能力... 请查看以下示例。 - JaVadid
实际上这并不正确。通话记录可以通过内容提供程序访问。您可以使用内容提供程序读取、更新和写入通话记录。您无法向通话记录数据库添加其他字段(列)(即:修改模式),但这不是 OP 所询问的。您可能需要重新考虑您的答案。 - David Wasser
@Robby 我需要获取通话历史记录,我正在使用通话日志读取所有通话记录,这很好,但如果我正在使用双卡,意味着我只需要sim1的历史记录,这是可能的。 - saravanan

0
我已经准备了一个Kotlin版本,它添加了随机项目,并且具有不同的类型:
清单
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />

MainActivity 注意:我在这里没有处理授予权限。我假设它们已经被授予。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById<View>(R.id.button).setOnClickListener {
            thread {
                val itemsToAdd = 2000
                val phoneListSize = 10
                val phonesList = ArrayList<String>(phoneListSize)
                //Israeli cell phone prefix
                val phonePrefix = "+97250"
                val extraDigitsAfterPhonePrefix = 7
                for (i in 0 until phoneListSize) {
                    val sb = StringBuilder(phonePrefix.length + 9)
                    sb.append(phonePrefix)
                    for (j in 0 until extraDigitsAfterPhonePrefix)
                        sb.append(Random.nextInt(10).toString())
                    phonesList.add(sb.toString())
                }
                Log.d("AppLog", "list of phones to use:${phonesList}")
                try {
                    for (i in 0 until itemsToAdd) {
                        val number = phonesList.get(Random.nextInt(phonesList.size))
                        Log.d("AppLog", "$i - Inserting call log placeholder for $number")
                        insertPlaceholderCall(contentResolver, number)
                    }
                } catch (e: Throwable) {
                    Log.e("AppLog", "failed:$e")
                    e.printStackTrace()
                }
                Log.d("AppLog", "done")
            }
        }
    }

    companion object {
        fun insertPlaceholderCall(contentResolver: ContentResolver, number: String) {
            val values = ContentValues()
            values.put(CallLog.Calls.NUMBER, number)
            val cal = Calendar.getInstance()
            //go back up to 30 days, in seconds
            cal.add(Calendar.SECOND, -Random.nextInt(30 * 24 * 60 * 1000))
            values.put(CallLog.Calls.DATE, cal.timeInMillis)
            // up to 10 minutes call
            values.put(CallLog.Calls.DURATION, Random.nextInt(60 * 10))
            val type = when (Random.nextInt(4)) {
                0 -> CallLog.Calls.OUTGOING_TYPE
                1 -> CallLog.Calls.INCOMING_TYPE
                2 -> CallLog.Calls.MISSED_TYPE
                3 -> CallLog.Calls.REJECTED_TYPE
                //BLOCKED_TYPE is ignored in the Phone app, for some reason
                4 -> CallLog.Calls.BLOCKED_TYPE
                //VOICEMAIL_TYPE causes an exception of IllegalArgumentException: Uri content://call_log/calls cannot be used for voicemail record. Please set 'allow_voicemails=true' in the uri.
                else -> CallLog.Calls.VOICEMAIL_TYPE
            }
            values.put(CallLog.Calls.TYPE, type)
            values.put(CallLog.Calls.NEW, 1)
            values.put(CallLog.Calls.CACHED_NAME, "")
            values.put(CallLog.Calls.CACHED_NUMBER_TYPE, 0)
            values.put(CallLog.Calls.CACHED_NUMBER_LABEL, "")
            contentResolver.insert(CallLog.Calls.CONTENT_URI, values)
        }
    }
}


文档有点奇怪,它说支持3种类型,但列出了5种类型。

https://developer.android.com/reference/android/provider/CallLog.Calls#TYPE

出于某种原因,当我尝试使用VOICEMAIL_TYPE时,出现了一个异常:
java.lang.IllegalArgumentException: 无法使用Uri content://call_log/calls来记录语音邮件。请在URI中设置'allow_voicemails=true'。
此外,当我尝试使用BLOCKED_TYPE时,在手机应用程序中找不到该项目。
如果有人能告诉我如何修复它,请告诉我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接