如何跟踪朋友的位置?

时间:2018-05-20 08:39:22

标签: java android gps real-time

我是这个领域的新手,我正在尝试使用“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 :(得分:3)

这可以使用发布/订阅架构来完成,使用该架构每次发生变化时都会推送事件,并且此事件将被广播给所有订户。看一下this article,解释一下这个机制。

所以在你的代码中你已经有了自己的位置,你需要将它发布给所有其他用户。所有其他用户将通过订阅来获取您的坐标。下一步是绘制您在地图上获得的不同用户的位置,您已经为自己的位置做了这些位置。只需将其更改为映射所有不同朋友的标记即可 使用像Ably这样的PaaS可以轻松完成此操作。它可以实时将您的位置传递给其他人,反之亦然。所以跟踪你的朋友几乎没有延迟。您可以更改为以不同的间隔发布位置,例如15秒,1分钟或每小时。 https://www.ably.io/documentation/realtime/channels-messages#message-subscription