MIUI 10 nie pozwala usłudze rozpocząć działalność - Xiaomi Redmi Note

9

Moja aplikacja ma usługę i aktywność. Z usługi wywoływana jest aktywność z następującym kodem:

Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

nawet bez flag zwykle okno aktywności jest wyświetlane z poprawnym układem. Jednak w Xiaomi Redmi Note 4 z Androidem 7 układ aktywności nie jest wyświetlany. Na logcat widzę tylko następujący wiersz:

I / Oś czasu: Oś czasu: Activity_launch_request czas: 281438674 intent: Intent {flg = 0x30000000 cmp = com.test.app / .MainActivity}

Uważam, że nie jest to problem z Androidem 7 (API 24), ponieważ na innym urządzeniu z Androidem 7 usługa może pomyślnie rozpocząć działanie. Wydaje mi się, że MIUI uniemożliwia uruchomienie działalności z usługi.

Próbowałem zmienić sposób zdefiniowania działania w manifeście. Próbowałem też z kilkoma różnymi flagami. Wszystkie moje testy zakończyły się niepowodzeniem. Nie udało mi się rozpocząć działalności. Najgorsze jest to, że w dziennikach nie ma błędu / wyjątku.

Masz jakieś pomysły na ten temat?

ilker Aktuna
źródło
Ten sam problem na MIUI 11.
AlexS

Odpowiedzi:

12

Na ekranie Informacje o aplikacji w aplikacji Ustawienia systemowe> Inne uprawnienia> Wyświetl wyskakujące okna podczas działania w tle.

Wydaje się, że zostało to wprowadzone w MIUI 11.

Edycja: oto fragment kodu, którego używam. Dodaję to do listy uprawnień w RecyclerView.

Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class);
String miui = (String) get.invoke(c, "ro.miui.ui.version.name");
if (miui != null && miui.contains("11")) {
            PermissionData mPopup = new PermissionData();
            mPopup.text = "Other permissions > Display pop-up while in background";
            mPopup.onClickListener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                    intent.setData(uri);
                    startActivity(intent);
                }
            };

            mPermissionData.add(mPopup);
}

AKTUALIZACJA: Aby sprawdzić, czy to zezwolenie zostało udzielone, możesz skorzystać z już uruchomionej usługi i uruchomić fałszywe działanie przezroczyste, a także w onCreateoddzwanianiu na LocalBroadcastManagerpodobnym lub podobnym, a będziesz wiedział, że zostało udzielone. To brzydkie rozwiązanie, ale dla niektórych może być przydatne.

Alex Newman
źródło
Dziękuję Ci. to jest naprawdę problem. czy jest jakiś sposób, aby poprosić o to pozwolenie w aplikacji? lub dodać programowo?
ilker Aktuna
Żadnego, którego jestem świadomy. Przekierowuję na ekran informacji o aplikacji i mówię im, aby włączyć tę funkcję, jeśli korzystają z MIUI ..
Alex Newman,
ale aby to zrobić, musisz uruchomić aplikację. jak ty to robisz ? za pośrednictwem powiadomień?
ilker Aktuna
Robię to, gdy poproszę o kolejne wymagane pozwolenie podczas pierwszej konfiguracji aplikacji, więc z głównej aplikacji, a nie z usługi.
Alex Newman,
1
Naprawdę użyteczna informacja dla MIUI, ponieważ samo udzielenie zezwolenia rozpoczęło działalność z usługi w tle bez zmiany dowolnego kodu.
Panache