Mam problem z odzyskiwaniem kontaktów z książki kontaktów w systemie Android 8.0 Oreo java.lang.IllegalStateException: Tylko nieprzejrzyste działania na pełnym ekranie mogą prosić o orientację
Próbuję uzyskać kontakt w mojej działalności z książki telefonicznej i działa idealnie dla Lollipop, Marshmallow, Nougat itp., Ale daje mi błąd dla Oreo w ten sposób, proszę, pomóż mi. Mój kod jest tutaj poniżej.
Kod demonstracyjny: -
private void loadContacts() {
contactAsync = new ContactLoaderAsync();
contactAsync.execute();
}
private class ContactLoaderAsync extends AsyncTask<Void, Void, Void> {
private Cursor numCursor;
@Override
protected void onPreExecute() {
super.onPreExecute();
Uri numContacts = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] numProjection = new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE};
if (android.os.Build.VERSION.SDK_INT < 11) {
numCursor = InviteByContactActivity.this.managedQuery(numContacts, numProjection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");
} else {
CursorLoader cursorLoader = new CursorLoader(InviteByContactActivity.this, numContacts, numProjection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");
numCursor = cursorLoader.loadInBackground();
}
}
@Override
protected Void doInBackground(Void... params) {
if (numCursor.moveToFirst()) {
try {
final int contactIdIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
final int displayNameIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
final int numberIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
final int typeIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
String displayName, number, type;
do {
displayName = numCursor.getString(displayNameIndex);
number = numCursor.getString(numberIndex);
type = getContactTypeString(numCursor.getString(typeIndex), true);
final ContactModel contact = new ContactModel(displayName, type, number);
phoneNumber = number.replaceAll(" ", "").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll("-", "");
if (phoneNumber != null || displayName != null) {
contacts.add(phoneNumber);
contactsName.add(displayName);
contactsChecked.add(false);
filterdNames.add(phoneNumber);
filterdContactNames.add(displayName);
filterdCheckedNames.add(false);
}
} while (numCursor.moveToNext());
} finally {
numCursor.close();
}
}
Collections.sort(contacts, new Comparator<String>() {
@Override
public int compare(String lhs, String rhs) {
return lhs.compareToIgnoreCase(rhs);
}
});
InviteByContactActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
mContactAdapter.notifyDataSetChanged();
}
});
return null;
}
}
private String getContactTypeString(String typeNum, boolean isPhone) {
String type = PHONE_TYPES.get(typeNum);
if (type == null)
return "other";
return type;
}
static HashMap<String, String> PHONE_TYPES = new HashMap<String, String>();
static {
PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_HOME + "", "home");
PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE + "", "mobile");
PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_WORK + "", "work");
}
}
Dziennik błędów: -
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example, PID: 6573
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.Activity.InviteByContactActivity}: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
java
android
android-8.0-oreo
android-8.1-oreo
Shubham Sejpal
źródło
źródło
Odpowiedzi:
Problem wydaje się występować, gdy docelowy sdk ma 28 lat. Więc po wypróbowaniu wielu opcji w końcu to zadziałało.
styl:-
Uwaga: rodzic = "Theme.AppCompat.Light.NoActionBar" jest potrzebny dla interfejsu API 28. Wcześniej miałem coś innego w interfejsie API 26. Działało świetnie, ale zaczęło dawać problemy w wieku 28 lat. Mam nadzieję, że to pomaga komuś tutaj. EDYCJA: W przypadku niektórych tylko ustawienie
<item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item>
działało. Może zależeć od sposobu wdrożenia rozwiązania. W moim przypadku działało, ustawiając je na true.źródło
<item name="android:windowIsTranslucent">false</item>
a także musiałem ustawić,<item name="android:windowIsFloating">false</item>
zanim zadziała.screenOrientation
atrybut wactivity
tagu, a jedyną rzeczą, która powoduje, że katastrofa jestscreenOrientation
ustawiany, gdyandroid:windowIsTranslucent
jest ustawiona na wartość true.W Androidzie Oreo (API 26) nie można zmienić orientacji dla działania, które ma styl poniżej linii
lub
Istnieje kilka sposobów rozwiązania tego:
1) Możesz po prostu usunąć powyższe linie (lub zmienić je na false ), a aplikacja będzie działać poprawnie.
2) Lub możesz najpierw usunąć poniżej manifestu z manifestu dla tego działania
Następnie musisz dodać ten wiersz do swojej aktywności (w onCreate ())
3) Możesz utworzyć nowy
styles.xml
wvalues-v26
folderze i dodać go do swojegostyle.xml
. (Dzięki komentarzowi AbdelHady )źródło
android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
styles.xml
wvalues-v26
celu wyłączeniaandroid:windowIsTranslucent
tylko do tego API.<bool name="allowWindowFullScreenTranslucent">true</bool>
i odniosłem się do niej w<item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>
. Następnie w styles.xml w wartości-v26 ustaw go na,false
aw wartościach i wartości-v27 ustaw natrue
.W Androidzie O i później ten błąd występuje po ustawieniu
w Manifeście.
Usuń tę linię i użyj
w twojej działalności.
To rozwiąże problem.
źródło
<item name="android:windowIsTranslucent">true</item>
z mojego stylu, który odziedziczyłTheme.AppCompat.Light.NoActionBar
po mnie.Google zgłasza ten wyjątek od
onCreate
metody działania po wersji 27, ich znaczenie to: jeśli działanie jest półprzezroczyste lub zmiennoprzecinkowe, jego orientacja powinna opierać się na działaniu nadrzędnym (w tle), nie może samodzielnie podjąć decyzji.Nawet jeśli usuniesz
android:screenOrientation="portrait"
z pływającego lub półprzezroczystego działania, ale naprawisz orientację na jego działaniu nadrzędnym (w tle), nadal jest to ustalone przez rodzica, co już przetestowałem.Jedna szczególna sytuacja: jeśli uczynisz półprzezroczystym działaniem programu uruchamiającego, nie będzie ono nadrzędne (w tle), więc zawsze obracaj z urządzeniem. Chcesz to naprawić, musisz wziąć inny sposób na zastąpienie
<item name="android:windowIsTranslucent">true</item>
stylu.źródło
Jeśli używasz przezroczystego działania na pełnym ekranie, nie ma potrzeby określania blokady orientacji dla działania. To zajmie ustawienia konfiguracji działania nadrzędnego. Więc jeśli aktywność rodzica ma w manifeście:
twoja przezroczysta aktywność będzie miała tę samą blokadę orientacji: portret.
źródło
Użyłem
android:screenOrientation="behind"
zamiastandroid:screenOrientation="portrait"
. Zasadniczo utworzyłeś okno dialogowe (w działaniu) i okno dialogowe nie może samodzielnie zażądać orientacji, aby to zrobić, wymaga działania rodzica (ponieważ rodzic jest widoczny w tle i ma własny układ).źródło
Jedyne rozwiązanie, które naprawdę działa:
Zmiana:
do:
w styles.xml
Może to jednak powodować problem z ekranem powitalnym (biały ekran podczas uruchamiania) ... W takim przypadku dodaj następujący wiersz do pliku styles.xml:
tuż pod linią windowIsTranslucent.
Ostatnia szansa, jeśli poprzednie wskazówki nie działają: docelowy zestaw SDK 26 zamiast o 27.
źródło
Jeśli musisz użyć
setRequestedOrientation()
, nie ma innej możliwości, niż poświęcić atrybut windowIsTranslucent na Androidzie 8.0values\styles.xml
dla poziomu API 25- (<8,0)values-v26\styles.xml
dla interfejsu API poziomu 26 (= 8,0)values-v27\styles.xml
dla interfejsu API na poziomie 27+ (> 8,0)źródło
Wiele osób naprawiło problem, więc opowiem o źródle problemu.
Zgodnie z logiem wyjątków :
Kod, który wywołał wyjątek w Activity.java
mActivityInfo.isFixedOrientation () :
Zgodnie z powyższą analizą kodu, gdy TargetSdkVersion> = 27, przy użyciu SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT i innych powiązanych atrybutów, użycie atrybutów tematu windowIsTranslucent, windowIsFloating i windowSwipeToDismiss spowoduje wyjątek.
Po znalezieniu problemu możesz zmienić TargetSdkVersion lub usunąć powiązane atrybuty kompozycji zgodnie z własnymi potrzebami.
źródło
Nie mogę zgodzić się na najbardziej ocenianą odpowiedź, ponieważ
powoduje błąd
ale to sprawia, że to działa dla mnie
i używaj go do swojej Aktywności, kiedy się rozwijasz
w AndroidManifest.xml
źródło
Po prostu usuń tę linię
android:screenOrientation="portrait"
aktywności z Manifiest.xmlTa aktywność uzyska orientację na podstawie poprzedniej aktywności, więc nie ma potrzeby stosowania orientacji, która ma
<item name="android:windowIsTranslucent">true</item>
.źródło
wydaje się, gdy docelowym SDK jest pie (poziom interfejsu API 28.0), a parametr WindowIsTranslucent ma wartość true
<item name="android:windowIsTranslucent">true</item>
i próbujesz uzyskać dostęp do orientacji. problem pochodzi z Androida oreo 8.0 (api poziom 26) istnieją dwa sposoby na rozwiązanie tego
jeśli ustawiasz orientację w taki sposób
lub w klasie aktywności takiej jak ta
usuń z obu miejsc.
i obserwowane, gdy ustawisz windowIsTranslucent na true, pobiera orientację od aktywności rodzica.
źródło
w pliku manifestu ustaw drugie działanie parentActivityName jako pierwsze działanie i usuń parametr screenOrientation do drugiego działania. oznacza to, że twoja pierwsza aktywność jest rodzicem i decydujesz o orientacji drugiej aktywności.
źródło
Wystarczy ustawić orientację aktywności w pliku Manifiest.xml
LUB dla ograniczonego do orientacji pionowej
Możesz także użyć w działaniu, w
onCreate
wywołaniu metody przedsuper.onCreate(...)
npźródło
Miałem ten sam problem, a moim rozwiązaniem było wyeliminowanie linii
a następnie dodaj to do działania:
źródło
Po przeprowadzeniu niektórych badań wydaje się, że ten problem może wynikać z błędu Google. Dla mnie udało mi się zostawić ten wiersz w metodzie działań w funkcji OnCreate:
ORAZ zmieniłem celSdkVersion na 26. Posiadanie tej linii w moim onCreate wciąż powodowało awarię, podczas gdy mój obiekt targetSdkVersion wciąż był ustawiony na 27. Ponieważ jak dotąd żadne rozwiązanie dla mnie nie działało, stwierdziłem, że działa to jako tymczasowa poprawka dla teraz.
źródło
Jest to konflikt (błąd) między motywami w pliku style.xml w wersjach Androida 7 (poziomy API 24,25) i 8 (poziomy API 26, 27), gdy masz
android:screenOrientation="portrait"
: wewnątrz określonej aktywności (która ulega awarii) w AndroidManifest.xmlI
w motywie zastosowanym do tej aktywności w style.xml
Można go rozwiązać w następujący sposób, w zależności od potrzeb:
1- Usuń z wyżej wymienionych właściwości, które powodują konflikt
2- orientacja aktywność Zmiana jednej z tych wartości, jak trzeba:
unspecified
albobehind
i tak dalej, które można znaleźć tutaj: odniesienie Google dla Androida: screenOrientation `3- Ustaw programowo orientację w czasie wykonywania
źródło
Ostatnio stanąłem przed problemem i oto rozwiązanie.
Nie trzeba zmieniać parametru orientacji ekranu ustawionego w pliku manifestu Androida.
Po prostu dodaj dwa foldery
Następnie skopiuj tam plik styles.xml i themes.xml.
i zmień następujące parametry z PRAWDA na FAŁSZ.
To będzie działać.
Typowy błąd Androida 8.0
źródło
Problem ten napotkałem tylko w zestawie SDK 26 (8.0.0), jeśli korzystam z WindowIsTranslucent „true” i wymuszam ustawienie orientacji:
Oto rozwiązanie:
źródło
Ten błąd pojawiał się podczas próby przechwycenia obrazu lub zrobienia zdjęcia z galerii. Dla mnie najlepszym rozwiązaniem jest usunięcie obu
i
teraz moja aktywność korzysta z tego motywu:
źródło
windowIsFloating
powoduje taką samą awarię jakwindowIsTranslucent
.tylko 8.0.0 zgłasza wyjątek, powyżej 8.0 usunął wyjątek
źródło
appInfo.targetSdkVersion > O
wyrzuć wyjątektarget
wersję SDK. Nie ma znaczenia, jaką wersję SDK faktycznie uruchamia urządzenie, kompilujesz się na Androidzie O (28), ale nie przestrzegasz konwencji tej wersji platformy.Jedyną rzeczą, która działała dla mnie, była zmiana
do
w manifeście dla wszystkich półprzezroczystych czynności.
W ten sposób jest kompatybilny ze wszystkimi wersjami API, ponieważ przezroczyste działanie zdaje się dziedziczyć swoją orientację od działania nadrzędnego z dnia
targetApi: 28
.Styl można pozostawić bez zmian
<item name="android:windowIsTranslucent">true</item>
.źródło
Posługiwać się
I motyw
źródło
Nie wiem, czy jest to błąd Google, czy zamierzone zachowanie, ale (przynajmniej chwilowo) rozwiązałem go, zmieniając compileSdkVersion i targetSdkVersion z powrotem na 26 w gradle ...
źródło
Jeśli problem nie został rozwiązany, po prostu zarejestruj aktywność reklamy w manifeście w następujący sposób:
Musisz także zaktualizować do najnowszej wersji SDK.
źródło
Prawdopodobnie wyświetlasz Aktywność przypominającą okno dialogowe (nie na pełnym ekranie), więc usuń screenOrientation z Manifestu lub z kodu. To rozwiąże problem.
źródło
stało się to po 27, użyj targetSdkVersion 26 zamień, poczekaj, aż go naprawi
źródło
Właśnie usunąłem tagi „portret” z elementów pełnoekranowych i wszystko poszło dobrze.
źródło
Sprawdź styl swojej działalności i upewnij się, że nie używasz żadnych rzeczy związanych z przezroczystością, zmień styl na alternatywny. Abyśmy mogli rozwiązać ten problem.
źródło
Rozwiązałem ten problem, usuwając
android:screenOrientation="portrait"
i dodając poniższy kod do mojego onCreatepodczas gdy moje właściwości motywu są
źródło