无法使用onLocationChanged获取位置

时间:2018-05-09 06:49:51

标签: android

我一直试图从我的Android应用程序获取位置很长一段时间。我仍然无法获取该位置。 onLocationChanged没有被调用。

MapsActivity2.java

public class MapsActivity2 extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    LocationManager locationManager;
    //Location location1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps2);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.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.
            Toast.makeText(this,"Permission Missing",Toast.LENGTH_LONG).show();
            return;
        }
        if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
        {
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    double latitude = location.getLatitude();
                    double longitude = location.getLongitude();
                    LatLng latLng=new LatLng(latitude,longitude);
                    mMap.addMarker(new MarkerOptions().position(latLng).title("Bus Location"));
                    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,17.0f));
                }

                @Override
                public void onStatusChanged(String s, int i, Bundle bundle) {

                }

                @Override
                public void onProviderEnabled(String s) {

                }

                @Override
                public void onProviderDisabled(String s)
                {
                    Toast.makeText(MapsActivity2.this, "Please Enable GPS and Internet", Toast.LENGTH_SHORT).show();

                }
            });
        }
        else if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
        {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    double latitude = location.getLatitude();
                    double longitude = location.getLongitude();
                    LatLng latLng=new LatLng(latitude,longitude);
                    mMap.addMarker(new MarkerOptions().position(latLng).title("Bus Location"));
                    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,17.0f));
                }

                @Override
                public void onStatusChanged(String s, int i, Bundle bundle) {

                }

                @Override
                public void onProviderEnabled(String s) {

                }

                @Override
                public void onProviderDisabled(String s)
                {
                    Toast.makeText(MapsActivity2.this, "Please Enable GPS and Internet", Toast.LENGTH_SHORT).show();

                }
            });
        }
        /*location1=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if(location1!=null)
        {
            double latitude = location1.getLatitude();
            double longitude = location1.getLongitude();
            LatLng latLng = new LatLng(latitude, longitude);
            mMap.addMarker(new MarkerOptions().position(latLng).title("Bus Location"));
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 17.0f));
        }*/
    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }
}

2 个答案:

答案 0 :(得分:0)

很多事情都可能改变结果。第一个似乎是允许的,因此如果应用程序未被授予使用它们,那么它将被退回并且不会发出任何位置请求。

if (ActivityCompat.checkSelfPermission(this, 
    android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
    && ActivityCompat.checkSelfPermission(this, 
    android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    ...
    return;
}

其他人可能是提供者的状态。因此,如果它们未启用,也不会提出任何位置请求

一个用于网络提供商

if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))

和gps提供商

if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))

此代码也容易出错。

if (ActivityCompat.checkSelfPermission(this, 
    android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
    && ActivityCompat.checkSelfPermission(this, 
    android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    ...
    return;
}

如果没有授予gps 网络权限,那么就说不起作用。但是,如果任何授予了,请继续工作。

然后你在不知道授予哪一个的情况下发出位置请求。

最后,导致未授予的人将抛出SecurityException

答案 1 :(得分:0)

请勿在此行new LocationListener()中使用locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener()

创建一个侦听器对象并使用它,或者只使用this

new LocationListener() 

与您正在访问的不同。