【问题标题】:Not call onRequestPermissionsResult from fragment不从片段调用 onRequestPermissionsResult
【发布时间】:2019-07-07 09:33:47
【问题描述】:

在我的 android 项目中,我使用此代码来检查和请求运行时权限:

public class AgentsFragmentMapTab extends RootFragment implements  ActivityCompat.OnRequestPermissionsResultCallback 
{    
     //..
     private boolean checkAndRequestPermissions() {
            int internet = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.INTERNET);
            int loc = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION);
            int loc2 = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION);
            List<String> listPermissionsNeeded = new ArrayList<>();
            if (internet != PackageManager.PERMISSION_GRANTED) {
                listPermissionsNeeded.add(Manifest.permission.INTERNET);
            }
            if (loc != PackageManager.PERMISSION_GRANTED) {
                listPermissionsNeeded.add(Manifest.permission.ACCESS_COARSE_LOCATION);
            }
            if (loc2 != PackageManager.PERMISSION_GRANTED) {
                listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
            }
            if (BuildConfig.DEBUG)
                Log.d(TAG, "checkAndRequestPermissions_listPermissionsNeeded(" + listPermissionsNeeded.size() + ")");
            if (!listPermissionsNeeded.isEmpty()) {
                ActivityCompat.requestPermissions(getActivity(), listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), LOCATION_REQ_CODE);
                return false;
            }
            return true;
        }

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

            if (requestCode == LOCATION_REQ_CODE) {

                } else {

                }
            }
        }

这段代码完美地显示了权限对话框。但是当我点击 Allow 或 Deny 按钮时,onRequestPermissionsResult() 方法不会被调用。为什么它没有被调用以及如何实现这一点?

【问题讨论】:

  • 覆盖父activity中的onRequestPermissionsResult方法,然后将结果推送到这个fragment。
  • 但我需要处理片段中的单击按钮允许
  • 我强烈建议你使用 dexter 权限库
  • ActivityCompat.requestPermissions 仅将结果发送到 Activity,因为它不知道您的 Fragment。你为什么不在Fragment 本身上使用requestPermissions?

标签: java android fragment android-permissions


【解决方案1】:

首先,在父活动中执行此操作。

...
Fragment theFragment = 
     getSupportFragmentManager().findFragmentById(R.id.your_fragment_name);
...         

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case LOCATION_REQ_CODE: {
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                if(theFragment instanceof AgentsFragmentMapTab) 
                    ((AgentsFragmentMapTab)theFragment).passPermissionResult(true);

            } else {
                if(theFragment instanceof AgentsFragmentMapTab) 
                    ((AgentsFragmentMapTab)theFragment).passPermissionResult(false);
            }
            return;
        }
    }
}

然后在你的片段中,像这样添加一个公共方法:

public void passPermissionResult(boolean allowed) {
    if(allowed) {
        // ALLOW clicked
    }
    else {
        // DENY clicked
    }
}

【讨论】:

  • 这不是必需的。在 Fragment 中调用 requestPermissions() 会自动为您将结果发送到 Fragment。
  • 哦,我明白了。谢谢指正!我今天学到了一些新东西。
【解决方案2】:

改变

 ActivityCompat.requestPermissions(getActivity(), listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), LOCATION_REQ_CODE);

到:

requestPermissions(listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_CODE);

还有ContextCompat 到ActivityCompat 和getActivity() 到getContext() 喜欢:

int loc2 = ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION, LOCATION_REQ_CODE);

【讨论】:

    【解决方案3】:

    如 cmets 在父活动中覆盖 onRequestPermissionsResult 中所述

    请务必从该活动的onRequestPermissionsResult 拨打super.onRequestPermissionsResult

    然后它将发送到覆盖onRequestPermissionsResult的片段

    编辑:

    这就是我所做的

    我打电话给requestPermissions(StringOfPermissions,YourRequestCode);

    片段内部

    这是我用来在活动中添加片段的代码,非常简单

    getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.container, BlankFragment.newInstance("",""))
                .disallowAddToBackStack()
                .commit();
    

    我重写了 onRequestPermissionsResult():

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

    在activity和fragment里面

    当我从片段请求时,它进入了活动,然后它进入了片段

    【讨论】:

    • 只在activity中调用,在fragment中不调用
    • 即使在活动中super.onRequestPermissionsResult(requestCode, permissions, grantResults); 之后?
    • 是的。在我的活动中: public void onRequestPermissionsResult(int requestCode, String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); }。但不调用片段
    • 我已经在测试后编辑了答案,您现在可以查看吗? @Alexei
    • 没有帮助。结果相同。不调用片段
    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 2017-10-15
    • 2017-09-22
    • 2017-10-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多