2016-08-17 4 views
8

Я не получаю BOOT COMPLETE в моем Xiaomi Redmi 2 Prime mobile.Как получить программное обеспечение MIUI Security для автоматического запуска программного обеспечения?

Мои Broadcast приемник является ---

public class OnBootReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // Setting singleAlarm 
    SingleAlarmHandler.getInstance().setAlarm(context); 

    try { 
     // Sending System Setting broadcast 
     String offDate = SharedPrefrencesHandler.getInstance(context).readString(SharedPrefrencesConstants.SWITCH_OFF_DATE); 
     int type = SystemSettingsType.PHONE_SWITCH_ON_OFF.getNumericType(); 
     if (offDate == null) 
      offDate = ""; 
     SystemSettingsHandler.getSystemSettingsHandler().makeSystemSettingsCall(context, type, offDate); 
     SharedPrefrencesHandler.getInstance(context).removePrefrence(SharedPrefrencesConstants.SWITCH_OFF_DATE); 
    } catch (Exception e) { 
     Log.e(ChaseForceApplication.TAG, e.getMessage()); 
    } 
} 

}

и Manifest запись is--

<receiver 
     android:name=".broadcastlisteners.OnBootReceiver" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

с разрешения -

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

Сейчас я не получая БОТОМ ПОЛНУЮ broa dcast в моем Xiaomi Redmi 2 Prime mobile, поскольку будильник не установлен. Но в других мобильных телефонах Android он работает правильно.

Я искал и обнаружил, что это проблема в прошивке MIUI. В таком мобильном устройстве они предоставляют встроенное приложение для обеспечения безопасности и, если вы не разрешаете разрешение автозапуска в этом приложении безопасности, вы не можете получить широковещательный доступ (любое уведомление).

И как только вы убедитесь, что разрешение в этом приложении вы начнете получать трансляцию ..

Теперь мой вопрос:

Как получить разрешение запуска приложение автоматического MIUI безопасности (телефоны как редми) программно?

+1

О чем вы говорите? Покажите свой код. (Manifest и ваш ресивер) – xdevs23

+0

@ xdevs23, спасибо за комментарий, теперь я добавил свой код .. в широковещательном приемнике, если я добавлю только тост (и удалю другой код), чем то, что тост не отображается в My Redmi Prime 2 но он отображается в других мобильных устройствах, таких как Moto e, Micromax android1 и т. д. –

+0

Hi @ImranKhanSaifi. Это добавленная функция безопасности в MIUI Roms. Любой разработчик, который пользуется телефоном Xiaomi (с MIUI), узнает об этом. Я столкнулся с той же проблемой.Я много искал, но, похоже, ребята MIUI не предоставили SDK для разработчика, чтобы получить доступ к диспетчеру разрешения или тому подобное. Ответьте, если вы найдете какое-либо решение для этого. – Mazhar

ответ

7

этот вопрос уже ответил на два потока переполнению стека:

нить # 1 https://stackoverflow.com/a/40932178/1537413

String xiaomi = "Xiaomi"; 
final String CALC_PACKAGE_NAME = "com.miui.securitycenter"; 
final String CALC_PACKAGE_ACITIVITY = "com.miui.permcenter.autostart.AutoStartManagementActivity"; 
if (deviceManufacturer.equalsIgnoreCase(xiaomi)) { 
    DisplayUtils.showDialog(activity, "Ask for permission", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 
      try { 
       Intent intent = new Intent(); 
       intent.setComponent(new ComponentName(CALC_PACKAGE_NAME, CALC_PACKAGE_ACITIVITY)); 
       activity.startActivity(intent); 
      } catch (ActivityNotFoundException e) { 
       Logger.e(TAG, "Failed to launch AutoStart Screen ", e); 
      } catch (Exception e) { 
       Logger.e(TAG, "Failed to launch AutoStart Screen ", e); 
      } 
     } 
    }, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 

     } 
    }); 
} 

нить # 2 https://stackoverflow.com/a/41696993/1537413

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 intent = new Intent(); 
      intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")); 
      startActivity(intent); 
     } 

