当前位置: 首页 > 知识库问答 >
问题:

java.lang.IllegalStateException:只有全屏不透明的活动才能请求方向

赖淇
2023-03-14

我在Android 8.0 Oreo Java . lang . illegalstateexception中从通讯录中检索联系人时遇到了这个问题:只有全屏不透明的活动才能请求定向

我正在尝试从电话通讯录中获取我活动中的联系人,它非常适合Lollipop、Marshmallow、牛轧糖等,但它会给我奥利奥这样的错误,请帮帮我。我的代码在下面。

演示代码:-

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

共有3个答案

窦彦君
2023-03-14

Google在v27之后在Activity的< code>onCreate方法上抛出了这个异常,他们的意思是:如果一个Activity是半透明的或者浮动的,那么它的方向应该依赖于父(后台)Activity,不能自己做决定。

即使您从浮动或半透明活动中删除< code > Android:screen orientation = " portrait " ,但固定其父(背景)活动的方向,它仍然由父活动固定,我已经测试过了。

一种特殊情况是:如果在启动器活动中使其半透明,则它没有父级(背景),因此始终随设备旋转。要修复它,您必须采用另一种方法来替换

武骁
2023-03-14

在Android O和更高版本中,当您设置时会发生此错误

 android:screenOrientation="portrait"

在舱单中。

拆下那根线并使用它

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

在你的活动中。

这将解决您的问题。

甘永春
2023-03-14

在android Oreo(API 26)中,您无法更改样式下线的活动方向

 <item name="android:windowIsTranslucent">true</item>

 <item name="android:windowIsFloating">true</item>

您有几种方法可以解决此问题:

1)您只需删除上面的行(或将其转换为假),您的应用程序就可以正常工作。

2)或者您可以首先从该活动的清单中删除以下行

android:screenOrientation="portrait"

然后您必须将此行添加到您的活动中(在onCreate()中)

'

    //android O fix bug orientation
    if (android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

3)您可以在< code>values-v26文件夹中创建新的< code>styles.xml,并将其添加到您的< code>style.xml文件夹中。(感谢AbdelHady评论)

 <item name="android:windowIsTranslucent">false</item>
 <item name="android:windowIsFloating">false</item>
 类似资料:
  • 脸书 SDK 版本 4.27.0 Android操作系统版本8.0 应用程序崩溃,但有例外,这是我在Crashlytics上找到的跟踪日志: 任何人都可以帮我这个吗? PS:在Android Source中,在查看了这条线号987之后,似乎这条线就是罪魁祸首。 https://Android . Google source . com/platform/frameworks/base . git/

  • 我有一个活动,当设备处于横向时从浏览器打开,让我低于错误 只有全屏不透明的活动才能请求方向 显示 style.xml

  • 问题内容: 从Android 8.0 Oreo java.lang.IllegalStateException中的通讯录中检索联系人时,我遇到了问题:仅全屏不透明活动可以请求定向 我正在尝试从电话通讯录中获取活动中的联系信息,它非常适合棒棒糖,棉花糖,牛轧糖等,但对于奥利奥这样的错误会给我带来这种错误,请帮助我。我的代码在这里。 演示代码:- 错误日志: 问题答案: 当目标sdk为28时,问题似乎

  • 在我的应用程序中,我将“compileSdkVersion”从25更改为27。我在android 8.0中发现了以下问题: 我找到了一个解决方案,可以将以下方法添加到活动中: 但是我在上面的错误日志中找不到相应的活动。有人遇到过这个问题吗?请帮帮我。

  • 如何用背景图像显示完整的启动屏幕 下面的splash活动有完整的图像,将来可能会更改,现在我使用iugaad来显示状态栏背景,但每当我更改图像状态栏背景时,都应该显示该图像。 启动画面

  • 我有一个活动,设置为,设置为半透明背景。我刚刚更改了我的目标并编译sdk版本到27,现在启动此活动时遇到异常: 由于这是一个新的sdk,目前还没有任何在线信息(它似乎来自以下代码行:https://android.googlesource.com/platform/frameworks/base.git//master/core/java/android/app/Activity。java#987