¿Cómo comprobar el permiso automático de MIUI mediante programación?

Necesito comprobar mediante programación si el permiso de inicio automático para mi aplicación en el teléfono MIUI está activado o desactivado. Facebook y whatsapp tienen este permiso habilitado de forma predeterminada, ¿cómo puedo hacerlo?

4 Solutions collect form web for “¿Cómo comprobar el permiso automático de MIUI mediante programación?”

Por ahora no es posible.

Como es completamente dependen de su sistema operativo API y la personalización. Incluso los desarrolladores han solicitado para esto en los foros oficiales de XIOMI, pero no hay respuesta de allí.

Hasta ahora incluso estoy encontrando una respuesta a esta pregunta pero nada me ayudó.

Por el momento, sólo será posible para los teléfonos con raíces. Es decir, hacer personalización en su firmware al convertirse en superusuario. Pero esto no es del todo aconsejable, ya que puede dañar los teléfonos del usuario .

EDITAR

Puede redirigir el usuario a la página de configuración del permiso de inicio automático para habilitar la aplicación mediante el siguiente código

String manufacturer = "xiaomi"; if (manufacturer.equalsIgnoreCase(android.os.Build.MANUFACTURER)) { //this will open auto start screen where user can enable permission for your app Intent intent1 = new Intent(); intent1.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")); startActivity(intent1); } 

Esta no es una solución perfecta por ningún medio y requiere algunas pruebas, pero he sido capaz de detectar el permiso de inicio automático en mi dispositivo Xiaomi con él.

El permiso de inicio automático permite que las aplicaciones se inicien recibiendo una intención de difusión implícita. Este método consiste en programar una transmisión implícita con AlarmManager, eliminando la aplicación y comprobando si la transmisión causó que volviera a aparecer. Una segunda intención implícita también está programada para asegurarse de que la aplicación se inicie eventualmente.

 public class AutostartDetector extends BroadcastReceiver { // I've omitted all the constant declaration to keep this snippet concise // they should match the values used in the Manifest public static void testAutoStart(Context context) { long now = System.currentTimeMillis(); // this ID is for matching the implicit and explicit intents // it might be unnecessary String testId = Long.toHexString(now); Intent implicitIntent = new Intent(ACTION_IMPLICIT_BROADCAST); // the category is set just to make sure that no other receivers handle the broadcast implicitIntent.addCategory(CATEGORY_AUTOSTART); implicitIntent.putExtra(EXTRA_TEST_ID, testId); PendingIntent implicitPendingIntent = PendingIntent.getBroadcast(context, REQUEST_CODE_IMPLICIT_BROADCAST, implicitIntent, PendingIntent.FLAG_UPDATE_CURRENT); Intent explicitIntent = new Intent(ACTION_EXPLICIT_BROADCAST); explicitIntent.addCategory(CATEGORY_AUTOSTART); explicitIntent.setComponent(new ComponentName(context, AutostartDetector.class)); explicitIntent.putExtra(EXTRA_TEST_ID, testId); PendingIntent explicitPendingIntent = PendingIntent.getBroadcast(context, REQUEST_CODE_EXPLICIT_BROADCAST, explicitIntent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // calling commit() makes sure that the data is written before we kill the app // again, this might be unnecessary getSharedPreferences(context).edit().putInt(testId, TestStatus.STARTED).commit(); // the explicit intent is set with an additional delay to let the implicit one be received first; might require some fine tuning alarmManager.set(AlarmManager.RTC_WAKEUP, now + BASE_DELAY, implicitPendingIntent); alarmManager.set(AlarmManager.RTC_WAKEUP, now + BASE_DELAY + EXPLICIT_INTENT_DELAY, explicitPendingIntent); // kill the app - actually kind of tricky, see below SelfKiller.killSelf(context); } @Override public void onReceive(Context context, Intent intent) { SharedPreferences sharedPreferences = getSharedPreferences(context); String testId = intent.getStringExtra(EXTRA_TEST_ID); if (testId == null) { Log.w(TAG, "Null test ID"); return; } if (!sharedPreferences.contains(testId)) { Log.w(TAG, "Unknown test ID: " + testId); return; } String action = intent.getAction(); if (ACTION_IMPLICIT_BROADCAST.equals(action)) { // we could assume right here that the autostart permission has been granted, // but we should receive the explicit intent anyway, so let's use it // as a test sanity check Log.v(TAG, "Received implicit broadcast"); sharedPreferences.edit().putInt(testId, TestStatus.IMPLICIT_INTENT_RECEIVED).apply(); } else if (ACTION_EXPLICIT_BROADCAST.equals(action)) { Log.v(TAG, "Received explicit broadcast"); int testStatus = sharedPreferences.getInt(testId, -1); switch (testStatus) { case TestStatus.STARTED: // the implicit broadcast has NOT been received - autostart permission denied Log.d(TAG, "Autostart disabled"); sharedPreferences.edit().putBoolean(PREF_AUTOSTART_ENABLED, false).apply(); notifyListener(false); break; case TestStatus.IMPLICIT_INTENT_RECEIVED: // the implicit broadcast has been received - autostart permission granted Log.d(TAG, "Autostart enabled"); sharedPreferences.edit().putBoolean(PREF_AUTOSTART_ENABLED, true).apply(); notifyListener(true); break; default: Log.w(TAG, "Invalid test status: " + testId + ' ' + testStatus); break; } } } private interface TestStatus { int STARTED = 1; int IMPLICIT_INTENT_RECEIVED = 2; } 

Declaración del receptor en el manifiesto:

 <receiver android:name=".autostart.AutostartDetector"> <intent-filter> <category android:name="com.example.autostart.CATEGORY_AUTOSTART"/> <action android:name="com.example.autostart.ACTION_IMPLICIT_BROADCAST"/> <action android:name="com.example.autostart.ACTION_EXPLICIT_BROADCAST"/> </intent-filter> </receiver> 

Matar la aplicación de forma fiable es otro problema. He estado usando este método de ayuda:

 public static void killSelf(Context context) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); activityManager.killBackgroundProcesses(context.getPackageName()); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { // this is all we can do before ICS. luckily Xiaomi phones have newer system versions :) System.exit(1); return; } // set up a callback so System.exit() is called as soon as all // the activities are finished context.registerComponentCallbacks(new ComponentCallbacks2() { @Override public void onTrimMemory(int i) { if (i == TRIM_MEMORY_UI_HIDDEN) { Log.v(TAG, "UI Hidden"); System.exit(1); } } /* ... */ }); // see below ActivityTracker.getInstance().finishAllActivities(); } 

ActivityTracker es otra utilidad que realiza un seguimiento de los ciclos de vida de la actividad. Asegúrese de registrarlo en la subclase de aplicación.

 @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH) public final class ActivityTracker implements Application.ActivityLifecycleCallbacks { private final ArraySet<Activity> mCreatedActivities = new ArraySet<>(); public static ActivityTracker getInstance() { return Holder.INSTANCE; } public static void init(Application application) { application.registerActivityLifecycleCallbacks(getInstance()); } public static void release(Application application) { ActivityTracker activityTracker = getInstance(); application.unregisterActivityLifecycleCallbacks(activityTracker); activityTracker.mCreatedActivities.clear(); } public void finishAllActivities() { // iterate over active activities and finish them all for (Activity activity : mCreatedActivities) { Log.v(TAG, "Finishing " + activity); activity.finish(); } } public Set<Activity> getCreatedActivities() { return Collections.unmodifiableSet(mCreatedActivities); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { mCreatedActivities.add(activity); } @Override public void onActivityDestroyed(Activity activity) { mCreatedActivities.remove(activity); } private static final class Holder { private static final ActivityTracker INSTANCE = new ActivityTracker(); } /* ... */ } 

También puede que desee detener todos los servicios sólo para estar seguro.

Prueba esto

 if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_BOOT_COMPLETED) == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "Already got the Permission!!", Toast.LENGTH_SHORT).show(); } else ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.RECEIVE_BOOT_COMPLETED}, REQUEST_CODE_BOOT_COMPLETE); 

