2016-08-17 8 views
8

Nie otrzymuję transmisji BOOT COMPLETE w moim telefonie komórkowym Xiaomi Redmi 2 Prime.Jak automatycznie uzyskać zezwolenie na automatyczne uruchamianie aplikacji MIUI Security?

My Broadcast odbiornik jest ---

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()); 
    } 
} 

}

i Manifest wpis 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> 

z pozwoleniem -

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

teraz jestem nie dostanie BOOT COMPLETE broa dcast w moim telefonie komórkowym Xiaomi Redmi 2 Prime, ponieważ alarm nie jest ustawiony. Ale w innych telefonach z Androidem działa poprawnie.

Przeszukałem i stwierdziłem, że jest to problem w oprogramowaniu MIUI. W takich urządzeniach przenośnych zapewniają one wbudowaną aplikację bezpieczeństwa i dopóki nie zezwolisz na automatyczne uruchamianie w tej aplikacji zabezpieczeń, nie będzie można uzyskać szerokiej obsady (żadnego powiadomienia).

I jak najszybciej sprawdzić, czy pozwolenie w tej aplikacji, aby zacząć transmisję ..

Teraz moje pytanie brzmi:

Jak zdobyć MIUI Zabezpieczenia pozwolenia aplikacja Auto Start (Mobile jak redmi) programowo?

+1

O czym ty mówisz? Pokaż swój kod. (Manifest i twój odbiornik) – xdevs23

+0

@ xdevs23, dzięki za komentarz, teraz dodałem mój kod .. w odbiorniku transmisji, jeśli dodaję tylko toast (i usuwam inny kod) niż to, że toast nie wyświetla się w My Redmi Prime 2 mobilny, ale wyświetla się w innych telefonach komórkowych, takich jak Moto e, Micromax android1 itp. ... –

+0

Witam @ ImranKhanSaifi. Jest to dodatkowa funkcja bezpieczeństwa w ROMach MIUI. Deweloper korzystający z telefonu Xiaomi (z MIUI) będzie o tym wiedział. Zmierzyłem się z tym samym problemem.Dużo szukałem, ale wygląda na to, że faceci z MIUI nie dali żadnego SDK-a dla programisty, który mógłby uzyskać dostęp do menedżera uprawnień. Proszę odpowiedzieć, jeśli znajdziesz jakieś rozwiązanie. – Mazhar

Odpowiedz

7

to pytanie ma już odpowiedzieć w dwóch wątkach przepełnienie stosu:

wątek # 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) { 

     } 
    }); 
} 

wątek # 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); 
     } 

i dla podobnego problemu na urządzeniach 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

Witam @Dika, dzięki za odpowiedź .. Używam twojego kodu autostart dla Xiaomi, Przez twój kod jestem w stanie osiągnąć działanie ustawienia autostartu, ale nie jestem w stanie poznać użytkownika pogody, któremu udzielono pozwolenia na automatyczne uruchomienie. Czy mogę w jakiś sposób poznać działanie użytkownika, użytkownik pogody udzielił zgody lub nie (Ostatecznie status zezwolenia). –

+1

o ile mi wiadomo, nie możesz wiedzieć, czy użytkownik wyraził zgodę, czy nie. xiaomi nie udostępniaj tej funkcji. najlepszą rzeczą, jaką możesz zrobić, to wyświetlić małe okno dialogowe dla użytkownika z listą kontrolną: "Zezwalam już na autostartowanie tej aplikacji". i proszę o zaznaczenie mojego komentarza jako odpowiedzi, jeśli ci to pomoże. – Dika

-1

Musisz dać uprawnienia w aplikacji bezpieczeństwa dla Xiaomi.

  1. otworzyć aplikację zabezpieczeń
  2. przejść do uprawnień
  3. iść na auto rozpocząć
  4. włączyć aplikacje, które chcesz zachować uruchomiony w tle!

To zadziałało dla mnie ..!

+0

Sposób, w jaki te kroki można wykonać programowo. Wspomniałeś o ręcznych krokach. –

Powiązane problemy