【问题标题】:Forward messages from custom Default SMS Application to "native" provider SMS Application将消息从自定义默认 SMS 应用程序转发到“本机”提供商 SMS 应用程序
【发布时间】:2014-06-13 17:51:31
【问题描述】:

好的,我知道这是在 Android 4.4+ 中实现的安全/可用性功能,并在 SO 上多次解决。我遇到的问题是我不想创建短信应用程序。事实上,the only use of texting in my application is so that an outside admin can ping the phone with a text from a specific number, and have a simple "Running" message returned if the application is running. -注意,我能够检测到消息的接收以及发送消息,我只是无法从收件箱中删除消息。

将消息留在收件箱中没有功能问题,但一段时间后用户会感到烦恼,并且管理员似乎喜欢能够以后台类型的方式 ping 用户。长话短说,因为

int deletedRows = context.getContentResolver().delete(Uri.parse("content://sms/" + id), "date=?",
             new String[] { c.getString(4) });  
if(deletedRows > 0) Log.d(TAG, "Delete success...");
else Log.d(TAG, "Delete error...");

在我的日志中总是提示Delete error...,因为删除没有按预期工作,我需要想出一个新的处理方式。

我已阅读 SMS for KitKatGetting SMS Apps Ready for KitKatA Similar SO Question(已接受答案),但我似乎遗漏了一些东西。问题是我不想控制所有文本消息的接收、显示、发送和处理。我只是希望能够删除来自特定用户的特定消息。

因此,似乎最好的解决方案是将我的应用程序用作默认 SMS 应用程序,删除我需要的单个消息,并将所有其他消息转发到我的“本机”提供商 SMS 应用程序。我不完全知道如何做到这一点(我的 Uri/解析技能不是那么好),在我看来它会是这样的

Log.d(TAG, "Values to send: " + address + " / " + body);
ContentValues content = new ContentValues();
content.put("address", address);
content.put("body", body);
// continue for date, person, etc.
context.getContentResolver().insert(Uri.parse("content://sms/" + id), content);

但是,尽管我的日志显示了正确的值,但我从未收到过消息。我错过了什么(或者有更好的方法来解决这个问题)?

【问题讨论】:

  • 你到底管理好了吗?我正在考虑自己做这件事....
  • 我一直无法成功阻止邮件进入收件箱@TiGer
  • 这正是我所处的场景。你有没有想出一些东西,或者他们只是学会了接受收件箱中的消息?我对我们的手机有更多的控制权,所以我可能只是写一个短信应用程序,将意图传递给我的主应用程序并吃掉消息,但我不想那样做。 (今天的议程:为 KitKat 找到一个开源 SMS 项目……)
  • @JamieB 对严重延迟的响应感到非常抱歉。不幸的是,我无法找到解决此问题的方法。至少可以说相当令人沮丧,但我希望你有更好的运气。

标签: android sms uri android-4.4-kitkat android-contentresolver


【解决方案1】:

我认为当前版本的 Android(7 及更早版本)是不可能的。您需要后续步骤才能将消息转发到以前的默认短信应用:

  1. 编写您自己的短信广播接收器
  2. 在清单文件中注册 SMS 广播接收器(使用 android.provider.Telephony.SMS_DELIVER 意图过滤器)
  3. 获取 android.permission.RECEIVE_SMS 权限以允许处理 SMS 消息。
  4. 在广播接收器的 onReceive(Context context, Intent intent) 处理程序中处理 SMS 意图。
  5. 将收到的意图转发到以前的短信应用。

    5.a 要将意图转发到指定的应用,您需要调用 intent.setClassName("previous app package name", "previous app receiver class name")

    5.b 您必须拥有 android.permission.BROADCAST_SMS 才能从您的自定义应用广播短信意图。但是(惊喜!!!)这个权限只能授予系统应用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2016-06-16
    • 2010-09-28
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多