Как мне вызвать класс non activity в классе MainActivity?

#android #gps #android-gps #fusedlocationproviderapi

#Android #gps #android-gps #fusedlocationproviderapi

Вопрос:

У меня есть объединенный класс Location Api, который прямо сейчас расширяет AppCompatActivity. Я хочу сделать его классом non-activity и вызвать его в MainActivity или в любом другом классе activity. Как я могу это сделать? Я новичок. Поэтому, пожалуйста, любая конструктивная критика была бы действительно оценена.

 public class GpsLocation extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener, LocationListener {

private Location location;
private TextView locationTv;
private GoogleApiClient googleApiClient;
private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
private LocationRequest locationRequest;
private static final long UPDATE_INTERVAL = 5000, FASTEST_INTERVAL = 5000; // = 5 seconds
// lists for permissions
private ArrayList<String> permissionsToRequest;
private ArrayList<String> permissionsRejected = new ArrayList<>();
private ArrayList<String> permissions = new ArrayList<>();
// integer for permissions results request
private static final int ALL_PERMISSIONS_RESULT = 1011;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.content_hotkey_navigation);
    locationTv = findViewById(R.id.location);
    // we add permissions we need to request location of the users
    permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
    permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);

    permissionsToRequest = permissionsToRequest(permissions);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (permissionsToRequest.size() > 0) {
            requestPermissions(permissionsToRequest.toArray(
                    new String[0]), ALL_PERMISSIONS_RESULT);
        }
    }

    // we build google api client
    googleApiClient = new GoogleApiClient.Builder(this).
            addApi(LocationServices.API).
            addConnectionCallbacks(this).
            addOnConnectionFailedListener(this).build();
}

private ArrayList<String> permissionsToRequest(ArrayList<String> wantedPermissions) {
    ArrayList<String> result = new ArrayList<>();

    for (String perm : wantedPermissions) {
        if (!hasPermission(perm)) {
            result.add(perm);
        }
    }

    return resu<
}

private boolean hasPermission(String permission) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
    }

    return true;
}

@Override
protected void onStart() {
    super.onStart();

    if (googleApiClient != null) {
        googleApiClient.connect();
    }
}

@Override
protected void onResume() {
    super.onResume();

    if (!checkPlayServices()) {
        locationTv.setText("You need to install Google Play Services to use the App properly");
    }
}

@Override
protected void onPause() {
    super.onPause();

    // stop location updates
    if (googleApiClient != null  amp;amp;  googleApiClient.isConnected()) {
        LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this);
        googleApiClient.disconnect();
    }
}

private boolean checkPlayServices() {
    GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
    int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);

    if (resultCode != ConnectionResult.SUCCESS) {
        if (apiAvailability.isUserResolvableError(resultCode)) {
            apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST);
        } else {
            finish();
        }

        return false;
    }

    return true;
}

@Override
public void onConnected(@Nullable Bundle bundle) {
    if (ActivityCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            amp;amp;  ActivityCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }

    // Permissions ok, we get last location
    location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

    if (location != null) {
        locationTv.setText("Latitude : "   location.getLatitude()   "nLongitude : "   location.getLongitude());
    }

    startLocationUpdates();
}

private void startLocationUpdates() {
    locationRequest = new LocationRequest();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(UPDATE_INTERVAL);
    locationRequest.setFastestInterval(FASTEST_INTERVAL);

    if (ActivityCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            amp;amp;  ActivityCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(this, "You need to enable permissions to display location !", Toast.LENGTH_SHORT).show();
    }

    LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);
}

@Override
public void onConnectionSuspended(int i) {
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}

@Override
public void onLocationChanged(Location location) {
    if (location != null) {
        locationTv.setText("Latitude : "   location.getLatitude()   "nLongitude : "   location.getLongitude());
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch(requestCode) {
        case ALL_PERMISSIONS_RESULT:
            for (String perm : permissionsToRequest) {
                if (!hasPermission(perm)) {
                    permissionsRejected.add(perm);
                }
            }

            if (permissionsRejected.size() > 0) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (shouldShowRequestPermissionRationale(permissionsRejected.get(0))) {
                        new AlertDialog.Builder(GpsLocation.this).
                                setMessage("These permissions are mandatory to get your location. You need to allow them.").
                                setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int i) {
                                        requestPermissions(permissionsRejected.
                                                toArray(new String[0]), ALL_PERMISSIONS_RESULT);
                                    }
                                }).setNegativeButton("Cancel", null).create().show();

                        return;
                    }
                }
            } else {
                if (googleApiClient != null) {
                    googleApiClient.connect();
                }
            }

            break;
    }
}
  

}

Мне нужно получить его GPS-координаты и отправить их в класс MainActivity.Поэтому, пожалуйста, помогите мне. Любая помощь была бы очень признательна.

Ответ №1:

зачем вы вообще расширяете AppCompat, если вам нужен обычный класс? Создайте обычный класс и создайте его экземпляр в своей activity. Что именно вы пытаетесь сделать в этом классе, что он не может быть методом в вашей Activity?

Клиент с объединенным местоположением может быть создан где угодно, вызвав

  fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);