android - 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();
}
}
解决方案
推荐阅读
- php - 如何修复 PHP/Sendgrid/Heroku 中的 "401Array{"errors":[{"message":"Permission denied, wrong credentials","field":null,"help":null}]}" 错误?
- css - 在 Less 样式表中使用 Angular 组件名称与生成的 DOM 不匹配
- html - Angular 条件类被覆盖
- c# - 当在 lambda 表达式中使用三元条件运算符时,Linq select 返回错误的结果
- encryption - Openssl,RSA:为什么 private_decrypt 需要公钥?
- mysql - 如何在 laravel 中同时使用 whereBetween 和 like 运算符?
- unity3d - 无法在我的 c# 脚本中以 monodevelop unity 创建或声明 GameObject 变量
- excel - 根据关键字列表将行移动到另一个工作表
- python - 如果使用 groupby 方法满足另一列中的条件,则使用多列有条件地过滤
- c# - 调用 API 函数“文件/下载”时出错