在Android中没有调用onlocationchanged

时间:2016-08-03 07:02:23

标签: android gps android-location locationlistener

我试图在Android中使用LocationListener方法获取当前设备位置。在某些手机中,它不起作用或onlocationchanged没有被调用。在这种情况下如何获得位置? 在oncreate:

mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, 0, this);
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);

和这个

@Override
    public void onLocationChanged(Location location) {

        latitude = location.getLatitude();
        longitude = location.getLongitude();
        Log.e("TAG","lat and long "+latitude+" "+longitude);
}

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

    }

    @Override
    public void onProviderEnabled(String s) {

    }

    @Override
    public void onProviderDisabled(String s) {

    }

但是在Marshmallow

下面的版本中没有调用onLocationChanged

1 个答案:

答案 0 :(得分:2)

使用此代码在所有设备中运行并进行测试:

 private void getCurrentLocation() {
//        Log.e("getLocation","Called");

        LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        LocationListener locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                mlat = location.getLatitude();
                mlon = location.getLongitude();
       String mLogn = Double.toString(mlon);
               String mLatd = Double.toString(mlat);
//                Log.e("mLogn",""+mLogn);
//                Log.e("mLatd",""+mLatd);
                mLogn=mLogn.trim();
                mLatd=mLatd.trim();
                if (mLatd==null || mLogn==null) {
                    if (mLatd.isEmpty()) {
                        mLatd = "No data found";
                    }
                    if (mLogn.isEmpty()) {
                        mLogn = "No data found";
                    }
                }

                // Log.e("Location",""+mlon+" "+mlat);
//                Toast.makeText(CampaignTrain.this, "your location is " + mLogn + " " + mLatd, Toast.LENGTH_SHORT).show();

            }

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

            }

            @Override
            public void onProviderEnabled(String s) {

            }

            @Override
            public void onProviderDisabled(String s) {

            }
        };
        String locationProvide = LocationManager.NETWORK_PROVIDER;
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_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.
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},COARSE_LOCATION_REQUEST_CODE);
                return;
            }


        }
        if ( ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},FINE_LOCATION_REQUEST_CODE);
                return;
            }

        }
        locationManager.requestLocationUpdates(locationProvide, 0, 0, locationListener);
        Location lastLocation=locationManager.getLastKnownLocation(locationProvide);


    }

并设置运行时权限:

int FINE_LOCATION_REQUEST_CODE=101;
int COARSE_LOCATION_REQUEST_CODE=102;

     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch (requestCode)
            {

               case COARSE_LOCATION_REQUEST_CODE:
                {
                    if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED)
                    {

                    }
                    else
                    {
                        mLatd="User denied location";
                        mLogn="User denied location";
                    }
                    return;
                }
                case FINE_LOCATION_REQUEST_CODE:
                {
                    if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED)
                    {

                    }
                    else
                    {
                        mLatd="User denied location";
                        mLogn="User denied location";
                    }
                    return;
                }
            }
        }