首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android onRequestPermissionsResult仅在Activity上调用,而在Fragment上不调用

Android的onRequestPermissionsResult方法是用于处理权限请求结果的回调方法。它在用户对权限请求进行操作后被调用,以便开发者可以根据用户的操作结果进行相应的处理。

在Activity中,当权限请求的结果返回时,系统会自动调用Activity的onRequestPermissionsResult方法,并将结果传递给该方法。开发者可以在该方法中根据不同的权限请求结果进行相应的处理,例如授权成功后继续执行相关操作,授权失败则给出相应的提示信息。

然而,在Fragment中,onRequestPermissionsResult方法并不会自动调用。这是因为Fragment本身并没有直接处理权限请求的能力,权限请求的操作仍然需要在宿主Activity中进行。因此,在Fragment中处理权限请求的结果时,需要将结果传递给宿主Activity,并由宿主Activity的onRequestPermissionsResult方法进行处理。

为了在Fragment中处理权限请求结果,可以通过以下步骤实现:

  1. 在Fragment中定义一个接口,用于将权限请求结果传递给宿主Activity。例如:
代码语言:java
复制
public interface OnPermissionResultListener {
    void onPermissionResult(int requestCode, String[] permissions, int[] grantResults);
}
  1. 在Fragment中调用宿主Activity的requestPermissions方法进行权限请求,并将权限请求结果传递给宿主Activity。例如:
代码语言:java
复制
public class MyFragment extends Fragment {
    private OnPermissionResultListener mListener;

    // ...

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnPermissionResultListener) {
            mListener = (OnPermissionResultListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnPermissionResultListener");
        }
    }

    public void requestPermissions(String[] permissions, int requestCode) {
        // 请求权限
        ActivityCompat.requestPermissions(getActivity(), permissions, requestCode);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        mListener.onPermissionResult(requestCode, permissions, grantResults);
    }
}
  1. 在宿主Activity中实现OnPermissionResultListener接口,并在onPermissionResult方法中处理权限请求结果。例如:
代码语言:java
复制
public class MainActivity extends AppCompatActivity implements MyFragment.OnPermissionResultListener {

    // ...

    @Override
    public void onPermissionResult(int requestCode, String[] permissions, int[] grantResults) {
        // 处理权限请求结果
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 权限授权成功
                    // 继续执行相关操作
                } else {
                    // 权限授权失败
                    // 给出相应的提示信息
                }
                break;
            // 处理其他权限请求结果...
        }
    }
}

通过以上步骤,可以在Fragment中处理权限请求结果,并根据结果进行相应的操作。这种方式可以使代码更加模块化和可复用,提高开发效率。

腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅供参考,具体产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

因为Android M权限问题导致的"Permission Denial: reading com.android.providers.media.MediaProvider"解决办法

最后查明是因为API过高权限访问有修改, 在API级别>=23时, 权限访问被分为三个级别, 分别为”PROTECTION_NORMAL, PROTECTION_DANGEROUS, 和PROTECTION_SIGNATURE(还有两个标志可以和SIGNATURE联合使用才有意义)”. PROTECTION_NORMAL是普通权限, 通过manifest文件在安装时被授予. PROTECTION_SIGNATURE是签名权限, 通过”检查manifest和app签名是否匹配app中声明的权限”在安装时授予. 对于 PROTECTION_DANGEROUS, 不仅需要在manifest中声明, 还需要在运行时通过requestPermissions获得, 也就是弹出来一个个对话框, 让用户确认是否授予app这些权限. 这些是常见PROTECTION_DANGEROUS权限, 如果你在程序中使用了, 那么在API>=23, 很可能会不正常工作. ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION ADD_VOICEMAIL BODY_SENSORS CALL_PHONE CAMERA GET_ACCOUNTS PROCESS_OUTGOING_CALLS READ_CALENDAR READ_CALL_LOG READ_CELL_BROADCASTS READ_CONTACTS READ_EXTERNAL_STORAGE READ_PHONE_STATE READ_SMS RECEIVE_MMS RECEIVE_SMS RECEIVE_WAP_PUSH RECORD_AUDIO SEND_SMS USE_SIP WRITE_CALENDAR WRITE_CALL_LOG WRITE_CONTACTS WRITE_EXTERNAL_STORAGE

02
领券