Почему этот код (который использует FusedLocationProviderClient для определения местоположения пользователя) не работает? - PullRequest
0 голосов
/ 24 января 2019

Я хочу как можно точнее найти текущую широту и долготу пользователя и отобразить эти данные в TextView в моей функции MainActivity. Тем не менее, приложение всегда возвращает 0.0, 0.0 в качестве широты и долготы.

Я попытался исправить свой AndroidManifest, а также вручную предоставить соответствующие разрешения для приложения.

public class MainActivity extends AppCompatActivity {
TextView mTextViewLocation ;
boolean permission ;
private FusedLocationProviderClient mFusedLocationClient;
private LocationRequest mLocationRequest;
private LocationCallback mLocationCallback;
private double Latitude ;
private double Longitude ;
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    setupGPS();
    mTextViewLocation = (TextView)findViewById(R.id.textViewLocation);
    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    mLocationRequest = LocationRequest.create();
    mLocationRequest.setInterval(60000);
    mLocationRequest.setFastestInterval(20000);
    mLocationRequest.setMaxWaitTime(60000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null){
                Log.d("Location: GPS","off");
                return;
            }
            for (Location location : locationResult.getLocations()) {
                Log.d("locations : " ,location.getLatitude()+"");
                Latitude = location.getLatitude();
                Longitude = location.getLongitude();
            }
        }
    };
    String s = Latitude + " " + Longitude ;
    mTextViewLocation.setText(s);
}
public void setupGPS() {
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);
    SettingsClient client = LocationServices.getSettingsClient(this);
    Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
    task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
        @Override
        public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
            // All location settings are satisfied. The client can initialize
            // location requests here.
            // ...
            if(PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION)) {
                permission=true;
                mFusedLocationClient.requestLocationUpdates(mLocationRequest,
                        mLocationCallback,null);
            }
            else {
               permission=false;
                AlertDialog.Builder alert=new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("Permission Denied");
                alert.setMessage("You need to enable location permissions for this app.");
                alert.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        permission = true ;
                        ActivityCompat.requestPermissions(MainActivity.this,
                                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                                608);
                    }
                });
                alert.setNegativeButton("Later", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        permission=false;
                    }
                });
                alert.create().show();
            }
        }
    });
    task.addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            if (e instanceof ResolvableApiException) {
                try {
                    // Show the dialog by calling startResolutionForResult(),
                    // and check the result in onActivityResult().
                    ResolvableApiException resolvable = (ResolvableApiException) e;
                    resolvable.startResolutionForResult(MainActivity.this,
                            607);
                } catch (IntentSender.SendIntentException sendEx) {
                    // Ignore the error.
                }
            }
        }
    });
}

}

Я хочу, чтобы это отображало мое точное местоположение с точки зрения широты и долготы, но теперь оно отображает «0.0 0.0».

Вот разрешения, которые я дал приложению в AndroidManifest:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-feature android:name="android.hardware.location.gps" /> 

Я также включил это в Build.gradle моего приложения:

implementation 'com.google.android.gms:play-services-location:16.0.0' 

1 Ответ

0 голосов
/ 24 января 2019

String s = Latitude + " " + Longitude; mTextViewLocation.setText(s);

находится за пределами onLocationResult() метода обратного вызова.Так как mTextViewLocation.setText(s); вызывается до onLocationResult() метода, вы получаете неправильное значение в текстовом представлении.

Ниже приведены шаги для определения местоположения устройства:

  1. Добавить зависимость в файл Gradle уровня вашего приложения: implementation com.google.android.gms:play-services-location:16.0.0

  2. Обязательно добавьте разрешение в файле Menifest:

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

  3. Тогда вы можете получить местоположение, используя следующий код:


 LocationRequest request = new LocationRequest();
            request.setInterval(10000);
            request.setFastestInterval(5000);
            request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            FusedLocationProviderClient client = 
         LocationServices.getFusedLocationProviderClient(this);
            int permission = ContextCompat.checkSelfPermission(this,
                        Manifest.permission.ACCESS_FINE_LOCATION);   
            if (permission == PackageManager.PERMISSION_GRANTED) {   
                    // Request location updates and when an update is 
                    // received, update text view    
                    client.requestLocationUpdates(request, new LocationCallback() {         
                            @Override  
                        public void onLocationResult(LocationResult locationResult) {                           
                            Location location = locationResult.getLastLocation();  
                            if (location != null) {   
                                    // Use the location object to get Latitute and Longitude and then update your text view.  
                            }  
                        }  
                    }, null);  
                }
...