Android权限检查不起作用

时间:2017-07-14 09:46:05

标签: android android-permissions

AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

代码:

button.setOnClickListener {
var permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
  toast("success")
} else {
  toast("fail")}}

为什么这会“失败”?

7 个答案:

答案 0 :(得分:0)

对于Android 6.0+targetSdk=23,您必须考虑要求运行时权限。权限android.permission.ACCESS_FINE_LOCATION被认为是危险的,因此您必须在运行时提出要求。有关概述,请参阅Normal and Dangerous Permissions

你要做的就是在运行时问它,例如

来自开发者指南

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

Requesting Permissions at Run Time

了解详情

答案 1 :(得分:0)

在这种情况下,您应该请求以下权限:ActivityCompat.requestPermissions(thisActivity, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE); 你应该在onRequestPermissionsResult回调中得到答案。 然后,如果用户授予权限,则下次使用checkSelfPermission方法时,您将获得success

有关详细信息,请阅读:https://developer.android.com/training/permissions/requesting.html

答案 2 :(得分:0)

您似乎正在使用目标sdk&gt; = 23并在设备上运行app,api级别也是&gt; = 23。因此,自api 23以来,有新的流程来重新获得权限。权限分为正常和危险两类。应在运行时询问危险权限,如下所示: ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_LOCATION);

这将显示用户的系统对话框: Android 6.0 runtime permissions dialog

因此,用户选择的结果将返回public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)

使用您在ActivityCompat.requestPermissions中传递的请求代码,在我的情况下,它是MY_PERMISSIONS_REQUEST_LOCATION

权限&#39;名称将在String权限[]中,用户的选择将相应地在int [] grantResults中,可以是PackageManager.PERMISSION_GRANTED或PERMISSION_DENIED。

在询问之前向用户解释为什么需要该权限也是一件好事。

在此处查看更多内容:Requesting Permissions at Run Time

答案 3 :(得分:0)

您可以在Android 6.0中查看/之后的权限

public class MainActivity extends AppCompatActivity {

    private final int PERMISSIONS_CODE = 1001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       Button button = (Button) findViewById(R.id.button1);
       button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {

                ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION,}, PERMISSIONS_CODE);

            } else {

                // You can do you operation directly. If you added permissions in AndroidManifest...
                // Or visit following link to read about permission check.
                // https://stackoverflow.com/questions/7203668/how-permission-can-be-checked-at-runtime-without-throwing-securityexception

            }
        }
    });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case PERMISSIONS_CODE:
            if (grantResults.length > 0 && grantResults[grantResults.length-1] == PackageManager.PERMISSION_GRANTED) {
                Log.d("permission", "accepted");
            } else {
                Log.d("permission", "denied");
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            break;
    }
}

}

快乐的编码......

答案 4 :(得分:0)

对于Android 6.0和你的targetSdkVersion&gt; = 23,你应该在运行时询问权限,我有两个建议: 1,您可以在模型gradle文件中更改targetSdkVersion,例如:

targetSdkVersion=22

但是,我不建议使用此方法。 2,此返回'失败'表示您没有此权限,您应该 考虑一下您是否有请求但用户拒绝,在此您可以显示一个对话框告诉使用,为什么需要这个perssion,然后请求您想要的渗透,您可以使用以下代码:

   private boolean check(){
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED){
            //you have this permession
            return true;
        }else{
            //don't hava permession ,you shoud check if you can request
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
                //the use refuse you request this permission ,the system well't show request dialog,you shoul show a dialog tu explain why you need this permission
                //and guide he go to system setting open this permission.
            }else {
                // you can request permission direct
                //requestCode is a integer code,that you can use is in onRequestPermissionsResult
                ActivityCompat.requestPermissions(this, Manifest.permission.ACCESS_FINE_LOCATION, requestCode);

            }

        }
        return false;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //in this you can listen the request result
        if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
            //user Agree permission
        }else{
            //user reject permission
        }
    }

对不起,我只知道java,所以,这段代码是jave。希望这可以帮助你解决这个问题。

答案 5 :(得分:0)

请求权限对我来说太困惑了,EasyPermissions解决了我所有的问题

清单:

compile 'pub.devrel:easypermissions:0.4.2'

代码:

button.setOnClickListener {
    if (EasyPermissions.hasPermissions(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
        toast("yes !")
    } else {
        EasyPermissions.requestPermissions(this, getString(R.string.location_perm), 1, Manifest.permission.ACCESS_FINE_LOCATION )
    }}

完美的第一次尝试

答案 6 :(得分:0)

    public static int CAMERA_PERMISSSION_CODE = 1;
        public static int STORAGE_PERMISSSION_CODE = 2;
        public static int FINE_LOCATION_PERMISSSION_CODE = 3;
        public static int COARSE_LOCATION_PERMISSSION_CODE = 3;
        public static int READ_PHONESTATE_PERMISSSION_CODE = 4;




 private void askForunTimePermissions() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {


            if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {


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

            } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {


                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSSION_CODE);
            } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {

                requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, FINE_LOCATION_PERMISSSION_CODE);
            } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.ACCESS_COARSE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, COARSE_LOCATION_PERMISSSION_CODE);
            } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.READ_PHONE_STATE)
                    != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, READ_PHONESTATE_PERMISSSION_CODE);
            } else {



            }


        }


    }


   @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        try {
            if (requestCode == CAMERA_PERMISSSION_CODE) {

                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }


            } else if (requestCode == STORAGE_PERMISSSION_CODE) {

                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }


            } else if (requestCode == FINE_LOCATION_PERMISSSION_CODE) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }

            } else if (requestCode == COARSE_LOCATION_PERMISSSION_CODE) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }

            } else if (requestCode == READ_PHONESTATE_PERMISSSION_CODE) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }

            }

        } catch (Exception e) {
            Toast.makeText(PermissionsActivity.this, "No permission requests matched", Toast.LENGTH_SHORT).show();
        }
    }


//call this method where u want
  askForunTimePermissions();