当前位置: 首页 > 知识库问答 >
问题:

Android onRequestPermissionsResult对我的片段不起作用

詹正浩
2023-03-14

在我活动页面之一的片段中,我希望从用户处获得权限,并在授予权限后执行一些操作,但OnRequestPermissionsResult不起作用,且在授予权限后看不到任何日志

public class FragmentAboutUs extends Fragment implements ActivityCompat.OnRequestPermissionsResultCallback {
    private Activity          activity;
    private Context           context;
    ...
    private int WRITE_EXTERNAL_STORAGE = 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override

    public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_about_us, container, false);

        activity = getActivity();
        context = getActivity().getBaseContext();

        ...

        aboutUs = SQLite.select().from(AboutUs.class).querySingle();
        if (aboutUs == null) {
            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE);
                } else {
                    ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE);
                }
            }
        }
        return view;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == WRITE_EXTERNAL_STORAGE) {
            Log.e("permission granted"," OK");
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

共有1个答案

桑飞语
2023-03-14

删除此:

implements ActivityCompat.OnRequestPermissionsResultCallback

片段本身可以处理运行时权限的OnRequestPermissionsResultCallback:

使用方法如下:

 final int MyVersion = Build.VERSION.SDK_INT;
if (MyVersion > Build.VERSION_CODES.LOLLIPOP_MR1) {
        if (!checkIfAlreadyhavePermission()) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE }, WRITE_EXTERNAL_STORAGE);  //request permission
        } else {
            //call your method permision already granted
        }
    } else {
            //call your method permission not needed for this version
    }


private boolean checkIfAlreadyhavePermission() {
        int result = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
        return result == PackageManager.PERMISSION_GRANTED;
    }

现在,您可以在片段内部的public void onRequestPermissionsResult()中获取权限结果

使用:

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case WRITE_EXTERNAL_STORAGE: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Toast.makeText(getActivity(), "permission granted", Toast.LENGTH_LONG).show();
                //call your action

            } else {
                Toast.makeText(getActivity(), "permission denied", Toast.LENGTH_LONG).show();
            }
            break;
        }
    }
}
 类似资料:
  • 问题内容: 我试图从Android手机上按本机后退按钮时取消CountDownTimer。因此,我想覆盖onBackPressed方法,以取消计时器并返回到另一个活动,但只能执行一次。(返回主活动,如主页按钮)。 这是代码的一部分: 问题答案: onBackPressed应该在主活动类中 还尝试在应用的清单文件中指定父项和子项活动,例如 并尝试使用类似的东西并重建您的应用程序 如果仍然无法正常运行

  • 问题内容: 我试图用例如值替换指定的模式 这将返回找到模式的行。例如,这是得到的测试返回值之一 这是$$ test $$ 我遇到的问题是当我执行以下操作时 没发生什么事。我想念什么?有关更多信息, 所以我想做的就是每当遇到“ $$ test $$”时,它将用“替换”替换它。我没有发现“ $$ test $$”的问题,但是由于某种原因没有取代它。 问题答案: 您 正在 将back的结果分配给变量,对

  • 我需要父键和它的子键来表示RecycerView中的纬度和经度列表。我想我需要对中的中的做一些事情,但是不管做什么,我都做不对。 我目前循环所有的父键和它的子键作为它的许多父键,并将它添加到列表中... JSON结构: 纬度和经度POJO。 我的活动 致命异常:main process:com.example.rasmusjosefsson.rjcar,pid:19134 com.firebase

  • 我想将我的React应用程序按块拆分,但遇到了一个问题。不呈现通过加载的子。下面的示例代码。 文件一: 文件二 然后检索下一个错误: 未捕获的错误:缩小的React错误#130;访问http://facebook.github.io/react/docs/error-decoder.html?invariant=130&args[]=未定义&args[]=获取完整消息,或使用非缩小的开发环境获取完

  • 我试图在我的项目中实现这段代码,但不起作用RecycerView:如何捕捉ImageView上的onClick?: 我实现了一个接口来处理RecycerView中的onclick imageview和onclick row。问题是,当我试图在imageview上或在行中单击时,不会发生任何事情。如果我在我的ViewHolder类中尝试同样的方法,效果会很好,因为我可以看到祝酒词。问题是我需要这个工

  • 我有使用碎片的活动。但如果我想使用OnClickListener,我的应用程序就会崩溃。如果我不使用OnClickListener,那么一切都可以。我该如何解决这个问题呢?这是我的代码。 d/gralloc_goldfish(796):检测到没有GPU仿真的仿真程序。d/AndroidRuntime(923):Threadid=1:线程退出但未捕获异常(组=0x41465700)致命异常:Main