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

时间:2013-03-06 11:44:34

标签: android sms android-contentprovider samsung-mobile calllog

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

我尝试了一种更“激进”的方法,并使用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”列。由于此表现在为空,而且数据不是来自那里,因此不相关。

3 个答案:

答案 0 :(得分:1)

  

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

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

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

答案 1 :(得分:1)

找到答案 -

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

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

对我来说就像一个魅力。

答案 2 :(得分:0)

三星为消息日志使用单独的存储空间。然而,他们创建了一个特殊的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
}