Android 通知使用权

创建一个继承自NotificationListenerService的服务,监听并处理通知的发布和移除事件。当检测到特定通知如耗电或微信红包时,进行删除或跳转操作。同时,通过MessageHelper接口将通知信息回调给其他组件。
摘要由CSDN通过智能技术生成

1. 创建service extends  NotificationListenerService,并实现onNotificationRemoved、onNotificationPosted

public class NotificationCleanService extends NotificationListenerService {
    private String TAG = "NotificationCleanService";


    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
        super.onNotificationRemoved(sbn);
        Log.e(TAG, "通知被清除");
        MessageHelper.getInstance().onNotificationRemoved(sbn);
    }

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {
        super.onNotificationPosted(sbn);
        Log.e(TAG, "有新通知");
        Log.e(TAG, "该通知是否可以被清除:" + sbn.isClearable());
        MessageHelper.getInstance().onNotificationPosted(sbn);
//        StatusBarNotification[] sbns = getActiveNotifications();                 // 返回当前系统所有通知的数组
//        cancelAllNotifications();                                                // 删除系统中所有可被清除的通知
//        cancelNotification(String key);                                           // 删除具体某一个通知

//        sbn.getId();                                                             // 返回通知对应的id
//        sbn.getNotification();                                                   // 返回通知对象
//        sbn.getPackageName();                                                    // 返回通知对应的包名
//        sbn.getPostTime();                                                       // 返回通知发起的时间
//        sbn.getTag();                                                            // 返回通知的Tag,如果没有设置返回null
//        sbn.isClearable();                                                       // 返回该通知是否可被清楚,是否为FLAG_ONGOING_EVENT、FLAG_NO_CLEAR
//        sbn.isOngoing();                                                         // 返回该通知是否在正在运行的,是否为FLAG_ONGOING_EVENT

        Notification notification = sbn.getNotification();

        Bundle extras = notification.extras;
        // 获取通知标题
        String title = extras.getString(Notification.EXTRA_TITLE, "");
        // 获取通知内容
        String content = extras.getString(Notification.EXTRA_TEXT, "");
        Log.e(TAG, "通知标题:" + title + "\n 通知文本" + content);
        if (content.contains("耗电") || title.contains("耗电")) {
//        if (content.contains("USB") || title.contains("USB")) {
            Log.e(TAG, "开始删除通知---通知包名:" + sbn.getPackageName() + "\n 通知Key" + sbn.getKey() + "\n 通知ID" + sbn.getId());
            cancelNotification(sbn.getKey());
        }
            //打开自己的activity
                try {
            //隐式打开目标activity   目标activity  androidmanifest需要配置  
            //注:配置category 为 DEFAULT 后,该activity不能作为应用启动activity
//             <intent-filter>
//                <action android:name="MyMainActivity" />
//                <category android:name="android.intent.category.DEFAULT" />
//            </intent-filter>
            Intent intentNotification = new Intent("MyMainActivity");
             //如果不需要隐式跳转可以直接用Class打开  该方式可以直接打开应用启动activity
//            Intent intentNotification = new Intent(this, MainActivity.class);
            intentNotification.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);//由于不是activity的context,所以无法直接跳转
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intentNotification, 0);

            if (pendingIntent != null) {
                pendingIntent.send();
            }
        } catch (PendingIntent.CanceledException e) {
            e.printStackTrace();
        }

        //直接打开通知目标activity
        if (content.contains("微信红包") || title.contains("微信红包")) {
            //有红包,跳转到相应界面
            PendingIntent pendingIntent = null;
            pendingIntent = notification.contentIntent;
            try {
                if (pendingIntent != null) {
                    pendingIntent.send();
                }
            } catch (PendingIntent.CanceledException e) {
                e.printStackTrace();
            }
        }
    }

2.注册service

      <service
            android:name="com.example.testtest.NotificationCleanService"
            android:exported="true"
            android:label="通知使用权测试程序"
            android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
            <intent-filter>
                <action android:name="android.service.notification.NotificationListenerService" />
            </intent-filter>
        </service>

3.使用,判断是否有通知使用权,并启动service

    if (!notificationListenerEnable()) {
            gotoNotificationAccessSetting(MainActivity.this);
        }
        Intent intent = new Intent(MainActivity.this, NotificationCleanService.class);
        startService(intent);
 

/**
     * @return 跳转到通知使用权设置界面
     */
    private boolean gotoNotificationAccessSetting(Context context) {
        try {
            Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
            return true;
        } catch (ActivityNotFoundException e) {
            try {
                Intent intent = new Intent();
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.Settings$NotificationAccessSettingsActivity");
                intent.setComponent(cn);
                intent.putExtra(":settings:show_fragment", "NotificationAccessSettings");
                context.startActivity(intent);
                return true;
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return false;
        }
    }

    /**
     * @return 判断是否有通知使用权权限
     */
    private boolean notificationListenerEnable() {
        boolean enable = false;
        String packageName = getPackageName();
        String flat = Settings.Secure.getString(getContentResolver(), "enabled_notification_listeners");
        if (flat != null) {
            enable = flat.contains(packageName);
        }
        return enable;
    }

4.至此,onNotificationRemoved、onNotificationPosted 方法即可以接收到通知栏新到通知以及删除的通知,,收到通知时,可以拿取到通知相关信息做删除或跳转动作。红包助手,手环通知等功能就是用通知使用权做的。

5.现在只需要吧通知信息回调出来就行了,

public class MessageHelper {
    private static MessageHelper messageHelper;
    private MessageInterface messageInterface;

    public static MessageHelper getInstance() {
        if (messageHelper == null) {
            messageHelper = new MessageHelper();
        }
        return messageHelper;
    }

    public void onNotificationRemoved(StatusBarNotification sbn) {
        if (messageInterface != null) {
            messageInterface.onNotificationRemoved(sbn);
        }
    }

    public void onNotificationPosted(StatusBarNotification sbn) {
        if (messageInterface != null) {
            messageInterface.onNotificationPosted(sbn);
        }
    }


    /**
     * 设置回调方法
     *
     * @param messageInterface 通知监听
     */
    public void setNotifyListener(MessageInterface messageInterface) {
        this.messageInterface = messageInterface;
    }

    public interface MessageInterface {
        void onNotificationRemoved(StatusBarNotification sbn);

        void onNotificationPosted(StatusBarNotification sbn);
    }

}
 //消息监听
        MessageHelper.getInstance().setNotifyListener(new MessageHelper.MessageInterface() {
            @Override
            public void onNotificationRemoved(StatusBarNotification sbn) {
                Notification notification = sbn.getNotification();
                Bundle extras = notification.extras;
                // 获取通知标题
                String title = extras.getString(Notification.EXTRA_TITLE, "");
                // 获取通知内容
                String content = extras.getString(Notification.EXTRA_TEXT, "");
                mTv.setText(mTv.getText() + "\n 通知被清除:标题:" + title + " 内容:" + content);
            }

            @Override
            public void onNotificationPosted(StatusBarNotification sbn) {
                Notification notification = sbn.getNotification();
                Bundle extras = notification.extras;
                // 获取通知标题
                String title = extras.getString(Notification.EXTRA_TITLE, "");
                // 获取通知内容
                String content = extras.getString(Notification.EXTRA_TEXT, "");
                mTv.setText(mTv.getText() + "\n 有新通知:标题:" + title + " 内容:" + content + "  包名:" + sbn.getPackageName() + "  清除:" + sbn.isClearable());
            }
        });

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值