Estou enfrentando o problema ao recuperar os contatos do catálogo de contatos no Android 8.0 Oreo java.lang.IllegalStateException: Somente atividades opacas de tela cheia podem solicitar orientação
Estou tentando obter o contato da minha atividade na lista de contatos telefônicos e funciona perfeitamente para pirulito, marshmallow, nougat, etc. Meu código está aqui abaixo.
Código Demo: -
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");
}
}
Log de erro: -
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
fonte
fonte
Respostas:
O problema parece estar acontecendo quando seu sdk de destino é 28. Então, depois de experimentar muitas opções, finalmente funcionou.
estilo:-
Nota: parent = "Theme.AppCompat.Light.NoActionBar" é necessário para a API 28. Anteriormente, havia outra coisa na API 26. Estava funcionando muito bem, mas começou a dar problemas aos 28. Espero que ajude alguém aqui. EDIT: Para alguns, apenas configurando o trabalho.
<item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item>
Pode depender da maneira como você implementa a solução. No meu caso, funcionou definindo-os como true.fonte
<item name="android:windowIsTranslucent">false</item>
e também<item name="android:windowIsFloating">false</item>
antes de dar certo.screenOrientation
atributo naactivity
tag, e a única coisa que causa a falha estáscreenOrientation
sendo configurada enquantoandroid:windowIsTranslucent
configurada como true.No Android Oreo (API 26), você não pode alterar a orientação da Atividade que possui linhas abaixo do estilo
ou
Você tem várias maneiras de resolver isso:
1) Você pode simplesmente remover as linhas acima (ou transformá-lo em falso ) e seu aplicativo funciona bem.
2) Ou você pode primeiro remover a linha abaixo do manifesto para essa atividade
Então você deve adicionar esta linha à sua atividade (em onCreate ())
3) Você pode criar um novo
styles.xml
navalues-v26
pasta e adicioná-lo ao seustyle.xml
. (Obrigado ao comentário de AbdelHady )fonte
android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
styles.xml
emvalues-v26
Para desativarandroid:windowIsTranslucent
apenas que API.<bool name="allowWindowFullScreenTranslucent">true</bool>
e me referi a ela em<item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>
. Em styles.xml, em values-v26, configure-o comofalse
e em values and values-v27, configure-o comotrue
.No Android O e posterior, esse erro ocorre quando você define
no manifesto.
Remova essa linha e use
em sua atividade.
Isso resolverá o seu problema.
fonte
<item name="android:windowIsTranslucent">true</item>
do meu estilo que herda deTheme.AppCompat.Light.NoActionBar
trabalhou para mim.O Google lança essa exceção no
onCreate
método Activity após a v27, o significado é: se uma Activity é translúcida ou flutuante, sua orientação deve ser baseada na Atividade pai (em segundo plano), não pode tomar uma decisão.Mesmo se você remover
android:screenOrientation="portrait"
da Atividade flutuante ou translúcida, mas fixar a orientação na Atividade pai (em segundo plano), ela ainda será corrigida pelo pai, eu já testei.Uma situação especial: se você tornar translúcido em uma Atividade do iniciador, ela não tem pai (plano de fundo); portanto, sempre gire com o dispositivo. Deseja corrigi-lo, você precisa seguir outra maneira de substituir o
<item name="android:windowIsTranslucent">true</item>
estilo.fonte
Se você usar uma atividade transparente em tela cheia, não será necessário especificar o bloqueio de orientação na atividade. Serão necessárias as definições de configuração da atividade pai. Portanto, se a atividade pai tiver no manifesto:
sua atividade translúcida terá o mesmo bloqueio de orientação: retrato.
fonte
Eu usei em
android:screenOrientation="behind"
vez deandroid:screenOrientation="portrait"
. Basicamente, você criou um diálogo (em uma atividade) e o diálogo não pode solicitar orientação por si só; ele precisa da atividade pai para fazer isso (porque um pai é visível em segundo plano e possui layout próprio).fonte
A única solução que realmente funciona:
Mudança:
para:
em styles.xml
Mas isso pode induzir um problema na tela inicial (tela branca na inicialização) ... Nesse caso, adicione a seguinte linha ao seu styles.xml:
logo abaixo da linha windowIsTranslucent.
Última chance, se as dicas anteriores não funcionarem: segmente o SDK 26 em vez de 27.
fonte
Se você precisar usar
setRequestedOrientation()
, não há como sacrificar o atributo windowIsTranslucent no Android 8.0values\styles.xml
para API nível 25- (<8,0)values-v26\styles.xml
para API nível 26 (= 8,0)values-v27\styles.xml
para api nível 27+ (> 8.0)fonte
Muitas pessoas deram uma correção, então eu vou falar sobre a fonte do problema.
De acordo com o log de exceção:
O código que acionou a exceção no Activity.java
mActivityInfo.isFixedOrientation ():
De acordo com a análise de código acima, quando TargetSdkVersion> = 27, ao usar SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT e outros atributos relacionados, o uso dos atributos de tópico windowIsTranslucent, windowIsFloating e windowSwipeToDismiss acionará uma exceção.
Depois que o problema for encontrado, você poderá alterar a TargetSdkVersion ou remover os atributos relacionados do tema de acordo com suas necessidades.
fonte
Não posso concordar com a resposta mais classificada, porque
causa um erro
mas isso faz funcionar para mim
e use-o para sua Atividade, quando você se estende de
no AndroidManifest.xml
fonte
Basta remover esta linha
android:screenOrientation="portrait"
de atividade no Manifiest.xmlEssa atividade receberá orientação de sua atividade anterior, portanto, não é necessário aplicar a orientação necessária
<item name="android:windowIsTranslucent">true</item>
.fonte
parece que o destino sdk é torta (api nível 28.0) e windowIsTranslucent é true
<item name="android:windowIsTranslucent">true</item>
e você tenta acessar a orientação. problema vem com o Android oreo 8.0 (api nível 26), existem duas maneiras de resolver isso
se você estiver definindo uma orientação em manifesto como este
ou em classe de atividade como esta
remova o formulário dos dois lugares.
e observado quando você define windowIsTranslucent como true, ele recebe orientação da atividade pai.
fonte
no arquivo de manifesto, defina a segunda atividade parentActivityName como primeira atividade e remova o parâmetro screenOrientation para a segunda atividade. isso significa que sua primeira atividade é a mãe e decide uma orientação para sua segunda atividade.
fonte
Basta definir a orientação da atividade no Manifiest.xml
OU para restrito à orientação retrato
Você também pode usar a
onCreate
chamada de método Activity, In antes,super.onCreate(...)
por exemplo,fonte
Eu tive o mesmo problema e minha solução foi eliminar a linha
e adicione isso na atividade:
fonte
Depois de fazer algumas pesquisas, parece que esse problema pode ser devido a um bug do google. Para mim, consegui deixar essa linha no meu método Activities onCreate:
E mudei minha targetSdkVersion para 26. Tendo essa linha no meu onCreate ainda resultou em uma falha enquanto minha targetSdkVersion ainda estava definida em 27. Como a solução de ninguém mais funcionou para mim até agora, achei que isso funcionava como uma correção temporária para agora.
fonte
É um conflito (bug) entre os Temas dentro do arquivo style.xml nas versões Android 7 (níveis de API 24,25) e 8 (níveis de API 26,27), quando você tiver
android:screenOrientation="portrait"
: dentro da atividade específica (que trava) no AndroidManifest.xml&
no tema aplicado a essa atividade em style.xml
Pode ser resolvido por estas maneiras de acordo com sua necessidade:
1- Remova as propriedades acima mencionadas que causam conflito
2- Altere a orientação da atividade para um desses valores conforme necessário:
unspecified
oubehind
assim por diante, que pode ser encontrado aqui: Referência do Google para android: screenOrientation `3- Defina a orientação programaticamente em tempo de execução
fonte
Recentemente, enfrentei o problema e aqui está a solução.
Não é necessário alterar o parâmetro de orientação da tela definido no arquivo de manifesto do Android.
Basta adicionar duas pastas no
Em seguida, copie seu arquivo styles.xml e themes.xml para lá.
e altere os seguintes parâmetros de TRUE para FALSE.
Vai funcionar.
Um erro comum do Android 8.0
fonte
Eu enfrentei esse problema apenas no SDK 26 (8.0.0) se estiver usando windowIsTranslucent 'true' e forçando a orientação com força:
Aqui está a solução:
fonte
Eu estava recebendo esse erro ao tentar capturar uma imagem ou tirar uma foto da galeria. O que funciona para mim é remover os dois
e
agora minha atividade está usando este tema:
fonte
windowIsFloating
causa a mesma falha quewindowIsTranslucent
.somente 8.0.0 lança a exceção, acima de 8.0 removeu a exceção
fonte
appInfo.targetSdkVersion > O
lançar a exceçãotarget
versão sdk. Não importa qual versão do sdk o dispositivo está realmente executando, você está compilando com o Android O (28), mas não segue as convenções dessa versão da plataforma.A única coisa que funcionou para mim foi mudar
para
no manifesto para todas as atividades translúcidas.
Dessa forma, é compatível com todas as versões da API, pois a atividade translúcida parece herdar sua orientação da atividade pai a partir de
targetApi: 28
.O estilo pode ser deixado como está incluindo
<item name="android:windowIsTranslucent">true</item>
.fonte
Usar
E Tema
fonte
Eu não sei se isso é um bug do Google ou um comportamento pretendido, mas eu (pelo menos momentaneamente) o resolvi alterando compileSdkVersion e targetSdkVersion de volta para 26 em Gradle ...
fonte
Se você não resolveu o problema, registre a atividade do anúncio no manifesto da seguinte maneira:
Você também precisa atualizar para a versão mais recente do sdk.
fonte
Provavelmente, você está mostrando Activity como Diálogo (não em tela cheia), então remova screenOrientation do Manifest ou do código. Isso resolverá o problema.
fonte
isso aconteceu depois de 27, use targetSdkVersion 26 replace, aguarde o google corrigi-lo
fonte
Acabei de remover as tags "retrato" dos elementos que não são de tela cheia e tudo correu bem.
fonte
Verifique o estilo da sua atividade e verifique se, se você não estiver usando nada relacionado ao Translúcido, altere o estilo para alternar. Para que possamos resolver esse problema.
fonte
Resolvi esse problema removendo
android:screenOrientation="portrait"
e adicionando o código abaixo ao meu onCreateenquanto minhas propriedades do tema são
fonte