即使我设置了位置权限,也无法获得gps /网络位置

时间:2016-07-23 14:01:18

标签: android

我尝试使用网络/ gps获取位置。

我定义在清单上添加权限(ACCESS_FINE_LOCATION)但我得到的权限是-1(PERMISSION_DENIED)

我在主要活动上调用了类'GetLocation'的实例。 并从此主要活动中调用'getCurrentLocation(this)'。

代码:

  public class MainActivity extends AppCompatActivity {

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

    TraceActionLocation t = new TraceActionLocation();

    Location l = t.getCurrentLocation(this);


}


  public class GetLocation
  {
    public Location getCurrentLocation(Context context)
    {
        Location location = null;

    LocationManager locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);

    Boolean isGpsEnable = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    Boolean isNetworkEnable = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

    if(!isGpsEnable && !isNetworkEnable)
    {
        // TODO !!! => no gps and no network !!!
    }
    else if(context.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_DENIED)
    {
        // 1. get the location from network provider
        if(isNetworkEnable)
        {
                location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        }

        // 2. get the more equate location from the gps
        if(isGpsEnable)
        {
            location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        }
    }

    return location;
}
}

2 个答案:

答案 0 :(得分:1)

在Marshmallow的清单中添加位置权限是不够的。您必须在运行时请求权限。首先,您必须添加ACCESS_COARSE_LOCATION权限。因为我之前尝试在运行时请求ACCESS_FINE_LOCATION,但它永远不会有效。 在您的活动中请求ACCESS_COARSE_LOCATION。找一个粗略的例子如下:

public class MainActivity extends AppCompatActivity {

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


    if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_DENIED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.i("result", "permissioin granted");

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

}

答案 1 :(得分:-2)

从移动设备获取用户位置可能很复杂。位置读取(无论源是什么)可能包含错误和不准确的原因有多种。用户位置中的一些错误来源包括:

众多位置来源 GPS,Cell-ID和Wi-Fi均可为用户提供线索位置。确定使用和信任哪个是在准确性,速度和电池效率方面的权衡。 用户动作 由于用户位置发生变化,因此您必须经常重新估算用户位置以考虑移动。 准确度不同 来自每个位置来源的位置估计值的准确性不一致。 10秒前从一个来源获得的位置可能比来自另一个或相同来源的最新位置更准确。

请求用户许可...          ...