Debe permitir y denegar los permisos del sistema.

Abajo está el código:

 private boolean checkPermission(){ int result = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION); if (result == PackageManager.PERMISSION_GRANTED){ return true; } else { return false; } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case PERMISSION_REQUEST_CODE: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Snackbar.make(view,"Permission Granted, Now you can access location data.",Snackbar.LENGTH_LONG).show(); } else { Snackbar.make(view,"Permission Denied, You cannot access location data.",Snackbar.LENGTH_LONG).show(); } break; } } 
  • Android Development: Cambio del brillo de la pantalla en el servicio
  • Diferencia entre los receptores de servicio y difusión en android
  • Android - ¿Cómo decidir si ejecutar un servicio en un proceso separado?
  • ¿Cómo reiniciar automáticamente un servicio incluso si la fuerza del usuario lo cierra?
  • Servicio de ejecución en el fondo?
  • Uso de Alarmmanager para iniciar un servicio en un momento específico
  • En Android: ¿Cómo llamar a la función de la actividad de un servicio?
  • Detectar el evento "botón de inicio presionado" en el servicio android que muestra una interfaz de usuario (similar a los cabezales de chat de Facebook)
  • ResultReceiver no sobrevive a la rotación de la pantalla
  • Recolector de datos de sensor de fondo en Android
  • Notificación diaria de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.