java - 阻止发送的短信被记录在默认消息应用程序中

标签 java android sms broadcastreceiver

我构建了一个自动回复短信 Android 应用程序,但我不希望自动回复(已发送短信)显示在默认消息应用程序中。我搜索了又搜索,却找不到答案。有没有办法绕过将发送的短信写入默认消息应用程序?

这是我用来获取数据并发送消息的 BroadcastReciever

public class SmsReceiver extends BroadcastReceiver {

ParseUser user = ParseUser.getCurrentUser();
// Auto reply message composed of the current reply and url from that business
String msg = user.getString("myCurrentReply") + " " + user.getString("couponUrlChosen");

List smsFromList = user.getList("smsFrom");
String userName = (String) user.get("username");

@Override
public void onReceive(final Context context, Intent intent) {
    Bundle bundle = intent.getExtras();

    Object messages[] = (Object[]) bundle.get("pdus");
    SmsMessage smsMessage[] = new SmsMessage[messages.length];
    for (int n = 0; n < messages.length; n++) {
        smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
    }
    final String pno = smsMessage[0].getOriginatingAddress();
    user.put("lastSmsFrom", pno);
    user.saveInBackground();

    // show first message
    Toast toast = Toast.makeText(context, "Received SMS: " + smsMessage[0].getMessageBody(), Toast.LENGTH_LONG);
    toast.show();

    // Check Phone Number from SMS Received against Array in User Row
    ParseQuery<ParseObject> query = ParseQuery.getQuery("_User");

    Log.d("Username: ", userName);
    query.whereEqualTo("username", userName);
    query.whereContainedIn("lastSmsFrom", smsFromList);
    query.findInBackground(new FindCallback<ParseObject>() {
        public void done(List<ParseObject> smsList, ParseException e) {
            if (e == null) {
                Log.d("Errors", "none");
                if (smsList.size() == 0) {
                    // Send SMS
                    sendSms(pno, msg);

                    // Add Phone number to smsFrom in currentUsers Row
                    user.addUnique("smsFrom", pno);

                    // Save Phone Number in Array
                    user.saveInBackground();

                    Log.d("List size: ", " " + smsList.size());


                }
            } else {
                Log.d("Error Message: ",
                        e.getMessage());
            }
            Log.d("Already sent to this number today. ", " " + smsList.size());
        }
    });

}

private void sendSms(String phonenumber, String message) {

    SmsManager manager = SmsManager.getDefault();
    manager.sendTextMessage(phonenumber, null, message, null, null);

}
 }

最佳答案

在 KitKat 之前,使用 SmsManager 发送短信需要发送消息的应用将其插入到 Provider 中,因此只需忽略这一点即可。

从 KitKat 开始,任何非默认 SMS 应用并使用 SmsManager 发送消息的应用都会由系统自动将消息写入提供程序。没有办法阻止这种情况,而且,应用程序也无法删除这些消息,因为它没有对提供程序的写入权限。*

作为默认短信应用程序的应用程序负责编写其传出消息,因此可以省略该步骤。系统不会自动写入默认短信应用。

<小时/>

* 仅在 4.4 中存在一个安全漏洞,非默认应用程序可以通过该漏洞获得对 Provider 的写访问权限。详细见my answer here ,但在 KitKat 之后的版本中不起作用。

关于java - 阻止发送的短信被记录在默认消息应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25905237/

相关文章:

android - 从 android 调用外部 URL 并获得响应

Android - 从 PDU 已弃用的 API 创建 SMS?

android - Appcelerator Titanium 或 PhoneGap 上的 iPhone 和 Android 应用程序

java - JUnit assertEquals() 失败,即使它们看起来相等

java - 如何在 NetBeans 中禁用 javadoc 拼写检查器

java - 单元测试期间出现奇怪的错误

android - 如何设置工具栏中导航图标的选择器?

android - 如何在适配器 View 、Android、ArrayAdapter、onCheckedChanged、OnCheckedChangeListener 中为复选框添加监听器

java - 消除单例

java - NoSuchMethod SmsMessage <init>?