首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在获得许可后启动片段

在获得许可后启动片段
EN

Stack Overflow用户
提问于 2018-04-27 17:01:41
回答 2查看 1.1K关注 0票数 1

只有当用户授予存储权限时,我才希望从活动中启动片段。我的主要活动布局如下

代码语言:javascript
复制
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/root_container"
android:fitsSystemWindows="true"
android:background="@drawable/splash_gradient">
</FrameLayout>

现在,这个布局将在主活动开始时显示。我设置了代码以获得存储许可。并且希望用我的片段布局来替换这个布局,但是只有在当前授予存储权限之后,它才能正常工作,我的片段正在加载,除了我的片段在授予权限之前启动之外。是否有任何方法在权限函数上设置回调方法,并仅在权限被授予时启动该片段?

我的onCreate方法看起来就像

代码语言:javascript
复制
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.root_container);
    boolean b = getPermission();
    if(b ==true){
        HomeFragment fragment = new HomeFragment();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.root_container, fragment).commit();
    }
    else getPermission();
}

我的get权限方法如下所示

代码语言:javascript
复制
    public boolean getPermission() {
    boolean f = false;
    //Check for SDK Version if greater than 23 then seek user permission
    if(Build.VERSION.SDK_INT>=23) {
        //Check whether permission is already granted
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
           // Ask for user permission
                ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 404);
            if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                    !=PackageManager.PERMISSION_DENIED)
                f = true;
        }
        else f = true;
    }
    return f;
}

当我授予权限时,getPermission返回true,但是当应用程序第一次运行时,它甚至在获得getPermission()方法的结果之前就启动了片段,并且当我第二次运行应用程序时,它会显示片段布局。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-27 18:08:39

您应该使用onRequestPermissionsResult来处理结果:

代码语言:javascript
复制
private static final int REQUEST_CODE = 404;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    // Your code

    if (savedInstanceState == null) {
        tryToOpenHomeFragment();
    }
}

private void tryToOpenHomeFragment() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
        showHomeFragment();
    } else {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CODE) {
        if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            showHomeFragment();
        } else {
            // Permission was not granted
        }
    }
}

private void showHomeFragment() {
    HomeFragment fragment = new HomeFragment();
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.root_container, fragment)
            .commit();
}
票数 2
EN

Stack Overflow用户

发布于 2018-04-27 18:12:21

您需要做的是:当许可被授予时,打开。

代码语言:javascript
复制
@Override
public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {
switch (requestCode) {
    case READ_EXTERNAL_STORAGE: {
        // If request is cancelled, the result arrays are empty.
        if (grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // permission was granted
            HomeFragment fragment = new HomeFragment();
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.root_container, fragment).commit();
        } else {

            // permission denied, boo! Disable the
            // functionality that depends on this permission.

        }
        return;
    }
}

按照https://developer.android.com/training/permissions/requesting上的示例,检查权限是否被授予。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50067149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档