首页 > 解决方案 > Android 在横向上的 requestPermissions 但在旋转到横向之前以纵向显示的对话框

问题描述

我的应用程序按预期从横向开始,我想通过 requestPermissions() 请求许可。

但是,权限对话框首先以纵向显示,然后将其自身旋转为横向,这是我不喜欢的行为。我希望权限对话框从一开始就以横向开始。

我尝试在 onViewCreated 和 onResume 中添加 requestPermissions() 但仍然是相同的行为。

我将权限相关代码移动到 PermissionsFragment 并在成功获得所有权限后使用回调。

即使在没有 PermissionsFragment 的情况下完成这一切并在 MainActivity 中完成也会导致相同的行为。我什至尝试在 onPostResume 中添加权限代码无济于事。

无论如何强制权限对话框立即以横向模式显示?

主要活动:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        PermissionsFragment firstFragment = new PermissionsFragment();
        getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).commit();
    }

    @Override
    public void onAttachFragment(Fragment fragment) {
        if (fragment instanceof PermissionsFragment) {
            ((PermissionsFragment) fragment).setOnPermissionsAcquiredListener(() -> {
                MainFragment mainFragment = new MainFragment();
                transaction.replace(R.id.fragment_container, mainFragment, "MainFragment").commit();
            });
        }
    }

}

权限片段:

public class PermissionsFragment extends Fragment {
    private PermissionsAcquiredListener callback;

    private static final int PERMISSIONS_REQUEST_CODE = 10;
    private static final String[] PERMISSIONS_REQUIRED = {
            permission.CAMERA,
            permission.READ_EXTERNAL_STORAGE,
            permission.WRITE_EXTERNAL_STORAGE,
            permission.INTERNET,
    };

    public void setOnPermissionsAcquiredListener(PermissionsAcquiredListener callback) {
        this.callback = callback;
    }

    private boolean hasPermissions() {
        // check for permission
    }

    @Override
    public void onResume() {
        super.onResume();
        LOGGER.d("[PERM] onResume");

        if (!hasPermissions()) {
            requestPermissions(PERMISSIONS_REQUIRED, PERMISSIONS_REQUEST_CODE);
        } else {
            callback.onPermissionsAcquired();
        }
    }

    @Override
    public void onRequestPermissionsResult(
            int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // some codes checking

        // if all permissions are okay
        callback.onPermissionsAcquired();
    }

    // callback when permissions successfully acquired
    public interface PermissionsAcquiredListener {
        void onPermissionsAcquired();
    }
}

[编辑]

目前我在检查权限之前添加了延迟。不过,这只是一个临时解决方案。

    private Runnable task = () -> requestPermissions(PERMISSIONS_REQUIRED, PERMISSIONS_REQUEST_CODE);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (!hasPermissions()) {
            Handler handler = new Handler();
            handler.postDelayed(task, 500);

        } else {
            callback.onPermissionsAcquired();
        }
    }

标签: androidpermissions

解决方案


推荐阅读