프로그래밍/Android

앱에서 알림표시 활성 여부 확인하는 방법

freemmer 2016. 8. 1. 17:42

Android도 iOS처럼 앱마다 알림수신을 ON/OFF 할 수 있습니다.

 

 

 

위 사진에서 '알림표시'가 그것인데요.

 

프로그래머 입장에서는 이 '알림표시'가 체크되어 있는지 아닌지 알아야 할 때가 있습니다.

이전에는 Reflection을 이용한 방법은 있습니다만 공식적으로는 불가능 했습니다.

 

하지만 Google I/O 2016에서 support-v4 ver24.0부터 공식적으로 지원한다고 합니다.

 

 

 

출처 : Google I/O 2016 Video

 

Reflection 을 이용한 방법은 다음과 같습니다.

public class NotificationsUtils {

    private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
    private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";

    public static boolean isNotificationEnabled(Context context) {

        AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);

        ApplicationInfo appInfo = context.getApplicationInfo();

        String pkg = context.getApplicationContext().getPackageName();

        int uid = appInfo.uid;

        Class appOpsClass = null; /* Context.APP_OPS_MANAGER */

        try {

            appOpsClass = Class.forName(AppOpsManager.class.getName());

            Method checkOpNoThrowMethod = appOpsClass.getMethod(CHECK_OP_NO_THROW, Integer.TYPE, Integer.TYPE, String.class);

            Field opPostNotificationValue = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION);
            int value = (int)opPostNotificationValue.get(Integer.class);

            return ((int)checkOpNoThrowMethod.invoke(mAppOps,value, uid, pkg) == AppOpsManager.MODE_ALLOWED);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return false;
    } 

}

 

출처 : How to check notifications are disabled for the application?

 

이번에 추가된 함수는 다음과 같습니다.

 

 

NotificationManagerCompat.areNotificationsEnabled()

 

다만, API 19 이상부터 사용할 수 있으니 그 이하 버전을 지원하는 앱일 경우에는 Reflection 방법을 사용하셔야 할 것 같습니다.

 

 

 

 

 

 

 

반응형