Android 如何使用fragment类获取mapview上的当前位置?

Android 如何使用fragment类获取mapview上的当前位置?,android,google-maps,android-fragments,android-mapview,Android,Google Maps,Android Fragments,Android Mapview,您好,我是android开发的新手,我想使用fragment类获取mapview中的当前位置。当我添加setMyLocationEnabled方法时,它正在请求权限,我已经在清单中添加了所有权限。请帮帮我 Gmaps.java(片段) 在清单中,我添加了用于google地图服务的所有这些权限 public void showMap() { mapFragment = (SupportMapFragment)getChildFragmentManager().findFragmentBy

您好,我是android开发的新手,我想使用fragment类获取mapview中的当前位置。当我添加setMyLocationEnabled方法时,它正在请求权限,我已经在清单中添加了所有权限。请帮帮我

Gmaps.java(片段)

在清单中,我添加了用于google地图服务的所有这些权限

public void showMap() {

    mapFragment = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map);
    if (map == null) {
        map = mapFragment.getMap();
    }


    // Enable Zoom
    map.getUiSettings().setZoomGesturesEnabled(true);

    //set Map TYPE
    map.setMapType(GoogleMap.MAP_TYPE_NORMAL);

    //enable Current location Button
    map.setMyLocationEnabled(true);

    LocationManager locationManager = (LocationManager)getActivity().getSystemService(getActivity().LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    String bestProvider = locationManager.getBestProvider(criteria, true);
    if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    Location location = locationManager.getLastKnownLocation(bestProvider);
    if (location != null) {
        onLocationChanged(location);
    }
    locationManager.requestLocationUpdates(bestProvider, 2000, 0, this);
}

@Override
public void onLocationChanged(Location location) {

    latitude= location.getLatitude();
    longitude=location.getLongitude();

    LatLng loc = new LatLng(latitude, longitude);

     if (marker!=null){
         marker.remove();
     }

    marker=  map.addMarker(new MarkerOptions().position(loc).title("Sparx IT Solutions"));
    map.moveCamera(CameraUpdateFactory.newLatLng(loc));
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f));

}

@Override
public void onProviderDisabled(String provider) {

    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivity(intent);
    Toast.makeText(getActivity().getBaseContext(), "Gps is turned off!!",
            Toast.LENGTH_SHORT).show();
}

@Override
public void onProviderEnabled(String provider) {

    Toast.makeText(getActivity().getBaseContext(), "Gps is turned on!! ",
            Toast.LENGTH_SHORT).show();
}
清单文件中添加这些使用权限

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

根据:

如果设备运行的是Android 6.0或更高版本,您的应用程序的目标SDK为23或更高版本:应用程序必须在清单中列出权限,并且必须在应用程序运行时请求所需的每个危险权限。用户可以授予或拒绝每个权限,即使用户拒绝权限请求,应用程序也可以在有限的功能下继续运行

这就是为什么尽管您已经在清单文件中声明了权限,但仍然需要在运行时请求它们的原因

作为一种解决方法,您可以设置
minSdkVersion
<23,但也可以如文档所述:

注意:从Android 6.0(API级别23)开始,用户可以随时撤销任何应用程序的权限,即使该应用程序的API级别较低。您应该测试您的应用程序,以验证它在缺少所需权限时是否正常运行,而不管您的应用程序目标的API级别如何


而且,根据,您应该针对这两种权限模型进行测试,以提供更好的用户体验。

在您的
build.gradle
?minSdkVersion=15&targetSdkVersion=23@antonio上设置的
minSdkVersion
targetSdkVersion
的值是什么?您能告诉我如何在我的mapview中获取其他用户的位置吗? @antonioit给出了一个错误“无法强制转换到android.location.LocationListener”@ManishKumarimplements LocationListener和您的片段您能帮助我在我的mapview中获取其他用户的位置吗@Manishkumary您需要lat long,然后您可以获取其他位置该行
locationManager.requestLocationUpdates(bestProvider,2000,0,this)给了我一个错误,它应该是一个位置侦听器而不是“this”吗<代码>无法解析方法“requestLocationUpdates(java.lang.String,int,int,anonymous com.google.android.gms.maps.OnMapReadyCallback)”
如果您将跳过或不想执行运行时权限。尝试使用compileSdk至22或更低版本,以及兼容的google play service版本
com.google.android.gms:play services:8.3.0
。正如Antonio所说,API级别23及以上应用了“在运行时请求权限:用户在应用程序运行时向应用程序授予权限,而不是在安装应用程序时。”你能给我一个使用Android 6 API级别23的地图中用户位置的最佳示例吗?@Abhishek Thapli Thapliyal,你可以在这里找到一个示例
<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />