繁体   English   中英

无法从Samsung设备上的通话记录中删除SMS日志

[英]Can't remove SMS logs from call log on Samsung devices

我试图通过我的应用程序从设备中删除所有短信,但由于某种原因,短信日志仍然出现在某些三星设备的通话记录中。

我尝试了一种更“激进”的方法,并使用ContentResolver删除了以下URI:

  • content://call_log/calls
  • content://sms
  • content://sms/inbox
  • content://sms/sent
  • content://mms/inbox
  • content://mms
  • content://mms-sms
  • content://mms/address
  • content://mms/part
  • content://mms/sent
  • content://mms/outbox

使用以下简单代码完成删除:

ContentResolver cr = mContext.getContentResolver() ;
cr.delete(uri, null, null) ;

结果是所有文本消息都从设备中删除,呼叫日志从呼叫中清除,但仍然包含SMS日志(对于不存在的SMS消息)。

上面提到的所有表在过程结束时确实是空的,但我找不到调用日志从中获取SMS数据的相关源。

我在这个主题上找到了以下帖子,但仍然没有可行的解决方案:

我将提前说明我知道CallLog.Calls.CONTENT_URI的“logtype”列。由于此表现在为空,并且数据不是来自那里,因此不相关。

结果是所有文本消息都从设备中删除,呼叫日志从呼叫中清除,但仍然包含SMS日志(对于不存在的SMS消息)。

你的“仍然包含短信日志”的指示究竟是什么? 什么包含短信日志?
我假设您参考三星电话应用程序。 如果是这样 - 不幸的是,正如@CommonsWare所说,这款手机调用app并不一定显示相关ContentProvider背后数据库的正确状态。

它可能是这个应用程序缓存(持久性/非持久性)数据,并且当“真实数据”(来自内容提供商数据库)发生变化时不会刷新它...谁知道......也许只有当它进程将重新启动时,它才会缓存会清楚 - 它会刷新自己......

找到答案 -

为了访问三星通话记录,我们需要向清单添加几个权限:

<uses-permission android:name="com.sec.android.provider.logsprovider.permission.READ_LOGS" />
<uses-permission android:name="com.sec.android.provider.logsprovider.permission.WRITE_LOGS" />

现在,我们所要做的就是使用内容解析器从content:// logs / historys中删除日志类型400,410,700,200,300,600和500,如下所示:

    mContext = getActivity(); // Assuming that you are doing this from within a Fragment

    try
    {
        mContext.getContentResolver().delete(Uri.parse("content://logs/historys"), "logtype='400'", null);
        mContext.getContentResolver().delete(Uri.parse("content://logs/historys"), "logtype='410'", null);
        mContext.getContentResolver().delete(Uri.parse("content://logs/historys"), "logtype='700'", null);
        mContext.getContentResolver().delete(Uri.parse("content://logs/historys"), "logtype='200'", null);
        mContext.getContentResolver().delete(Uri.parse("content://logs/historys"), "logtype='300'", null);
        mContext.getContentResolver().delete(Uri.parse("content://logs/historys"), "logtype='600'", null);
        mContext.getContentResolver().delete(Uri.parse("content://logs/historys"), "logtype='500'", null);
    }
    catch(Exception exception)
    {
        exception.printStackTrace();
    }

对我来说就像一个魅力。

三星为消息日志使用单独的存储。 然而,他们创建了一个特殊的ContentProvider来访问它们。 来源我还没找到,但找到了URI: content://logs/historys

删除指定号码的日志示例:

try{
    context.getContentResolver().delete(Uri.parse("content://logs/historys"), CallLog.Calls.NUMBER + " like '%" + number + "'", null);
} catch (IllegalArgumentException e){
    //that mean this not samsung device
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM