android 添加号码到通话记录

发布于 2024-09-07 23:42:11 字数 260 浏览 0 评论 0原文

无论如何都可以写入呼叫日志数据库吗?我的意思是我想将选定的号码添加到通话记录中。我尝试在网上搜索教程,但找不到任何...虽然有一点是肯定的,但它可以完成。因为我在网上看到了很多应用程序,它们可以恢复通话记录,所以我想我们可以以某种方式修改通话历史数据库(但具体如何修改我不清楚)。

我已经阅读了这篇文章,但它恰好是很久以前发布的。

任何帮助将不胜感激!谢谢!

Is it by anyway possible to write to call logs database?? I mean i want to add selected numbers to the call history. I tried searching the tutorial on net but couldn't find any... Though 1 thing is for sure, IT CAN BE DONE. coz i have seen lots of applications online, which restore call logs, so i guess we can modify the call history database somehow(but how exactly is not clear with me).

i already read this post but it happens to be posted a long time back.

Any help will be appreciated! Thanx!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倾城°AllureLove 2024-09-14 23:42:11

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

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 语音回叫对于Android

记得在Manifest中添加权限

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

You can use this snippet to add new records to the existing Call logs content provider:

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);
}

(Code taken from Google Voice Callback for Android)

Remember to add the permissions in the Manifest

<uses-permission
    android:name="android.permission.READ_CONTACTS"/>
<uses-permission
    android:name="android.permission.WRITE_CONTACTS"/>
鸠书 2024-09-14 23:42:11

链接的帖子解释得很好,所以我不知道你为什么又问。除非您保留自己的数据库或自己的固件,否则您无法修改呼叫日志。

The linked post explains it very well so I don't know why you are asking again. You cannot modify the call logs unless you keep your own database or your own firmware.

自此以后,行同陌路 2024-09-14 23:42:11

我准备了一个 Kotlin 版本,它添加了随机项目,并且具有不同的类型:

ma​​nifest

<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 时,我在电话应用程序中的任何位置都看不到该项目。

如果有人可以告诉我如何解决它,请告诉我。

I've prepared a Kotlin version, which adds random items, and with different types:

manifest

<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
Note: I didn't handle granting the permissions here. I assume they are granted.

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)
        }
    }
}

The documentation is a bit weird though, as it says it supports 3 types, yet it lists 5 types:

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

For some reason I got an exception when trying to use VOICEMAIL_TYPE, though:

java.lang.IllegalArgumentException: Uri content://call_log/calls cannot be used for voicemail record. Please set 'allow_voicemails=true' in the uri.

Also, when trying to use BLOCKED_TYPE, I can't see the item anywhere in the Phone app.

If anyone can tell me how to fix it, please let me know.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文