运行时权限问题

issue with Runtime Permission

我不知道为什么,但我的运行时权限代码不起作用。不出现弹窗。未经许可出现进度条

谁能帮帮我?

提前谢谢大家!

我给你看我的代码:!

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the custom_spinner_items for this fragment

        View rootView = inflater.inflate(R.layout.fragment_four, container, false);



        Button mButton = (Button) rootView.findViewById(R.id.cazzo);

        mButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                if (hasPermissions()) {
                    // our app has permissions.
                    FiveFragment ff = new FiveFragment();
                    numeroTavolo = ff.showResultTavolo(v);

                    MyListFragment mlf = new MyListFragment();


               /* try {
                    mlf.showResultTotale(v);
                } catch (IOException e) {
                    e.printStackTrace();
                }*/

                    string2 = mlf.showResultTotale2(v);
                    totalepizze = mlf.showResultTotale(v);


                    ThreeFragment tf = new ThreeFragment();

                    string4 = tf.showResult(v);

                    totalebibite = tf.showResult2(v);
                    processingDialog.show();
                    mProgressbarAsync = new MakePDF();
                    mProgressbarAsync.execute();
                    new MakePDF(getContext()).execute();

                } else {
                    //our app doesn't have permissions, So i m requesting permissions.
                    requestPerms();
                }

               /* FiveFragment ff = new FiveFragment();
                numeroTavolo = ff.showResultTavolo(v);

                MyListFragment mlf = new MyListFragment();


               *//* try {
                    mlf.showResultTotale(v);
                } catch (IOException e) {
                    e.printStackTrace();
                }*//*

                string2 = mlf.showResultTotale2(v);
                totalepizze = mlf.showResultTotale(v);


                ThreeFragment tf = new ThreeFragment();

                    string4 = tf.showResult(v);

                    totalebibite = tf.showResult2(v);
             */
               /* string4=tf.showResult(v);
                totalebibite=tf.showResult2(v);*/

                   /* processingDialog.show();
                    mProgressbarAsync = new MakePDF();
                    mProgressbarAsync.execute();
                    new MakePDF(getContext()).execute();*/


            }

        });
        TextView titolo2 = (TextView) rootView.findViewById(R.id.result2);
        return rootView;
    }

关于权限的代码:

 private void requestPerms(){
            String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                requestPermissions(permissions,PERMS_REQUEST_CODE);
            }
        }

        private boolean hasPermissions(){

            int res = 0;
            //string array of permissions,
            String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};

            for (String perms : permissions){
                res = checkCallingOrSelfPermission(getContext(),perms);
                if (!(res == PackageManager.PERMISSION_GRANTED)){
                    return false;

                }
            }
            return true;

        }






        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            boolean allowed = true;

            switch (requestCode){
                case PERMS_REQUEST_CODE:

                    for (int res : grantResults){
                        // if user granted all permissions.
                        allowed = allowed && (res == PackageManager.PERMISSION_GRANTED);
                    }

                    break;
                default:
                    // if user not granted permissions.
                    allowed = false;
                    break;

            }

            if (allowed){
                //user granted all permissions we can perform our task.
                //makeFolder();
                FiveFragment ff = new FiveFragment();
                numeroTavolo = ff.showResultTavolo(v);

                MyListFragment mlf = new MyListFragment();


                   /* try {
                        mlf.showResultTotale(v);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }*/

                string2 = mlf.showResultTotale2(v);
                totalepizze = mlf.showResultTotale(v);


                ThreeFragment tf = new ThreeFragment();

                string4 = tf.showResult(v);

                totalebibite = tf.showResult2(v);
                processingDialog.show();
                 mProgressbarAsync = new MakePDF();
                mProgressbarAsync.execute();
                new MakePDF(getContext()).execute();
            }
            else {
                // we will give warning to user that they haven't granted permissions.
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
                        Toast.makeText(getContext(), "Storage Permissions denied.", Toast.LENGTH_SHORT).show();
                    }
                }
            }

        }

请试试这个对我有效。

  1. 我在 Fragment 中使用联系人权限

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (context.checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
            runReadContact();
        } else {
            ActivityCompat.requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, MyActivity.PERMISSION_CODE);
        }
    } else {
        runReadContact();
    }
    
  2. onRequestPermission() 在 MyActivity (Activity Class) 中这样使用

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
     switch (requestCode) {
       case MyActivity.PERMISSION_CODE:
        if (grantResults.length > 0)
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                    runReadContact();
    
            }
        }
        break;
      }
    }
    
  3. 如果你想在片段中使用 onRequestPermission() 我们需要注意一下。

    1) android.support.v4.app.Fragment; => 导入 android.app.Fragment

    2) FragmentCompat.requestPermissions(...

    3) 你在它有效的片段中使用这个 "onRequestPermissionsResult(..."。

你的tarketSdkVersion是多少?

需要运行时权限 (23 >= tarketSdkVerison)

并检查您的应用,

移动"phone > setting > application > your app > permission"

您拒绝您的许可。那么你 运行 你的应用程序

  1. 调试您的应用程序检查是否有 hasPermissions() 函数 returns true 或 false 为真则您的应用程序已经有一个 允许它不会显示弹出窗口。
  2. 检查您的 Manifest.xml 文件。如果它定义了权限并且您 运行 低于 API 级别 23,它仍然不会显示弹出窗口。
  3. 运行 您在 API 级别 23(棉花糖)及以上设备上的应用程序。

希望这能解决您的问题。