【问题标题】:Clear SMS Notification From Notification Drawer after deleting SMS from Broadcast从广播中删除短信后,从通知抽屉中清除短信通知
【发布时间】:2017-03-25 22:48:46
【问题描述】:

从广播中成功删除短信后,我无法从通知抽屉中清除通知

1)当我打开短信应用程序时,短信被删除, 但在通知中,显示带有 msg 的短信

2)当我点击短信通知时,它会打开“带有新空白短信的短信应用”

我尝试通过以下方式清除通知抽屉: (1)

NotificationManager notificationManager = (NotificationManager) supercontext.getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancelAll();

我尝试通过以下方式清除通知抽屉: (2)

Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
closeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
supercontext.startActivity(closeIntent);

但在通知抽屉中仍然可以看到消息 这是我在 Broadcast.java 中的代码:

@Override
public void onReceive(Context context, Intent intent) {
    final Bundle bundle = intent.getExtras();
    storageReference = FirebaseStorage.getInstance().getReference();
    supercontext = context;
    try {
        if (bundle != null) {
            final Object[] pdusObj = (Object[]) bundle.get("pdus");
            for (int i = 0; i < pdusObj.length; i++) {
                SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                String phoneNumber = currentMessage.getDisplayOriginatingAddress();
                senderNum = phoneNumber;
                message = currentMessage.getDisplayMessageBody();
                deleteSMSHandler()
           }

public void deleteSMSHandler() {
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            try {
                deleteSMS(supercontext, message, senderNum);
            } catch (Exception e) {
            }
        }
    }, 2000);
}

public void deleteSMS(Context context, String message, String number) {
    try {
        Uri uriSms = Uri.parse("content://sms/inbox");
        Cursor c = context.getContentResolver().query(uriSms,
                new String[]{"_id", "thread_id", "address",
                        "person", "date", "body"}, null, null, null);
        if (c != null && c.moveToFirst()) {
            do {
                long id = c.getLong(0);
                long threadId = c.getLong(1);
                String where = "address=" + number;
                where = "thread_id=" + threadId;
                String address = c.getString(2);
                String body = c.getString(5);
                if (message.equals(body) && address.equals(number)) {
                    context.getContentResolver().delete(Uri.parse("content://sms/" + id), where, null);

                    NotificationManager notificationManager = (NotificationManager) supercontext.getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
                    notificationManager.cancelAll();

                    Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
                    closeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    supercontext.startActivity(closeIntent);
                }
            } while (c.moveToNext());
        }

    } catch (Exception e) {
        Log.i("Delete MSG Error", "" + e);
        String x = e + "";
        //mLogger.logError("Could not delete SMS from inbox: " + e.getMessage());
    }
}

}

这是我的清单文件:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.INTERNET" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.SET_ALWAYS_FINISH" />
<uses-permission android:name="android.permission.SET_ORIENTATION" />
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>
<uses-permission android:name="android.permission.BROADCAST_SMS"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name="com.sagarmakhija1994.Framework.MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver
        android:name="com.sagarmakhija1994.Framework.MyBroadcastReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter android:priority="999">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            <action android:name="android.service.notification.NotificationListenerService" />
            <action android:name="android.intent.ACTION_CLOSE_SYSTEM_DIALOGS" />
        </intent-filter>
    </receiver>
</application>

【问题讨论】:

    标签: android notifications sms broadcast


    【解决方案1】:

    从广播中成功删除短信后

    您无法在 Android 4.4+ 上删除 SMS,除非您是用户选择的 SMS 客户端。

    但消息在通知抽屉中仍然可见

    正确。 Notification 是由 SMS 应用程序提出的。 SMS应用程序可以清除它。在 Android 4.4+ 上,您的应用必须成为 SMS 应用,因此您需要 cancel() 自己的 Notification

    您可以实现a NotificationListenerService 并使用它来强制清除短信。用户必须在“设置”中同意让您监视所有用户的通知。很少有用户会这样做。而NotificationListenerService 仅适用于 Android 4.3+。因此,您可以从中获得任何价值的唯一 Android 版本是 Android 4.3。

    这是我的清单文件

    请注意,您列出的一些权限是只有系统应用才能拥有的权限。

    【讨论】:

    • 您无法在 Android 4.4+ 上删除短信,但我做到了,上面的代码完美地删除了短信。我在 android 5.1 和 4.4 中都进行了测试,只是我想清除通知。可以通过前关闭消息应用程序来完成它只是想知道,我如何像 greenyfy 应用程序那样强制关闭短信应用程序
    • 您无法在 Android 4.4+ 上删除短信,但上面的代码工作正常,它成功删除了 android 5.1 和 4.4 中的短信我只想在打开短信时清除该短信的通知应用程序在通过 Reciver 删除短信后,通知变得清晰,并且没有我被 Reciver 删除的短信,但问题是直到我没有打开短信应用程序,用户在通知抽屉中可以看到和阅读短信
    猜你喜欢
    • 2017-11-21
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多