и подобной проблемы на HUAWEI устройств:

https://stackoverflow.com/a/35220476/1537413

private void ifHuaweiAlert() { 
    final SharedPreferences settings = getSharedPreferences("ProtectedApps", MODE_PRIVATE); 
    final String saveIfSkip = "skipProtectedAppsMessage"; 
    boolean skipMessage = settings.getBoolean(saveIfSkip, false); 
    if (!skipMessage) { 
     final SharedPreferences.Editor editor = settings.edit(); 
     Intent intent = new Intent(); 
     intent.setClassName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity"); 
     if (isCallable(intent)) { 
      final AppCompatCheckBox dontShowAgain = new AppCompatCheckBox(this); 
      dontShowAgain.setText("Do not show again"); 
      dontShowAgain.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        editor.putBoolean(saveIfSkip, isChecked); 
        editor.apply(); 
       } 
      }); 

      new AlertDialog.Builder(this) 
        .setIcon(android.R.drawable.ic_dialog_alert) 
        .setTitle("Huawei Protected Apps") 
        .setMessage(String.format("%s requires to be enabled in 'Protected Apps' to function properly.%n", getString(R.string.app_name))) 
        .setView(dontShowAgain) 
        .setPositiveButton("Protected Apps", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          huaweiProtectedApps(); 
         } 
        }) 
        .setNegativeButton(android.R.string.cancel, null) 
        .show(); 
     } else { 
      editor.putBoolean(saveIfSkip, true); 
      editor.apply(); 
     } 
    } 
} 

private boolean isCallable(Intent intent) { 
    List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
      PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0; 
} 

private void huaweiProtectedApps() { 
    try { 
     String cmd = "am start -n com.huawei.systemmanager/.optimize.process.ProtectActivity"; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      cmd += " --user " + getUserSerial(); 
     } 
     Runtime.getRuntime().exec(cmd); 
    } catch (IOException ignored) { 
    } 
} 

private String getUserSerial() { 
    //noinspection ResourceType 
    Object userManager = getSystemService("user"); 
    if (null == userManager) return ""; 

    try { 
     Method myUserHandleMethod = android.os.Process.class.getMethod("myUserHandle", (Class<?>[]) null); 
     Object myUserHandle = myUserHandleMethod.invoke(android.os.Process.class, (Object[]) null); 
     Method getSerialNumberForUser = userManager.getClass().getMethod("getSerialNumberForUser", myUserHandle.getClass()); 
     Long userSerial = (Long) getSerialNumberForUser.invoke(userManager, myUserHandle); 
     if (userSerial != null) { 
      return String.valueOf(userSerial); 
     } else { 
      return ""; 
     } 
    } catch (NoSuchMethodException | IllegalArgumentException | InvocationTargetException | IllegalAccessException ignored) { 
    } 
    return ""; 
} 
+1

Привет @Dika, Спасибо за ответ. Я использую ваш код автозапуска для Xiaomi. По вашему коду я могу достичь активности настройки автозапуска, но я не могу знать, что пользователь погодных условий получил разрешение автозапуска или нет. Мог ли я как-то узнать действие пользователя, пользователь погоды дал разрешение или нет (статус разрешения окончательно). –

+1

Насколько я знаю, вы не можете знать, дал ли пользователь разрешение или нет. xiaomi не предоставляет эту функцию. самое лучшее, что вы можете сделать, - это показать небольшой диалог пользователю с контрольным списком: «Я уже разрешаю этому приложению автозапуск». и, пожалуйста, отметьте мой комментарий как ответ, если он вам поможет. – Dika

-1

Вам необходимо предоставить разрешения в приложении для обеспечения безопасности для xiaomi.

  1. открыть приложение безопасности
  2. перейти разрешения
  3. перейти в автоматический режим запуска
  4. включить приложения, которые вы хотите продолжать работать в фоновом режиме!

Это сработало для меня ..!

+0

Как эти шаги могут выполняться программно. Вы упомянули шаги руководства. –

Смежные вопросы

 Смежные вопросы