Android M及以上位置课程和位置精细返回权限授予true

Posted

技术标签:

【中文标题】Android M及以上位置课程和位置精细返回权限授予true【英文标题】:Android M and above location course and location fine returning permission granted true 【发布时间】:2017-02-27 06:27:00 【问题描述】:

我正在尝试访问用户的位置,只是整理出事情的权限方面。所以我的理解是,在 23 及以上,无论清单如何,用户都必须授予权限。

所以对于旧版本,我在清单中有这样的内容:

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

对于较新的 >= 23,我在显示对话框之前进行这样的测试:

// Check for runtime location permissions
private boolean hasRunTimeLocationPermission() 
    int courseLocationPermission = ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS_COARSE_LOCATION);
    return  (courseLocationPermission == PackageManager.PERMISSION_GRANTED );

我理解的方式应该是第一次返回 false,但它返回的是 true。

用户是否真的必须禁用定位服务,或者它被认为是“危险的”并且必须在第一时间获得批准?

另外我正在使用一个新的模拟器 api 23,当我查看位置权限时,它说没有应用程序请求位置。

感谢您的帮助

【问题讨论】:

您是否在片段中检查这种情况? 是的,我是这样会改变它吗? 在片段的on start方法中 @MadhukarHebbar 谢谢,该应用的权限设置为开启。我以为这不是默认的? @MadhukarHebbar 这是导致问题的原因 谢谢!由于某种原因,模拟器已经开始将该权限设置为true。你知道那会发生什么吗? 【参考方案1】:

试试这个。

// Check for runtime location permissions
private boolean hasRunTimeLocationPermission() 
    int courseLocationPermission = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION);
    return  (courseLocationPermission == PackageManager.PERMISSION_GRANTED );

【讨论】:

感谢您的回复。抱歉,这并没有改变任何东西。【参考方案2】:

试试这个:

private boolean hasRunTimeLocationPermission() 
 if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED)
        
            return false;
        
 else
        
           return true;
        
      

【讨论】:

【参考方案3】:

像这样检查权限:-

Check permissions like this :-

if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)) 
            //Show Information about why you need the permission
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("Need Location Permission");
            builder.setMessage("This app needs location permission.");
            builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() 
                @Override
                public void onClick(DialogInterface dialog, int which) 
                    dialog.cancel();
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]Manifest.permission.ACCESS_COARSE_LOCATION, ACCESS_COARSE_LOCATION_CONSTANT);
                
            );
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
                @Override
                public void onClick(DialogInterface dialog, int which) 
                    dialog.cancel();
                
            );
            builder.show();
         else if (permissionStatus.getBoolean(Manifest.permission.ACCESS_COARSE_LOCATION,false)) 
            //Previously Permission Request was cancelled with 'Dont Ask Again',
            // Redirect to Settings after showing Information about why you need the permission
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("Need Location Permission");
            builder.setMessage("This app needs location permission.");
            builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() 
                @Override
                public void onClick(DialogInterface dialog, int which) 
                    dialog.cancel();
                    sentToSettings = true;
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                    intent.setData(uri);
                    startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
                    Toast.makeText(getBaseContext(), "Go to Permissions to Grant Location", Toast.LENGTH_LONG).show();
                
            );
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
                @Override
                public void onClick(DialogInterface dialog, int which) 
                    dialog.cancel();
                
            );
            builder.show();
         else 
            //just request the permission
            ActivityCompat.requestPermissions(MainActivity.this, new String[]Manifest.permission.ACCESS_COARSE_LOCATION, ACCESS_COARSE_LOCATION_CONSTANT);
        

        SharedPreferences.Editor editor = permissionStatus.edit();
        editor.putBoolean(Manifest.permission.ACCESS_COARSE_LOCATION,true);
        editor.commit();


     else 
        //You already have the permission, just go ahead.
        proceedAfterPermission();
    

【讨论】:

【参考方案4】:

即使对于 api>23 也将其添加到 Manifest

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

然后像这样请求运行时权限:-

ActivityCompat.requestPermissions(MainActivity.this,
                new String[]Manifest.permission.ACCESS_COARSE_LOCATION,
                1);

要处理结果,请使用:-

@Override
public void onRequestPermissionsResult(int requestCode,
                                   String permissions[], int[] grantResults) 
switch (requestCode) 
    case 1: 

      // If request is cancelled, the result arrays are empty.
      if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) 

            // permission was granted, yay! Do the
         else 

            // permission denied, boo! 
            Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
        
        return;
    


【讨论】:

以上是关于Android M及以上位置课程和位置精细返回权限授予true的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时请求位置权限

如何在运行时请求位置权限

低于 M 的 android 版本的 Android 运行时权限?

Android Q R的适配-隐私权限

Android Q R的适配-隐私权限

Android Q R的适配-隐私权限