Beim Abrufen der Kontakte aus dem Kontaktbuch in Android 8.0 tritt das Problem auf. Oreo java.lang.IllegalStateException: Nur undurchsichtige Vollbildaktivitäten können eine Orientierung anfordern
Ich versuche, den Kontakt in meiner Aktivität aus dem Telefonkontaktbuch zu erhalten, und es funktioniert perfekt für Lollipop, Marshmallow, Nougat usw., aber es gibt mir den Fehler für Oreo wie diesen, bitte helfen Sie mir. Mein Code ist hier unten.
Demo-Code: -
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");
}
}
Fehlerprotokoll:-
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
quelle
quelle
Antworten:
Das Problem scheint aufzutreten, wenn Ihr Ziel-SDK 28 ist. Nachdem Sie also viele Optionen ausprobiert haben, hat dies endlich funktioniert.
Stil:-
Hinweis: parent = "Theme.AppCompat.Light.NoActionBar" wird für API 28 benötigt. Hatte zuvor etwas anderes in API 26. Hat großartig funktioniert, hat aber mit 28 angefangen, Probleme zu verursachen. Ich hoffe, es hilft jemandem hier draußen. BEARBEITEN: Für einige nur durch Setzen von
<item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item>
funktioniert. Kann davon abhängen, wie Sie die Lösung implementieren. In meinem Fall hat es funktioniert, indem Sie sie auf true setzen.quelle
<item name="android:windowIsTranslucent">false</item>
und musste es auch einstellen,<item name="android:windowIsFloating">false</item>
bevor es funktionieren würde.screenOrientation
Dasactivity
Tag enthält kein Attribut , und das einzige, was den Absturz verursacht, wirdscreenOrientation
gesetzt, währendandroid:windowIsTranslucent
auf true gesetzt wird.In Android Oreo (API 26) können Sie die Ausrichtung für Aktivitäten nicht ändern, deren Stil unter den Zeilen liegt
oder
Sie haben mehrere Möglichkeiten, dies zu lösen:
1) Sie können einfach die obigen Zeilen entfernen (oder auf false setzen ) und Ihre App funktioniert einwandfrei.
2) Oder Sie können zuerst die folgende Zeile aus dem Manifest für diese Aktivität entfernen
Dann müssen Sie diese Zeile zu Ihrer Aktivität hinzufügen (in onCreate ())
3) Sie können neue erstellen
styles.xml
invalues-v26
Ordner und fügen Sie diese zu Ihrerstyle.xml
. (Danke an AbdelHady Kommentar)quelle
android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
styles.xml
invalues-v26
zu deaktivierenandroid:windowIsTranslucent
nur für diese API.<bool name="allowWindowFullScreenTranslucent">true</bool>
und in darauf verwiesen<item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>
. Setzen Sie es dann in styles.xml unter values-v26 auffalse
und in values and values-v27 auftrue
.In Android O und höher tritt dieser Fehler beim Festlegen auf
im Manifest.
Entfernen Sie diese Linie und verwenden Sie
in Ihrer Tätigkeit.
Dies wird Ihr Problem beheben.
quelle
<item name="android:windowIsTranslucent">true</item>
von meinem Stil, der vonTheme.AppCompat.Light.NoActionBar
für mich gearbeitet erbt .Google
onCreate
löst diese Ausnahme für die Methode von Activity nach Version 27 aus. Ihre Bedeutung lautet: Wenn eine Aktivität durchscheinend oder schwebend ist, sollte ihre Ausrichtung auf der übergeordneten Aktivität (Hintergrundaktivität) beruhen. Sie kann keine Entscheidung über sich selbst treffen.Selbst wenn Sie
android:screenOrientation="portrait"
aus der schwebenden oder durchscheinenden Aktivität entfernen, aber die Ausrichtung auf die übergeordnete Aktivität (Hintergrundaktivität) festlegen, wird sie dennoch von der übergeordneten Aktivität behoben, die ich bereits getestet habe.Eine besondere Situation: Wenn Sie eine Launcher-Aktivität durchscheinend machen, hat sie kein übergeordnetes Element (Hintergrund). Drehen Sie sie daher immer mit dem Gerät. Wenn Sie das Problem beheben möchten, müssen Sie einen anderen Weg einschlagen, um den
<item name="android:windowIsTranslucent">true</item>
Stil zu ersetzen .quelle
Wenn Sie eine transparente Vollbildaktivität verwenden, muss die Orientierungssperre für die Aktivität nicht angegeben werden. Es werden die Konfigurationseinstellungen der übergeordneten Aktivität übernommen. Wenn also die übergeordnete Aktivität im Manifest enthalten ist:
Ihre durchscheinende Aktivität hat dieselbe Orientierungssperre: Porträt.
quelle
Ich habe
android:screenOrientation="behind"
statt verwendetandroid:screenOrientation="portrait"
. Grundsätzlich haben Sie ein Dialogfeld (in einer Aktivität) erstellt, und das Dialogfeld kann keine eigene Orientierung anfordern. Dazu ist eine übergeordnete Aktivität erforderlich (da ein übergeordnetes Element im Hintergrund sichtbar ist und ein eigenes Layout hat).quelle
Die einzige Lösung, die wirklich funktioniert:
Veränderung:
zu:
in styles.xml
Dies kann jedoch zu einem Problem mit Ihrem Begrüßungsbildschirm führen (weißer Bildschirm beim Start) ... Fügen Sie in diesem Fall die folgende Zeile zu Ihrer styles.xml hinzu:
direkt unter der windowIsTranslucent-Linie.
Letzte Chance, wenn die vorherigen Tipps nicht funktionieren: Ziel SDK 26 statt o 27.
quelle
Wenn Sie verwenden müssen
setRequestedOrientation()
, gibt es keine andere Möglichkeit, als das Attribut windowIsTranslucent unter Android 8.0 zu opfernvalues\styles.xml
für API-Level 25- (<8,0)values-v26\styles.xml
für API-Level 26 (= 8,0)values-v27\styles.xml
für API Level 27+ (> 8,0)quelle
Viele Leute haben eine Lösung angegeben, daher werde ich über die Ursache des Problems sprechen.
Laut Ausnahmeprotokoll:
Der Code, der die Ausnahme in Activity.java ausgelöst hat
mActivityInfo.isFixedOrientation () :
Gemäß der obigen Codeanalyse löst die Verwendung der Themenattribute windowIsTranslucent, windowIsFloating und windowSwipeToDismiss bei Verwendung von SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT und anderen verwandten Attributen eine Ausnahme aus, wenn TargetSdkVersion> = 27 ist.
Nachdem das Problem gefunden wurde, können Sie die TargetSdkVersion ändern oder die zugehörigen Attribute des Themas entsprechend Ihren Anforderungen entfernen.
quelle
Ich kann der am besten bewerteten Antwort nicht zustimmen, weil
verursacht einen Fehler
aber das macht es für mich funktioniert
und verwenden Sie es für Ihre Aktivität, wenn Sie von verlängern
in AndroidManifest.xml
quelle
Entfernen Sie einfach diese
android:screenOrientation="portrait"
Aktivitätszeile in Manifiest.xmlDiese Aktivität wird von der vorherigen Aktivität orientiert, sodass keine Orientierung angewendet werden muss
<item name="android:windowIsTranslucent">true</item>
.quelle
es scheint, wenn das Ziel sdk pie ist (API-Level 28.0) und windowIsTranslucent wahr ist
<item name="android:windowIsTranslucent">true</item>
und Sie versuchen, auf die Orientierung zuzugreifen. Problem kommt mit Android Oreo 8.0 (API Level 26) Es gibt zwei Möglichkeiten, um dies zu lösen
wenn Sie die Ausrichtung in einem solchen Manifest festlegen
oder in einer Aktivitätsklasse wie dieser
an beiden Stellen entfernen.
und beobachtet, wenn Sie windowIsTranslucent auf true setzen, orientiert es sich an der übergeordneten Aktivität.
quelle
Legen Sie in der Manifestdatei die zweite Aktivität parentActivityName als erste Aktivität fest und entfernen Sie den Parameter screenOrientation für die zweite Aktivität. Dies bedeutet, dass Ihre erste Aktivität der Elternteil ist und Sie sich für eine Ausrichtung Ihrer zweiten Aktivität entscheiden.
quelle
Legen Sie einfach die Ausrichtung der Aktivität in Manifiest.xml fest
ODER für auf Porträtorientierung beschränkt
Sie können auch in Aktivität, In
onCreate
Methodenaufruf vorsuper.onCreate(...)
zquelle
Ich hatte das gleiche Problem und meine Lösung bestand darin, die Leitung zu beseitigen
und fügen Sie dies dann in die Aktivität ein:
quelle
Nach einigen Recherchen scheint dieses Problem auf einen Google-Fehler zurückzuführen zu sein. Für mich konnte ich diese Zeile in meiner Activities onCreate-Methode belassen:
UND ich habe meine targetSdkVersion in 26 geändert. Wenn diese Zeile in onCreate vorhanden war, kam es immer noch zu einem Absturz, während meine targetSdkVersion noch auf 27 festgelegt war. Da bisher keine andere Lösung für mich funktioniert hat, stellte ich fest, dass dies als vorübergehende Lösung für funktioniert jetzt.
quelle
Es ist ein Konflikt (Fehler) zwischen Themen in der Datei style.xml in Android-Versionen 7 (API-Level 24,25) und 8 (API-Level 26,27), wenn Sie haben
android:screenOrientation="portrait"
: innerhalb einer bestimmten Aktivität (die abstürzt) in AndroidManifest.xml&
in dem Thema, das auf diese Aktivität in style.xml angewendet wurde
Es kann auf folgende Weise nach Ihren Bedürfnissen gelöst werden:
1- Entfernen Sie eine der oben genannten Eigenschaften, die zu Konflikten führen
2- Ändern Sie die Aktivitätsorientierung nach Bedarf in einen dieser Werte:
unspecified
oderbehind
so weiter. Diese finden Sie hier: Google-Referenz für Android: screenOrientation `3- Stellen Sie die Ausrichtung programmgesteuert zur Laufzeit ein
quelle
Ich habe mich kürzlich dem Problem gestellt und hier ist die Lösung.
Sie müssen den Bildschirmausrichtungsparameter, den Sie in der Android-Manifestdatei festgelegt haben, nicht ändern.
Fügen Sie einfach zwei Ordner hinzu
Kopieren Sie dann dort Ihre Datei styles.xml und themes.xml.
und ändern Sie die folgenden Parameter von TRUE in FALSE.
Es wird klappen.
Ein häufiger Fehler von Android 8.0
quelle
Ich habe dieses Problem nur in SDK 26 (8.0.0) festgestellt, wenn windowIsTranslucent 'true' verwendet und die Ausrichtung mit Nachdruck festgelegt wurde:
Hier ist die Lösung:
quelle
Ich habe diesen Fehler erhalten, als ich versuchte, ein Bild aufzunehmen oder ein Bild aus der Galerie aufzunehmen. Bei mir funktioniert es, beide zu entfernen
und
Jetzt verwendet meine Aktivität dieses Thema:
quelle
windowIsFloating
den gleichen Absturz wie verursachtwindowIsTranslucent
.Nur 8.0.0 löst die Ausnahme aus, über 8.0 wurde die Ausnahme entfernt
quelle
appInfo.targetSdkVersion > O
werfen Sie die Ausnahmetarget
SDK-Version. Es spielt keine Rolle, welche SDK-Version das Gerät tatsächlich ausführt. Sie kompilieren gegen Android O (28), befolgen jedoch nicht die Konventionen dieser Version der Plattform.Das einzige, was für mich funktioniert hat, war sich zu ändern
zu
im Manifest für alle durchscheinenden Aktivitäten.
Auf diese Weise ist es mit allen API-Versionen kompatibel, da die durchscheinende Aktivität ihre Ausrichtung von der übergeordneten Aktivität ab zu erben scheint
targetApi: 28
.Der Stil kann unverändert bleiben
<item name="android:windowIsTranslucent">true</item>
.quelle
Verwenden
Und Thema
quelle
Ich weiß nicht, ob dies ein Fehler von Google oder ein beabsichtigtes Verhalten ist, aber ich habe ihn (zumindest vorübergehend) behoben, indem ich compileSdkVersion und targetSdkVersion in Gradle wieder auf 26 geändert habe ...
quelle
Wenn Sie Ihr Problem nicht gelöst haben, registrieren Sie die Anzeigenaktivität einfach wie folgt im Manifest:
Sie müssen auch auf die neueste Version des SDK aktualisieren.
quelle
Wahrscheinlich sehen Sie eine Aktivität, die wie ein Dialog aussieht (nicht im Vollbildmodus). Entfernen Sie daher screenOrientation aus dem Manifest oder aus dem Code. Dies wird das Problem beheben.
quelle
Dies geschah nach 27, verwenden Sie targetSdkVersion 26 ersetzen, warten Sie, bis Google es behoben hat
quelle
Ich habe gerade die Tags "Porträt" aus den Nicht-Vollbild-Elementen entfernt und alles ging gut.
quelle
Bitte überprüfen Sie den Stil Ihrer Aktivität und stellen Sie sicher, dass Sie den Stil ändern, wenn Sie keine durchscheinenden Dinge verwenden. Damit wir dieses Problem beheben können.
quelle
Ich habe dieses Problem behoben, indem
android:screenOrientation="portrait"
ich den folgenden Code entfernt und in mein onCreate eingefügt habewährend meine Themeneigenschaften sind
quelle