Android 通知使用权

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 通知使用权 的相关文章

随机推荐