【问题标题】:Runtime Permission is Not Working When Put Inside Fragment放入片段时运行时权限不起作用
【发布时间】:2018-02-05 08:39:35
【问题描述】:

我尝试在fragment 中使用runtime permission

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

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 类在放入 Activity 时可以正常工作,但在片段中它第一次无法正常工作。第二次一切都正确。

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

【问题讨论】:

  • 它不会在你将在活动中获得 onRequestPermissionsResult 的片段中真正起作用。

标签: java android android-fragments android-activity android-permissions


【解决方案1】:

您必须在自定义类中为 MyPermission 类进行更改,就像在 android.support.v4.app.Fragment 中一样,您应该简单地使用 requestPermissions(这是 android.support.v4.app.Fragment 的实例方法)

示例::::

如果你在一个Activity中,那么调用

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

【讨论】:

  • 谢谢@krishank Tripathi
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多