Saya menghadapi masalah saat mengambil kontak dari buku kontak di Android 8.0 Oreo java.lang.IllegalStateException: Hanya aktivitas buram layar penuh yang dapat meminta orientasi
Saya mencoba mendapatkan kontak dalam aktivitas saya dari buku kontak telepon dan berfungsi sempurna untuk Lollipop, Marshmallow, Nougat, dll. Tetapi itu akan memberi saya kesalahan untuk Oreo seperti ini tolong bantu saya. Kode saya ada di sini di bawah ini.
Kode 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");
}
}
Catatan eror:-
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
sumber
sumber
Jawaban:
Masalahnya tampaknya terjadi ketika target sdk Anda adalah 28. Jadi setelah mencoba banyak opsi akhirnya ini berhasil.
gaya:-
Catatan: parent = "Theme.AppCompat.Light.NoActionBar" diperlukan untuk api 28. Sebelumnya memiliki sesuatu yang lain di api 26. Bekerja dengan baik tetapi mulai memberi masalah pada 28. Semoga ini membantu seseorang di sini. EDIT: Untuk beberapa hanya dengan menetapkan bekerja.
<item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item>
Mungkin tergantung pada cara Anda menerapkan solusi bekerja. Dalam kasus saya itu bekerja dengan mengaturnya menjadi benar.sumber
<item name="android:windowIsTranslucent">false</item>
dan juga harus mengatur<item name="android:windowIsFloating">false</item>
sebelum itu akan berhasil.screenOrientation
atribut dalamactivity
tag, dan satu-satunya hal yang menyebabkan kerusakanscreenOrientation
diatur saatandroid:windowIsTranslucent
disetel ke true.Di android Oreo (API 26) Anda tidak dapat mengubah orientasi untuk Aktivitas yang memiliki gaya di bawah garis
atau
Anda memiliki beberapa cara untuk menyelesaikan ini:
1) Anda cukup menghapus baris di atas (atau mengubahnya menjadi false ) dan aplikasi Anda berfungsi dengan baik.
2) Atau Anda dapat terlebih dahulu menghapus baris di bawah ini dari manifes untuk aktivitas itu
Maka Anda harus menambahkan baris ini ke aktivitas Anda (di onCreate ())
3) Anda dapat membuat baru
styles.xml
divalues-v26
folder dan menambahkan ini ke Andastyle.xml
. (Terima kasih atas komentar AbdelHady )sumber
android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
styles.xml
in baruvalues-v26
untuk menonaktifkanandroid:windowIsTranslucent
API saja.<bool name="allowWindowFullScreenTranslucent">true</bool>
dan merujuknya pada<item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>
. Kemudian di styles.xml di bawah nilai-v26 atur kefalse
dan dalam nilai-nilai dan nilai-v27 atur ketrue
.Di Android O dan kemudian kesalahan ini terjadi ketika Anda mengatur
dalam Manifest.
Hapus garis itu dan gunakan
dalam aktivitas Anda.
Ini akan memperbaiki masalah Anda.
sumber
<item name="android:windowIsTranslucent">true</item>
dari gaya saya yang mewarisi dariTheme.AppCompat.Light.NoActionBar
bekerja untuk saya.Google melempar pengecualian ini pada
onCreate
metode Activity setelah v27, artinya adalah: jika suatu Aktivitas tembus atau mengambang, orientasinya harus bergantung pada Aktivitas induk (latar belakang), tidak dapat membuat keputusan sendiri.Bahkan jika Anda menghapus
android:screenOrientation="portrait"
dari Kegiatan mengambang atau tembus tetapi memperbaiki orientasi pada aktivitas induknya (latar belakang), itu masih diperbaiki oleh induknya, saya sudah menguji.Satu situasi khusus: jika Anda membuat tembus pada Kegiatan peluncur, itu bukan induk (latar belakang), jadi selalu putar dengan perangkat. Ingin memperbaikinya, Anda harus mengambil cara lain untuk mengganti
<item name="android:windowIsTranslucent">true</item>
gaya.sumber
Jika Anda menggunakan aktivitas transparan layar penuh, tidak perlu menentukan kunci orientasi pada aktivitas. Ini akan mengambil pengaturan konfigurasi aktivitas induk. Jadi jika aktivitas induk ada di manifes:
aktivitas tembus cahaya Anda akan memiliki kunci orientasi yang sama: potret.
sumber
Saya menggunakan
android:screenOrientation="behind"
bukanandroid:screenOrientation="portrait"
. Pada dasarnya, Anda membuat dialog (dalam suatu aktivitas) dan dialog tidak dapat meminta orientasi dengan sendirinya. Diperlukan aktivitas induk untuk melakukan ini (karena orangtua terlihat di latar belakang dan memiliki tata letak sendiri).sumber
Satu-satunya solusi yang benar-benar berfungsi:
Perubahan:
untuk:
di styles.xml
Tapi ini mungkin menyebabkan masalah dengan splashscreen Anda (layar putih saat startup) ... Dalam hal ini, tambahkan baris berikut ke styles.xml Anda:
tepat di bawah garis windowIsTranslucent.
Kesempatan terakhir jika tips sebelumnya tidak berhasil: target SDK 26 bukannya o 27.
sumber
Jika Anda harus menggunakan
setRequestedOrientation()
, tidak ada cara lain selain mengorbankan atribut windowIsTranslucent di Android 8.0values\styles.xml
untuk api level 25- (<8.0)values-v26\styles.xml
untuk api level 26 (= 8.0)values-v27\styles.xml
untuk api level 27+ (> 8.0)sumber
Banyak orang telah memberikan perbaikan, jadi saya akan berbicara tentang sumber masalahnya.
Menurut log pengecualian :
Kode yang memicu pengecualian di Activity.java
mActivityInfo.isFixedOrientation () :
Menurut analisis kode di atas, ketika TargetSdkVersion> = 27, ketika menggunakan SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT, dan atribut terkait lainnya, penggunaan windowIsTranslucent, windowIsFloating, dan windowSwipeToDismiss atribut akan memicu pengecualian.
Setelah masalah ditemukan, Anda dapat mengubah TargetSdkVersion atau menghapus atribut terkait tema sesuai dengan kebutuhan Anda.
sumber
Saya tidak bisa menyetujui jawaban yang dinilai paling tinggi, karena
menyebabkan kesalahan
tetapi ini membuatnya bekerja untuk saya
dan gunakan untuk Aktivitas Anda, saat Anda memanjang dari
di AndroidManifest.xml
sumber
Hapus saja baris
android:screenOrientation="portrait"
aktivitas ini di Manifiest.xmlAktivitas itu akan mendapatkan orientasi dari aktivitas sebelumnya sehingga tidak perlu menerapkan orientasi yang dimiliki
<item name="android:windowIsTranslucent">true</item>
.sumber
sepertinya target sdk adalah pie (api level 28.0) dan windowIsTranslucent benar
<item name="android:windowIsTranslucent">true</item>
dan Anda mencoba mengakses orientasi. masalah datang dengan android oreo 8.0 (api level 26) ada dua cara untuk menyelesaikan ini
jika Anda menetapkan orientasi dalam manifes seperti ini
atau di kelas aktivitas seperti ini
hapus formulir kedua tempat.
dan diamati ketika Anda mengatur windowIsTranslucent ke true, dibutuhkan orientasi dari aktivitas induk.
sumber
dalam file manifes atur aktivitas kedua parentActivityName sebagai aktivitas pertama dan hapus parameter screenOrientation ke aktivitas kedua. itu berarti aktivitas pertama Anda adalah orang tua dan memutuskan untuk orientasi aktivitas kedua Anda.
sumber
Cukup Tetapkan Orientasi aktivitas di Manifiest.xml
ATAU untuk terbatas pada Orientasi Potret
Anda juga dapat menggunakan dalam Activity, In
onCreate
method call sebelumsuper.onCreate(...)
egsumber
Saya memiliki masalah yang sama, dan solusi saya adalah menghilangkan garis
dan kemudian tambahkan ini di aktivitas:
sumber
Setelah melakukan riset, tampaknya masalah ini mungkin disebabkan oleh bug google. Bagi saya, saya dapat meninggalkan baris ini dalam metode onCreate Aktivitas saya:
DAN saya mengubah targetSdkVersion saya menjadi 26. Memiliki garis di onCreate saya masih menghasilkan crash sementara targetSdkVersion saya masih ditetapkan pada 27. Karena sejauh ini tidak ada solusi orang lain yang bekerja untuk saya, saya menemukan bahwa ini berfungsi sebagai perbaikan sementara untuk sekarang.
sumber
Ini adalah konflik (bug) antara Tema di dalam file style.xml dalam versi android 7 (tingkat Api 24,25) & 8 (tingkat api 26,27), saat Anda memiliki
android:screenOrientation="portrait"
: di dalam aktivitas spesifik (yang macet) di AndroidManifest.xml&
dalam tema yang diterapkan pada aktivitas di dalam style.xml
Ini dapat diselesaikan dengan cara-cara ini sesuai dengan kebutuhan Anda:
1- Hapus properti yang disebutkan di atas yang membuat konflik
2- Ubah orientasi Aktivitas ke salah satu dari nilai-nilai ini sesuai kebutuhan Anda:
unspecified
ataubehind
dan sebagainya yang dapat ditemukan di sini: Referensi Google untuk android: screenOrientation `3- Atur orientasi secara terprogram dalam waktu berjalan
sumber
Saya baru-baru ini menghadapi masalah dan inilah solusinya.
Tidak perlu mengubah parameter orientasi layar yang Anda atur di file manifes android.
Cukup tambahkan dua folder
Kemudian salin file styles.xml dan themes.xml Anda di sana.
dan ubah parameter berikut dari BENAR ke SALAH.
Itu akan berhasil.
Bug umum Android 8.0
sumber
Saya menghadapi masalah ini hanya di SDK 26 (8.0.0) jika menggunakan windowIsTranslucent 'true' dan secara paksa mengatur orientasi:
Inilah solusinya:
sumber
Saya mendapatkan kesalahan ini ketika saya mencoba mengambil gambar atau mengambil gambar dari galeri yang berfungsi untuk saya adalah menghapus keduanya
dan
sekarang aktivitas saya menggunakan tema ini:
sumber
windowIsFloating
menyebabkan crash yang sama denganwindowIsTranslucent
.hanya 8.0.0 melempar pengecualian, di atas 8.0 telah menghapus pengecualian
sumber
appInfo.targetSdkVersion > O
lempar pengecualiantarget
versi SDK. Tidak masalah apa versi SDK perangkat sebenarnya berjalan, Anda mengkompilasi melawan Android O (28) tetapi tidak mengikuti konvensi versi platform itu.Satu-satunya hal yang berhasil bagi saya adalah berubah
untuk
dalam manifes untuk semua kegiatan yang transparan.
Dengan cara itu kompatibel dengan semua versi API karena aktivitas tembus tampaknya mewarisi orientasinya dari aktivitas induk pada
targetApi: 28
.Gaya dapat dibiarkan apa adanya
<item name="android:windowIsTranslucent">true</item>
.sumber
Menggunakan
Dan Tema
sumber
Saya tidak tahu apakah ini bug dari Google atau perilaku yang dimaksudkan tetapi saya (setidaknya untuk sementara waktu) menyelesaikannya dengan mengubah compileSdkVersion dan targetSdkVersion kembali ke 26 di Gradle ...
sumber
Jika Anda belum menyelesaikan masalah Anda, cukup daftarkan aktivitas iklan di manifes seperti ini:
Anda juga perlu memperbarui ke versi SDK terbaru.
sumber
Mungkin Anda menampilkan Aktivitas yang tampak seperti Dialog (non-layar penuh), jadi hapus screenOrientation dari Manifest atau dari kode. Ini akan memperbaiki masalah.
sumber
ini terjadi setelah 27, gunakan targetSdkVersion 26 ganti, tunggu google memperbaikinya
sumber
Saya baru saja menghapus tag "potret" dari elemen non-layar penuh dan semuanya berjalan dengan baik.
sumber
Silakan periksa gaya Kegiatan Anda dan pastikan jika Anda tidak menggunakan hal-hal yang berhubungan dengan Translucent, ubah gaya untuk berganti. Sehingga kami dapat memperbaiki masalah ini.
sumber
Saya mengatasi masalah ini dengan menghapus
android:screenOrientation="portrait"
dan menambahkan kode di bawah ini ke dalam onCreate sayasementara sifat tema saya
sumber