Ich stehe vor dem Problem beim Abrufen der Kontakte aus dem Kontaktbuch in Android 8.0 Oreo Java.lang.IllegalStateException: Nur opake Aktivitäten im Vollbildmodus können die Ausrichtung anfordern
Ich versuche, den Kontakt in meiner Aktivität aus dem Telefonbuch zu erhalten, und es funktioniert perfekt für Lollipop, Marshmallow, Nougat usw. Aber es gibt mir den Fehler für Oreo. 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
Das Problem scheint zu bestehen, wenn das Ziel-SDK 28 ist. Nachdem also viele Optionen ausprobiert wurden, funktionierte es schließlich.
<activity
Android:name=".activities.FilterActivity"
Android:theme="@style/Transparent"
Android:windowSoftInputMode="stateHidden|adjustResize" />
stil:-
<style name="Transparent" parent="Theme.AppCompat.Light.NoActionBar">
<item name="Android:windowIsTranslucent">true</item>
<item name="Android:windowBackground">@Android:color/transparent</item>
<item name="Android:windowContentOverlay">@null</item>
<item name="Android:windowNoTitle">true</item>
<item name="Android:windowIsFloating">true</item>
<item name="Android:backgroundDimEnabled">false</item>
</style>
Hinweis: Für api 28 ist parent = "Theme.AppCompat.Light.NoActionBar" erforderlich. Hatte zuvor etwas anderes bei api 26. Hat großartig gearbeitet, aber mit 28 ..__ Problem angefangen.
In Android O und später tritt dieser Fehler bei der Einstellung auf
Android:screenOrientation="portrait"
in Manifest.
Entfernen Sie diese Zeile und verwenden Sie
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
in deiner Tätigkeit.
Dies wird Ihr Problem beheben.
Google wirft diese Ausnahme für die onCreate
-Methode von Activity nach v27 aus. Ihre Bedeutung ist: Wenn eine Aktivität durchscheinend oder fließend ist, sollte ihre Orientierung auf der übergeordneten Aktivität (Hintergrundaktivität) beruhen, sie kann sich nicht entscheiden.
Selbst wenn Sie Android:screenOrientation="portrait"
aus der schwebenden oder durchscheinenden Aktivität entfernen, aber die Ausrichtung auf die übergeordnete (Hintergrund-) Aktivität fixieren, wird dies immer noch vom übergeordneten Element behoben, das ich bereits getestet habe.
Eine besondere Situation: Wenn Sie eine Starteraktivität durchsichtig machen, hat sie keinen übergeordneten Hintergrund (Hintergrund). Drehen Sie sie daher immer mit dem Gerät. Um es zu beheben, müssen Sie einen anderen Weg nehmen, um den <item name="Android:windowIsTranslucent">true</item>
-Stil zu ersetzen.
In Android Oreo können Sie die Ausrichtung für Aktivitäten nicht ändern, deren Stil unterhalb der Linie liegt
<item name="Android:windowIsTranslucent">true</item>
Sie müssen zuerst entfernen unterhalb der Zeile des Manifests für diese Aktivität auswählen
Android:screenOrientation="portrait"
Zweitens müssen Sie add diese Zeile zur Java-Datei hinzufügen
//Android O fix bug orientation
if (Android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Wenn Sie eine transparente Vollbildaktivität verwenden, müssen Sie die Orientierungssperre für die Aktivität nicht angeben. Es werden die Konfigurationseinstellungen der übergeordneten Aktivität übernommen. Wenn also die übergeordnete Aktivität im Manifest steht:
Android: screenOrientation = "Porträt"
ihre durchscheinende Aktivität hat dieselbe Orientierungssperre: Hochformat.
Ich habe Android:screenOrientation="behind"
anstelle von Android:screenOrientation="portrait"
verwendet. Grundsätzlich haben Sie ein Dialogfeld (in einer Aktivität) erstellt, und das Dialogfeld kann keine Ausrichtung anfordern, da dies übergeordnete Aktivität erfordert (da ein übergeordnetes Element im Hintergrund sichtbar ist und ein eigenes Layout besitzt).
"hinter" Die gleiche Ausrichtung wie die Aktivität, die sich unmittelbar im Aktivitätsstapel darunter befindet.
Die einzige Lösung, die wirklich funktioniert:
Veränderung:
<item name="Android:windowIsTranslucent">true</item>
zu:
<item name="Android:windowIsTranslucent">false</item>
in styles.xml
Dies kann jedoch zu Problemen mit Ihrem Begrüßungsbildschirm führen (weißer Bildschirm beim Start) ... In diesem Fall fügen Sie Ihrer styles.xml die folgende Zeile hinzu:
<item name="Android:windowDisablePreview">true</item>
direkt unter der windowIsTranslucent-Zeile.
Letzte Chance, wenn die vorherigen Tipps nicht funktionieren: Ziel SDK 26 statt 27.
Viele Leute haben eine Lösung gegeben, deshalb werde ich über die Ursache des Problems sprechen.
Laut Ausnahmelog:
Caused by: Java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
at Android.app.Activity.onCreate(Activity.Java:1081)
at Android.support.v4.app.SupportActivity.onCreate(SupportActivity.Java:66)
at Android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.Java:297)
at Android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.Java:84)
at com.nut.blehunter.ui.DialogContainerActivity.onCreate(DialogContainerActivity.Java:43)
at Android.app.Activity.performCreate(Activity.Java:7372)
at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1218)
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:3147)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:3302)
at Android.app.ActivityThread.-wrap12(Unknown Source:0)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1891)
at Android.os.Handler.dispatchMessage(Handler.Java:108)
at Android.os.Looper.loop(Looper.Java:166)
Der Code, der die Ausnahme in Activity.Java ausgelöst hat
//Need to pay attention mActivityInfo.isFixedOrientation() and ActivityInfo.isTranslucentOrFloating(ta)
if (getApplicationInfo().targetSdkVersion >= O_MR1 && mActivityInfo.isFixedOrientation()) {
final TypedArray ta = obtainStyledAttributes(com.Android.internal.R.styleable.Window);
final boolean isTranslucentOrFloating = ActivityInfo.isTranslucentOrFloating(ta);
ta.recycle();
//Exception occurred
if (isTranslucentOrFloating) {
throw new IllegalStateException(
"Only fullscreen opaque activities can request orientation");
}
}
mActivityInfo.isFixedOrientation () :
/**
* Returns true if the activity's orientation is fixed.
* @hide
*/
public boolean isFixedOrientation() {
return isFixedOrientationLandscape() || isFixedOrientationPortrait()
|| screenOrientation == SCREEN_ORIENTATION_LOCKED;
}
/**
* Returns true if the activity's orientation is fixed to portrait.
* @hide
*/
boolean isFixedOrientationPortrait() {
return isFixedOrientationPortrait(screenOrientation);
}
/**
* Returns true if the activity's orientation is fixed to portrait.
* @hide
*/
public static boolean isFixedOrientationPortrait(@ScreenOrientation int orientation) {
return orientation == SCREEN_ORIENTATION_PORTRAIT
|| orientation == SCREEN_ORIENTATION_SENSOR_PORTRAIT
|| orientation == SCREEN_ORIENTATION_REVERSE_PORTRAIT
|| orientation == SCREEN_ORIENTATION_USER_PORTRAIT;
}
/**
* Determines whether the {@link Activity} is considered translucent or floating.
* @hide
*/
public static boolean isTranslucentOrFloating(TypedArray attributes) {
final boolean isTranslucent = attributes.getBoolean(com.Android.internal.R.styleable.Window_windowIsTranslucent, false);
final boolean isSwipeToDismiss = !attributes.hasValue(com.Android.internal.R.styleable.Window_windowIsTranslucent)
&& attributes.getBoolean(com.Android.internal.R.styleable.Window_windowSwipeToDismiss, false);
final boolean isFloating = attributes.getBoolean(com.Android.internal.R.styleable.Window_windowIsFloating, false);
return isFloating || isTranslucent || isSwipeToDismiss;
}
Gemäß der obigen Codeanalyse wird bei Verwendung von TargetSdkVersion> = 27 bei Verwendung von SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT und anderen zugehörigen Attributen die Verwendung von windowIsTranslucent, windowIsFloating und windowSwipeToDismiss-Themenattributen eine Ausnahme ausgelöst.
Nachdem das Problem gefunden wurde, können Sie die TargetSdkVersion ändern oder die zugehörigen Attribute des Designs gemäß Ihren Anforderungen entfernen.
Ich kann der meist bewerteten Antwort nicht zustimmen, weil
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
verursacht einen Fehler
Java.lang.IllegalStateException: Nur undurchsichtige Vollbildaktivitäten können Orientierung anfordern
aber das macht es für mich
<style name="TranslucentTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="Android:windowNoTitle">true</item>
<item name="Android:windowActionBar">false</item>
<item name="Android:windowFullscreen">true</item>
<item name="Android:windowContentOverlay">@null</item>
</style>
und verwenden Sie es für Ihre Aktivität, wenn Sie aus
InterstitialActivity extends AppCompatActivity
in AndroidManifest.xml
<activity
Android:name=".InterstitialActivity"
...
Android:screenOrientation="portrait"
Android:theme="@style/TranslucentTheme" />
Entfernen Sie einfach diese Zeile Android:screenOrientation="portrait"
der Aktivität in Manifest.xml
Diese Aktivität erhält eine Orientierung aus der vorherigen Aktivität, so dass keine Orientierung mit <item name="Android:windowIsTranslucent">true</item>
angewendet werden muss.
es scheint, als ob das Ziel-SDK pie (API-Level 28.0) und windowIsTranslucent true ist
<item name="Android:windowIsTranslucent">true</item>
und Sie versuchen, Orientierung zuzugreifen. Das Problem ist mit Android oreo 8.0 (API-Level 26) verbunden. Es gibt zwei Möglichkeiten, dieses Problem zu lösen
wenn Sie in einem solchen Manifest die Orientierung festlegen
Android:screenOrientation="portrait"
oder in einer solchen Aktivitätsklasse
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
entfernen Sie von beiden Stellen.
und beobachtet, wenn Sie windowIsTranslucent auf true setzen, wird die Orientierung von der übergeordneten Aktivität übernommen.
values-v26
create styles.xml (v26)
<style name="Base.Theme.DesignDemo" parent="Base.Theme.AppCompat.Light">
...
<!-- Android 8.0(api26),Only fullscreen opaque activities can request orientation -->
<item name="Android:windowIsTranslucent">false</item>
...
</style>
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. es bedeutet, dass Ihre erste Aktivität der Elternteil ist und entscheiden Sie sich für eine Orientierung Ihrer zweiten Aktivität.
<activity
Android:name=".view.FirstActiviy"
Android:screenOrientation="portrait"
Android:theme="@style/AppTheme" />
<activity
Android:name=".view.SecondActivity"
Android:parentActivityName=".view.FirstActiviy"
Android:theme="@style/AppTheme.Transparent" />
Dieses Problem trat nur in SDK 26 (8.0.0) auf, wenn windowIsTranslucent 'true' verwendet und die Ausrichtung gewaltsam festgelegt wurde:
Hier ist die Lösung:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
// fixing portrait mode problem for SDK 26 if using windowIsTranslucent = true
if (Build.VERSION.SDK_INT == 26) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
<style name="SplashActivty" parent="AppTheme">
<item name="Android:windowIsTranslucent">true</item>
<item name="Android:windowBackground">@Android:color/transparent</item>
<item name="Android:windowContentOverlay">@null</item>
<item name="Android:windowNoTitle">true</item>
</style>
<!-- Splash screen -->
<activity
Android:name="edu.aku.family_hifazat.activities.SplashActivity"
Android:label="@string/app_name"
Android:screenOrientation="unspecified"
Android:theme="@style/SplashActivty">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Nach einigen Nachforschungen scheint es, dass dieses Problem auf einen Google-Fehler zurückzuführen ist. Für mich konnte ich diese Zeile in meiner Activities onCreate-Methode belassen:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
UND ich habe meine targetSdkVersion auf 26 geändert. Diese Zeile in onCreate hatte immer noch einen Absturz, während meine targetSdkVersion immer noch auf 27 festgelegt war. Da bisher noch keine Lösung für mich funktioniert hat, stellte ich fest, dass dies als temporäre Lösung für das Problem funktioniert jetzt.
Ich hatte das gleiche Problem und meine Lösung bestand darin, die Leitung zu beseitigen
Android:screenOrientation="portrait"
und füge dies in die Aktivität ein:
if (Android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Es ist ein Konflikt (Fehler) zwischen der Themes in der style.xml-Datei in Android-Versionen 7 (API-Ebenen 24,25) und 8 (API-Ebenen 26,27), wenn du. .. hast
Android:screenOrientation="portrait"
:ind eine bestimmte Aktivität (die abstürzt) in AndroidManifest.xml enthalten
&
<item name="Android:windowIsTranslucent">true</item>
in dem Design, das auf diese Aktivität in style.xml angewendet wurde
Es kann auf folgende Weise entsprechend Ihren Bedürfnissen gelöst werden:
1- Entfernen Sie eine der oben genannten Eigenschaften, die Konflikte verursachen
2- Ändern Sie die Aktivitätsausrichtung nach Bedarf in einen der folgenden Werte: unspecified
oder behind
usw., die Sie hier finden können: Google-Referenz für Android: screenOrientation ` 3- Stellen Sie die Ausrichtung programmatisch ein Laufzeit
Das einzige, was für mich funktioniert hat, war die Veränderung
Android:screenOrientation="portrait"
zu
Android:screenOrientation="unspecified"
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 targetApi: 28
zu erben scheint.
Der Stil kann so belassen werden, wie er <item name="Android:windowIsTranslucent">true</item>
enthält.
Wahrscheinlich zeigen Sie eine Aktivität, die wie Dialog (nicht voller Bildschirm) aussieht, entfernen Sie also screen Orientierung from Manifest oder aus Code. Dies wird das Problem beheben.
dies geschah nach 27, benutze targetSdkVersion 26 ersetzen, warte, bis Google es behoben hat
Legen Sie einfach die Ausrichtung der Aktivität in Manifest.xml fest
Android:screenOrientation="unspecified"
Ich weiß nicht, ob dies ein Fehler von Google oder ein beabsichtigtes Verhalten ist, aber ich habe es (zumindest momentan) gelöst, indem ich compileSdkVersion und targetSdkVersion in Gradle auf 26 zurückgesetzt habe.
Wenn Sie Ihr Problem nicht gelöst haben, registrieren Sie die Anzeigenaktivität wie folgt im Manifest:
<activity
Android:name="com.google.Android.gms.ads.AdActivity"
Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
tools:replace="Android:theme"
/>
Sie müssen auch auf die neueste Version von SDK aktualisieren.
Ich habe diese Fehlermeldung erhalten, als ich versuche, ein Bild aufzunehmen oder ein Bild aus der Galerie aufzunehmen
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
und
Android:screenOrientation="portrait"
jetzt verwendet meine Aktivität dieses Thema:
<style name="Transparent" parent="Theme.AppCompat.Light.NoActionBar">
<item name="Android:windowNoTitle">true</item>
<item name="Android:windowBackground">@Android:color/transparent</item>
<item name="Android:colorBackgroundCacheHint">@null</item>
<item name="Android:windowAnimationStyle">@Android:style/Animation</item>
<item name="Android:windowIsTranslucent">false</item>
<item name="Android:windowContentOverlay">@null</item>
<item name="Android:windowIsFloating">true</item>
<item name="Android:backgroundDimEnabled">false</item>
</style>
Ich hatte das gleiche Problem und ich habe es behoben, indem ich folgendes eingestellt habe: <item name="Android:windowIsFloating">false</item>
in styles.xml
Benutzer erweitern AppCompatActivity
& es wird funktionieren !!
Entfernen Sie die Zeilen Ihres Designs:
<item name="Android:windowIsTranslucent">true</item>
und
<item name="Android:windowIsFloating">true</item>
danach fügen Sie in Ihrer Aktivität Android:screenOrientation="portrait"
hinzu.
Benutzen
Android:screenOrientation="behind"
Und Thema
<style name="translucent" parent="Theme.AppCompat.Light.NoActionBar">
<item name="Android:windowBackground">#beaaaaaa</item>
<item name="Android:windowIsTranslucent">true</item>
<item name="Android:windowNoTitle">true</item>
<item name="Android:windowAnimationStyle">@Android:style/Animation</item>
<item name="Android:typeface">normal</item>
<item name="Android:windowSoftInputMode">adjustPan</item>
<item name="windowActionBar">false</item>
</style>
Ich habe gerade die Tags "Hochformat" von den Nicht-Vollbild-Elementen entfernt und alles ist gut gelaufen.
Android:screenOrientation="portrait"