Я столкнулся с проблемой при извлечении контактов из книги контактов в Android 8.0. Oreo java.lang.IllegalStateException: только полноэкранные непрозрачные действия могут запрашивать ориентацию.
Я пытаюсь получить контакт в своей деятельности из телефонной книги контактов, и он отлично работает для леденцов, зефира, нуги и т. Д., Но это даст мне ошибку для Oreo, как это, пожалуйста, помогите мне. Мой код здесь ниже.
Демо-код: -
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");
}
}
Журнал ошибок:-
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
Шубхам Сейпал
источник
источник
Ответы:
Кажется, проблема возникает, когда вашей целевой SDK 28. Итак, после опробования многих вариантов, наконец, это сработало.
стиль:-
Примечание: parent = "Theme.AppCompat.Light.NoActionBar" необходим для api 28. Ранее в api 26. было что-то еще. Работал замечательно, но начал создавать проблемы в 28. Надеюсь, это поможет кому-то здесь. РЕДАКТИРОВАТЬ: Для некоторых только путем установки
<item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item>
сработало. Может быть, зависит от того, как вы реализуете решение работает. В моем случае это сработало, установив для них значение true.источник
<item name="android:windowIsTranslucent">false</item>
а также должен был установить,<item name="android:windowIsFloating">false</item>
прежде чем оно сработает.screenOrientation
атрибутаactivity
, и единственное, что вызывает сбойscreenOrientation
, устанавливается, когдаandroid:windowIsTranslucent
установлено значение true.В Android Oreo (API 26) вы не можете изменить ориентацию для действий, которые имеют стиль под строкой (-ами)
или
У вас есть несколько способов решения этой проблемы:
1) Вы можете просто удалить вышеуказанную строку (и) (или включить ее в false ), и ваше приложение работает нормально.
2) Или вы можете сначала удалить нижнюю строку из манифеста для этого действия
Затем вы должны добавить эту строку в вашу деятельность (в onCreate ())
3) Вы можете создать новое
styles.xml
вvalues-v26
папке и добавить это в свойstyle.xml
. (Благодаря комментарию AbdelHady )источник
android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
styles.xml
в ,values-v26
чтобы отключитьandroid:windowIsTranslucent
только для этого API.<bool name="allowWindowFullScreenTranslucent">true</bool>
и сослался на него в<item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>
. Затем в styles.xml в values-v26 установите его,false
а в values and values-v27 установите егоtrue
.В Android O и более поздних версиях эта ошибка возникает при установке
в манифесте.
Удалить эту строку и использовать
в вашей деятельности.
Это исправит вашу проблему.
источник
<item name="android:windowIsTranslucent">true</item>
из моего стиля, который наследует отTheme.AppCompat.Light.NoActionBar
работал для меня.Google выдает это исключение для
onCreate
метода Activity после v27, их значение таково: если Activity является полупрозрачной или плавающей, ее ориентация должна основываться на родительской (фоновой) Activity, она не может принимать решение сама.Даже если вы удаляете
android:screenOrientation="portrait"
из плавающего или полупрозрачного действия, но фиксируете ориентацию на родительском (фоновом) действии, это все равно фиксируется родителем, я уже тестировал.Одна особая ситуация: если вы сделаете полупрозрачным на панели запуска Activity, у него нет родителя (фон), поэтому всегда поворачивайте с устройством. Хотите исправить это, вы должны принять другой способ заменить
<item name="android:windowIsTranslucent">true</item>
стиль.источник
Если вы используете полноэкранное прозрачное действие, нет необходимости указывать блокировку ориентации в действии. Он примет настройки конфигурации родительского действия. Итак, если родительская активность имеет в манифесте:
ваша полупрозрачная активность будет иметь ту же блокировку ориентации: портрет.
источник
Я использовал
android:screenOrientation="behind"
вместоandroid:screenOrientation="portrait"
. По сути, вы создали диалоговое окно (в действии), и диалоговое окно не может запрашивать ориентацию само по себе, для этого требуется родительское действие (поскольку родительский элемент видим в фоновом режиме и имеет собственный макет).источник
Единственное решение, которое действительно работает:
Изменить:
чтобы:
в styles.xml
Но это может вызвать проблему с вашим заставкой (белый экран при запуске) ... В этом случае добавьте следующую строку в файл styles.xml:
чуть ниже окна находится полупрозрачная линия.
Последний шанс, если предыдущие советы не сработали: вместо SDK выберите 26.
источник
Если вам нужно использовать
setRequestedOrientation()
, нет никакого способа, кроме как пожертвовать атрибутом windowIsTranslucent на Android 8.0values\styles.xml
для уровня API 25- (<8,0)values-v26\styles.xml
для API уровня 26 (= 8,0)values-v27\styles.xml
для API уровня 27+ (> 8,0)источник
Многие люди дали исправление, поэтому я расскажу об источнике проблемы.
Согласно журналу исключений:
Код, который вызвал исключение в Activity.java
mActivityInfo.isFixedOrientation ():
Согласно приведенному выше анализу кода, когда TargetSdkVersion> = 27, при использовании SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT и других связанных атрибутов, использование атрибутов темы windowIsTranslucent, windowIsFloating и windowSwipeToDismiss вызовет исключение.
После обнаружения проблемы вы можете изменить TargetSdkVersion или удалить соответствующие атрибуты темы в соответствии с вашими потребностями.
источник
Я не могу согласиться с наиболее оцененным ответом, потому что
вызывает ошибку
но это делает это работает для меня
и использовать его для своей деятельности, когда вы выходите из
в AndroidManifest.xml
источник
Просто удалите эту линию
android:screenOrientation="portrait"
деятельности в Manifyt.xmlЭта деятельность получит ориентацию из своей предыдущей деятельности, поэтому нет необходимости применять ориентацию, которая имеет
<item name="android:windowIsTranslucent">true</item>
.источник
Похоже, когда целевой SDK является круговой (API-уровень 28.0), а windowIsTranslucent имеет значение true
<item name="android:windowIsTranslucent">true</item>
и вы пытаетесь получить доступ к ориентации. проблема идет с Android Oreo 8.0 (API-уровень 26) Есть два способа решить эту проблему
если вы устанавливаете ориентацию в манифесте, как это
или в классе деятельности, как это
удалить форму в обоих местах.
и наблюдаемый, когда вы устанавливаете windowIsTranslucent в true, он берет ориентацию из родительской активности.
источник
в файле манифеста установите второе действие parentActivityName в качестве первого действия и удалите параметр screenOrientation для второго действия. это означает, что ваше первое занятие является родителем, и вы решаете ориентироваться на ваше второе занятие.
источник
Просто установите ориентацию деятельности в Manifyt.xml
ИЛИ только для книжной ориентации
Вы также можете использовать в Activity, В
onCreate
вызове метода перед,super.onCreate(...)
например,источник
У меня была такая же проблема, и мое решение было устранить линию
а затем добавьте это в упражнение:
источник
После некоторого исследования кажется, что эта проблема может быть связана с ошибкой Google. Для меня я смог оставить эту строку в моем методе Actions onCreate:
И я изменил свой targetSdkVersion на 26. Наличие этой строки в моем onCreate по-прежнему приводило к сбою, в то время как мой targetSdkVersion все еще был установлен на 27. Так как до сих пор ни одно решение не работало для меня, я обнаружил, что это работает как временное исправление для сейчас.
источник
Это конфликт (ошибка) между темами внутри файла style.xml в версиях Android 7 (уровни API 24,25) и 8 (уровни API 26,27), когда у вас есть
android:screenOrientation="portrait"
: внутри определенной активности (которая вылетает) в AndroidManifest.xml&
в теме, которая применяется к этой деятельности внутри style.xml
Это может быть решено этими способами в соответствии с вашими потребностями:
1- Удалить из вышеупомянутых свойств, которые создают конфликт
2- Измените ориентацию «Активность» на одно из этих значений, как вам нужно:
unspecified
илиbehind
и так далее, которое можно найти здесь: Справочник Google для android: screenOrientation `3- Установите ориентацию программно во время выполнения
источник
Я недавно столкнулся с проблемой, и вот решение.
Нет необходимости изменять параметр ориентации экрана, который вы установили в файле манифеста Android.
Просто добавьте две папки в
Затем скопируйте туда свой файл styles.xml и themes.xml.
и измените следующие параметры с TRUE на FALSE.
Это сработает.
Распространенная ошибка Android 8.0
источник
Я столкнулся с этой проблемой только в SDK 26 (8.0.0) при использовании windowIsTranslucent 'true' и принудительной установки ориентации:
Вот решение:
источник
Я получаю эту ошибку, когда я пытаюсь захватить изображение или взять изображение из галереи, что мне нужно, чтобы удалить оба
и
Теперь моя деятельность использует эту тему:
источник
windowIsFloating
вызывает тот же сбой, что иwindowIsTranslucent
.только 8.0.0 выдает исключение, выше 8.0 имеет исключение
источник
appInfo.targetSdkVersion > O
бросить исключениеtarget
версии SDK. Неважно, какую версию SDK на самом деле использует устройство: вы компилируете под Android O (28), но не соблюдаете соглашения этой версии платформы.Единственная вещь, которая работала для меня, менялась
в
в манифесте для всех полупрозрачных действий.
Таким образом, он совместим со всеми версиями API, поскольку полупрозрачная активность, по-видимому, наследует свою ориентацию от родительской активности
targetApi: 28
.Стиль можно оставить как есть
<item name="android:windowIsTranslucent">true</item>
.источник
использование
И тема
источник
Я не знаю, является ли это ошибкой от Google или предполагаемым поведением, но я (по крайней мере, на мгновение) решил ее, изменив compileSdkVersion и targetSdkVersion обратно на 26 в Gradle ...
источник
Если вы не решили свою проблему, просто зарегистрируйте рекламную активность в манифесте следующим образом:
Вы также должны обновить до последней версии SDK.
источник
Вероятно, вы показываете Activity, похожую на Dialog (не полноэкранный режим ), поэтому удалите screenOrientation из Manifest или из кода. Это решит проблему.
источник
это произошло после 27, используйте targetSdkVersion 26 вместо, подождите, пока Google исправит это
источник
Я только что удалил теги "портрет" из не полноэкранных элементов, и все прошло нормально.
источник
Пожалуйста, проверьте стиль своей Деятельности и убедитесь, что если вы не используете какие-либо вещи, связанные с полупрозрачностью, измените стиль на альтернативный. Так что мы можем решить эту проблему.
источник
Я решил эту проблему, удалив
android:screenOrientation="portrait"
и добавив приведенный ниже код в мой onCreateв то время как мои свойства темы
источник