如何扩展地图活动代码以根据设备ID或登录凭据和Android Studio中的GPS位置跟踪另一台设备的位置



My MapActivity.java 显示我的设备的位置以及时间戳,我正在创建显示丢失或被盗手机位置的应用程序,并且我的应用程序已预安装并登录并成功设置。那么,我如何使用该设备的电话ID,GPS位置及其登录凭据(mob no,电子邮件和密码)在手机的活动地图上显示其位置???

请帮我解决问题。

我的地图活动.java

package com.skynet.fs5;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
 import android.support.v7.widget.Toolbar;
 import android.util.Log;
 import android.view.View;
 import android.widget.Button;
import android.widget.TextView;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.maps.android.ui.IconGenerator;
import java.text.DateFormat;
import java.util.Date;
 public class MapActivity extends FragmentActivity implements
 LocationListener,
 GoogleApiClient.ConnectionCallbacks,
 GoogleApiClient.OnConnectionFailedListener {
 private static final String TAG = "LocationActivity";
 private static final long INTERVAL = 1000 * 60 * 1; //1 minute
 private static final long FASTEST_INTERVAL = 1000 * 60 * 1; // 1 minute
 Button btnFusedLocation;
 TextView tvLocation;
 LocationRequest mLocationRequest;
 GoogleApiClient mGoogleApiClient;
 Location mCurrentLocation;
 String mLastUpdateTime;
 GoogleMap googleMap;
  private Toolbar mToolbar;
 protected void createLocationRequest() {
 mLocationRequest = new LocationRequest();
 mLocationRequest.setInterval(INTERVAL);
 mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
 mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
 }
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Log.d(TAG, "onCreate ...............................");
 //show error dialog if GoolglePlayServices not available
 if (!isGooglePlayServicesAvailable()) {
 finish();
 }
 createLocationRequest();
 mGoogleApiClient = new GoogleApiClient.Builder(this)
 .addApi(LocationServices.API)
 .addConnectionCallbacks(this)
 .addOnConnectionFailedListener(this)
 .build();
  assert getActionBar()!=null;
  mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    finish();
   }
  });
 setContentView(R.layout.settings);
 SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager()
 .findFragmentById(R.id.map);
 googleMap = fm.getMap();
 googleMap.getUiSettings().setZoomControlsEnabled(true);

 }
 @Override
 public void onStart() {
 super.onStart();
 Log.d(TAG, "onStart fired ..............");
 mGoogleApiClient.connect();
 }
 @Override
 public void onStop() {
 super.onStop();
 Log.d(TAG, "onStop fired ..............");
 mGoogleApiClient.disconnect();
 Log.d(TAG, "isConnected ...............: " + mGoogleApiClient.isConnected());
 }
 private boolean isGooglePlayServicesAvailable() {
 int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
 if (ConnectionResult.SUCCESS == status) {
 return true;
 } else {
 GooglePlayServicesUtil.getErrorDialog(status, this, 0).show();
 return false;
 }
 }
 @Override
 public void onConnected(Bundle bundle) {
 Log.d(TAG, "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected());
 startLocationUpdates();
 }
 protected void startLocationUpdates() {
 PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
 mGoogleApiClient, mLocationRequest, this);
 Log.d(TAG, "Location update started ..............: ");
 }
 @Override
 public void onConnectionSuspended(int i) {
 }
 @Override
 public void onConnectionFailed(ConnectionResult connectionResult) {
 Log.d(TAG, "Connection failed: " + connectionResult.toString());
 }
 @Override
 public void onLocationChanged(Location location) {
 Log.d(TAG, "Firing onLocationChanged..............................................");
 mCurrentLocation = location;
 mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
 addMarker();
 }
 private void addMarker() {
 MarkerOptions options = new MarkerOptions();
 // following four lines requires 'Google Maps Android API Utility Library'
 // https://developers.google.com/maps/documentation/android/utility/
 // I have used this to display the time as title for location markers
 // you can safely comment the following four lines but for this info
 IconGenerator iconFactory = new IconGenerator(this);
 iconFactory.setStyle(IconGenerator.STYLE_PURPLE);
 options.icon(BitmapDescriptorFactory.fromBitmap(iconFactory.makeIcon(mLastUpdateTime)));
 options.anchor(iconFactory.getAnchorU(), iconFactory.getAnchorV());
 LatLng currentLatLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
 options.position(currentLatLng);
 Marker mapMarker = googleMap.addMarker(options);
 long atTime = mCurrentLocation.getTime();
 mLastUpdateTime = DateFormat.getTimeInstance().format(new Date(atTime));
 mapMarker.setTitle(mLastUpdateTime);
 Log.d(TAG, "Marker added.............................");
 googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng,
 13));
 Log.d(TAG, "Zoom done.............................");
 }
 @Override
 protected void onPause() {
 super.onPause();
 stopLocationUpdates();
 }
 protected void stopLocationUpdates() {
 LocationServices.FusedLocationApi.removeLocationUpdates(
 mGoogleApiClient, this);
 Log.d(TAG, "Location update stopped .......................");
 }
 @Override
 public void onResume() {
 super.onResume();
 if (mGoogleApiClient.isConnected()) {
 startLocationUpdates();
 Log.d(TAG, "Location update resumed .....................");
 }
 }
 }

及其布局 xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <include android:id="@+id/toolbar_actionbar" layout="@layout/toolbar_settings"
        android:layout_width="match_parent" android:layout_height="wrap_content" />
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    tools:context="com.skynet.fs5.MapsActivity" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="bottom"
        android:orientation="vertical">

    </LinearLayout>
</RelativeLayout>

上述代码的最终输出输出上述代码,其中包含最后一个位置的时间戳

首先,这是一个非常广泛的问题,所以我能想到的最多是一个非常广泛的答案。

根据您的代码,我可以看到您已经弄清楚了如何获取用户的位置,因此第一步已经完成。接下来需要的步骤如下:

1. 创建凭证数据库

如果要要求用户名和密码,则需要将此信息存储在数据库中。关于Stack Overflow以及互联网上有大量关于如何(安全地)创建这样一个数据库以及如何(安全地)验证这些数据的信息。

2.在两个设备之间建立连接

这可以通过多种方法实现。一种方法是设置一个套接字以将数据传输到接收设备,这将需要接收设备侦听传入的连接。这将允许您将数据(例如位置)从一台设备传播到另一台设备。如果此解决方案适合您的需求,我强烈建议您阅读有关Android中套接字的文档以获取更多信息。

最新更新