代码之家  ›  专栏  ›  技术社区  ›  BekaKK

放入片段时,运行时权限不起作用

  •  0
  • BekaKK  · 技术社区  · 7 年前

    我正在尝试使用 runtime permission a的内部 fragment .

    以下是我的自定义权限的类代码:

    public class MyPermissions {
        private String[] permissions = null;
        private Context context;
        private int permCode;
        private EventHandler handler = null;
        public MyPermissions(Context context, int permCode, String[] permissions) {
    
            this.context = context;
            this.permCode = permCode;
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
                return;
            }
    
            List<String> perms = new ArrayList<>();
    
            if (permissions != null) {
                for (String perm : permissions) {
                    if (ContextCompat.checkSelfPermission(context, perm) != PackageManager.PERMISSION_GRANTED) {
                        perms.add(perm);
                    }
                }
            }
            if (perms.size() > 0) {
                this.permissions = perms.toArray(new String[0]);
            }
        }
    
        public void doIfHasPermissions(EventHandler eventHandler) {
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && permissions != null) {
                if (context instanceof Activity){
                    ((Activity) context).requestPermissions(permissions, permCode);
                }
                this.handler = eventHandler;
            } else {
                eventHandler.handle();
            }
        }
    
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
    
            if (requestCode == permCode){
                boolean success = true;
                for (int grantResult : grantResults){
                    if (grantResult != PackageManager.PERMISSION_GRANTED){
                        success = false;
                    }
                }
    
                if (success && handler != null){
                    handler.handle();
                }
            }
        }
        public interface EventHandler {
             void handle();
        }
    }
    

    我这样称呼这门课:

     public void checkPermissions() {
        String[] permissions = new String[]{
                Manifest.permission.CALL_PHONE};
        myPermissions = new MyPermissions(getActivity(),
                PHONE_PERM_CODE, permissions);
        MyPermissions.EventHandler permHandler = new MyPermissions.EventHandler() {
            @Override
            public void handle() {
    
                makeCall();
            }
        };
    
        myPermissions.doIfHasPermissions(permHandler);
    }
    
    void makeCall() {
        try {
            Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel: + 193 194"));
            startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    MyPermissions 类放在活动中时工作正常,但在片段中它第一次不工作。第二次一切正常。

    谁能告诉我如何重写自定义权限类? 谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   krishank Tripathi    7 年前

    您必须像在android中一样,在MyPermission类的自定义类中进行更改。支持v4.app。Fragment,您应该只使用requestPermissions(这是android.support.v4.app.Fragment的一个实例方法)

    例子::::

    如果您正在参加活动,请致电

    ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST_CAMERA);
    

    如果在片段中,只需调用

    requestPermissions(new String[]{Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST_CAMERA);
    

    已更新:::

    请查看是否运行Android Marshmallow 6.0,API 23

    Android "onRequestPermissionsResult" not being called