Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Comprobar si mi aplicación tiene acceso de uso habilitado

Estoy usando la nueva API de UsageStatsManager para obtener la aplicación de primer plano actual en Android 5.0 Lollipop. Para utilizar esta API, el usuario debe habilitar la aplicación en la pantalla Settings->Security->Apps with usage access .

Envío el usuario directamente a esta pantalla con este propósito:

 startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)); 

Ahora, quiero validar el usuario habilitado mi aplicación. Quería hacerlo así como validar el usuario habilitado mi aplicación para utilizar el NotificationListenerService pero no tengo idea de qué es la clave de cadena, si es que existe.

 Settings.Secure.getString(contentResolver, "enabled_notification_listeners"); // Tried Settings.ACTION_USAGE_ACCESS_SETTINGS as key but it returns null 

El segundo enfoque fue consultar las estadísticas de uso y comprobar si devuelve resultados (devuelve una matriz vacía cuando la aplicación no está habilitada) y funciona la mayoría de las veces, pero a veces devuelve 0 resultados incluso cuando mi aplicación está habilitada.

 UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService("usagestats"); long time = System.currentTimeMillis(); List stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 10, time); if (stats == null || stats.isEmpty()) { // Usage access is not enabled } 

¿Hay alguna forma de comprobar si mi aplicación tiene habilitado el acceso de uso?

    5 Solutions collect form web for “Comprobar si mi aplicación tiene acceso de uso habilitado”

    Recibió una gran respuesta de alguien en Twitter, probado trabajando:

     try { PackageManager packageManager = context.getPackageManager(); ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0); AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); int mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, applicationInfo.uid, applicationInfo.packageName); return (mode == AppOpsManager.MODE_ALLOWED); } catch (PackageManager.NameNotFoundException e) { return false; } 

    Esta es una alternativa de soluciones:

     AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), context.getPackageName()); return mode == AppOpsManager.MODE_ALLOWED; 

    Utilicé anteriormente el mismo código que Bao Le, pero me he encontrado con el problema de que ciertos dispositivos (por ejemplo, VF-895N) informan de las estadísticas de uso como habilitadas incluso cuando no lo son. Como solución he modificado mi código de esta manera:

     public static boolean hasPermission(@NonNull final Context context) { // Usage Stats is theoretically available on API v19+, but official/reliable support starts with API v21. if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) { return false; } final AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); if (appOpsManager == null) { return false; } final int mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), context.getPackageName()); if (mode != AppOpsManager.MODE_ALLOWED) { return false; } // Verify that access is possible. Some devices "lie" and return MODE_ALLOWED even when it's not. final long now = System.currentTimeMillis(); final UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); final List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, now - 1000 * 10, now); return (stats != null && !stats.isEmpty()); } 

    Probado con éxito en varios dispositivos.

    Este código que trabaja en lollipop y marshmallow i utiliza este código en mi aplicación

     if (Build.VERSION.SDK_INT >= 21) { UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); long time = System.currentTimeMillis(); List stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 10, time); if (stats == null || stats.isEmpty()) { Intent intent = new Intent(); intent.setAction(Settings.ACTION_USAGE_ACCESS_SETTINGS); context.startActivity(intent); } } 

    Si están usando una tableta de Amazon Fire (y posiblemente otros dispositivos de Fire OS), el usuario puede descargar la aplicación de un Google Play Store instalado por el usuario y no tiene la opción que desea activada disponible en su sistema operativo. Sé que esto como un usuario de Fire OS esto me sucedió hace unos minutos. Detectar si un usuario tiene Fire OS y, si es así, ofrecer una opción que realmente existe sería fantástico para el usuario y dev.

      FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.