¿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; } } 
  • Cómo utilizar NotificationCompat.Builder y startForeground?
  • Android - ¿Cómo decidir si ejecutar un servicio en un proceso separado?
  • Inicio del servicio de fondo cuando se enciende Android
  • El servicio de fondo de Android se está reiniciando cuando se cancela la aplicación
  • Eventos de apagado en Android
  • Crear notificación cada día
  • No puedo encontrar la causa de mi accidente con este seguimiento de pila
  • Gran uso de memoria en las notificaciones
  • Detener el servicio hasta que se pueda establecer conexión a Internet
  • ResultReceiver no sobrevive a la rotación de la pantalla
  • Temporizador La tarea deja de ejecutarse después de un tiempo indefinido en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.