Как отследить местоположение друзей? - PullRequest
0 голосов
/ 20 мая 2018

Я новичок в этой области, и я пытаюсь создать приложение для отслеживания моих друзей, например "snap-map".Я могу получить свое местоположение в реальном времени, но я не знаю, что мне добавить, чтобы получить в реальном времени местоположение людей, которые используют одно и то же приложение.

Вот мой код Java, он будет действительно полезнымдля меня, если вы, ребята, дайте мне код.

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, LocationListener {

private FirebaseAuth mAuth;
final static int PERMISSION_ALL = 1;
final static String[] PERMISSIONS = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};

private GoogleMap mMap;
MarkerOptions mo;
Marker marker;
private Location user;
LocationManager locationManager;
private HashMap<Float, Location> otherUser = new HashMap<Float, Location>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);

    mAuth = FirebaseAuth.getInstance();

    // 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);
    mo = new MarkerOptions().position(new LatLng(0, 0)).title("My Current Location");
    if (Build.VERSION.SDK_INT >= 27 && !isPermissionGranted()) {
        requestPermissions(PERMISSIONS, PERMISSION_ALL);
    } else requestLocation();
    if (!isLocationEnabled())
        showAlert(1);

}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    marker = mMap.addMarker(mo);
    }

//Called when the location has changed.
@Override
public void onLocationChanged(Location location) {
    LatLng myCoordinates = new LatLng(location.getLatitude(), location.getLongitude());
    marker.setPosition(myCoordinates);
    mMap.moveCamera(CameraUpdateFactory.newLatLng(myCoordinates));

}
//Called when the provider status changes.
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

//Called when the provider is enabled by the user.
@Override
public void onProviderEnabled(String provider) {

}

//Called when the provider is disabled by the user. If requestLocationUpdates

@Override
public void onProviderDisabled(String provider) {

}

private void requestLocation() {
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setPowerRequirement(Criteria.POWER_HIGH);
    String provider = locationManager.getBestProvider(criteria, true);
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, 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;
    }
    locationManager.requestLocationUpdates(provider, 10000, 10, this);
}

private boolean isLocationEnabled() {
    return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
            locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

private boolean isPermissionGranted() {
    if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
            == PackageManager.PERMISSION_GRANTED || checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        Log.v("mylog","Permission is granted");
        return true;
    }else{
        Log.v("mylog","Permission not granted");
        return false;

    }
}
private void showAlert(final int status) {
    String message, title, btnText;
    if (status == 1) {
        message = "Your Locations Settings is set to 'Off'.\nPlease Enable Location to " +
                "use this app";
        title = "Enable Location";
        btnText = "Location Settings";
    } else {
        message = "Please allow this app to access location!";
        title = "Permission access";
        btnText = "Grant";
    }
    final AlertDialog.Builder dialog = new AlertDialog.Builder(this);
    dialog.setCancelable(false);
    dialog.setTitle(title)
            .setMessage(message)
            .setPositiveButton(btnText, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                    if (status == 1) {
                        Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        startActivity(myIntent);
                    } else
                        requestPermissions(PERMISSIONS, PERMISSION_ALL);
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                    finish();
                }
            });
    dialog.show();
}

1 Ответ

0 голосов
/ 11 июня 2018

Это можно сделать с помощью архитектуры публикации / подписки, в которой событие отправляется каждый раз, когда что-то меняется, и это событие, в свою очередь, будет транслироваться всем подписчикам.Взгляните на эту статью , объясняющую механизм.

Итак, в вашем коде у вас уже есть собственное местоположение, вам нужно опубликовать его для всех остальных пользователей.Все остальные пользователи получат ваши координаты, подписавшись на него.Следующим шагом является отображение местоположений разных пользователей, которые вы получили на карте, что вы уже сделали для своего местоположения.Просто измените его на маркеры карты для всех ваших разных друзей.
Это легко сделать с помощью некоторых PaaS, таких как Ably .Он может доставить ваше местоположение другим и наоборот в режиме реального времени.Так что практически нет задержек в отслеживании ваших друзей.Вы можете изменить местоположение для публикации с разными интервалами, например, 15 с, 1 мин или почасово.https://www.ably.io/documentation/realtime/channels-messages#message-subscription

...