0

ユーザーの正しい位置を取得し、それを HashMap に入れて別のレイアウトでルートを表示できる Android アプリケーションを作成しています。

とにかく私の質問は、場所が変更されたときに場所管理者が Google マップの場所を変更しないのはなぜですか、そのポイントが正しい位置に変更されるのを見ることができますが、カメラが離れないため、私の場所は画面の中央に表示されます画像 理由を教えてください。

計画では、地図上で行ったルートを表示して、古い位置から新しい位置への 1 つのポリラインが表示されるようにしますが、最初のカメラは正しい位置に移動します

これが私のコードです:

public class RunningActivity extends FragmentActivity implements LocationListener{

// GoogleMap for the screen
private GoogleMap runningMap;

private LocationManager lm;

// stop watch
private Chronometer mChronometer;

private double longitude,latitude;

Location lastLocationloc=null;

// start & stop the time
private long startTime,elapsedTime;
// to be used in timer
private boolean runningIsOn = false;    
private Thread timer;

Button start,stop;  
//saving position in a map
Map<Integer, RouteObject> map = new HashMap<Integer, RouteObject>();

@Override
protected void onCreate(Bundle savedInstanceState) {                        
    super.onCreate(savedInstanceState);

    if(isGooglePlay()){

        setContentView(R.layout.running);
        setupMap();
    }

    // Connect the chronometer to show the user his stopwatch                
    mChronometer = (Chronometer) findViewById(R.id.chronometer_running); 

    // Watch for button clicks.
    start = (Button)findViewById(R.id.startRunningBtn);
    start.setOnClickListener(mStartListener);

    stop = (Button)findViewById(R.id.stopRunningBtn);
    stop.setOnClickListener(mStopListener);

    runningMap.setMyLocationEnabled(true);
    runningMap.setOnMapLongClickListener(myOnMapLongClickListener);

    timer = new Thread(){

        public void run(){

            try{

                int count = 1;

                // While the user has not pressed the stop button
                while(runningIsOn){

                // Sleeps for 5 seconds
                sleep(5000);

                // Put the object in the map
                RouteObject object = new RouteObject(count,((double)System.nanoTime() / 1000000000.0), longitude,latitude);                 
                map.put(count,object);

                // count the objects to give them a name.
                count++;

                }                                                           
            }

            catch(InterruptedException e){

                e.printStackTrace();
            }

            // Write a test to the logcat
            RouteObject.getMap(map);                                             
        }                       
    };                                                           
}

OnMapLongClickListener myOnMapLongClickListener = new OnMapLongClickListener() {

    @Override
    public void onMapLongClick(LatLng point) {
        runningMap.addMarker(new MarkerOptions().position(point).title(
                point.toString()));

        Location myLocation = runningMap.getMyLocation();
        if (myLocation == null) {
            Toast.makeText(getApplicationContext(),
                    "My location not available", Toast.LENGTH_LONG).show();
        } else {
            PolylineOptions polylineOptions = new PolylineOptions();
            polylineOptions.add(point);
            polylineOptions.add(new LatLng(myLocation.getLatitude(),
                    myLocation.getLongitude()));
            runningMap.addPolyline(polylineOptions);
        }
    }

};



View.OnClickListener mStartListener = new OnClickListener() {
    public void onClick(View v) {

        // Starting the chronometer to be shown on user screen
        mChronometer.setBase(SystemClock.elapsedRealtime());
        mChronometer.start();
        // Starting the real timing to be used in database
        startTime = System.nanoTime();
        // Setting value, to be used in thread
        runningIsOn = true;
        // Starting the Thread
        timer.start();

        stop.setBackgroundResource(R.drawable.stopon);
        start.setBackgroundResource(R.drawable.recordpause);           
    }
};

View.OnClickListener mStopListener = new OnClickListener() {

    public void onClick(View v) {

        // thread should now be stopped
        runningIsOn = false;

        mChronometer.stop();

        stop.setBackgroundResource(R.drawable.stopoff);
        start.setBackgroundResource(R.drawable.recordon);

        elapsedTime = System.nanoTime() - startTime;

        // get the seconds
        double seconds = (double)elapsedTime / 1000000000.0;

        // Format the result with 4 decimals
        DecimalFormat df = new DecimalFormat("0.0000");

        // To the screen
        System.out.println("Elapsed time: "+ df.format(seconds));
        // To the database
        System.out.println("Elapsed time: "+ seconds);

        Toast.makeText(RunningActivity.this,df.format(seconds), Toast.LENGTH_LONG).show();


        Gson gson = new Gson();
        String list = gson.toJson(map); 
        Intent intent = new Intent(RunningActivity.this, RoutesActivity.class); 
        intent.putExtra("your_map", list);
        startActivity(intent);

    }
};

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if(item.getItemId() == R.id.action_legalnotices){

        startActivity(new Intent(this,LegalNoticesActivity.class));
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onLocationChanged(Location location) {

    runningMap.setMapType(4);

    if(lastLocationloc == null){

        lastLocationloc = location;
    }

    LatLng lastLatLng= locationToLatLng(lastLocationloc);
    LatLng thisLatLng= locationToLatLng(location);

    PolylineOptions polylineOptions = new PolylineOptions();
    polylineOptions.add(thisLatLng);
    polylineOptions.add(lastLatLng);
    runningMap.addPolyline(polylineOptions);

    lastLocationloc = location;

    LatLng latlng = new LatLng(location.getLatitude(),location.getLongitude());

    CameraUpdate center=CameraUpdateFactory.newLatLng(latlng);
    CameraUpdate zoom=CameraUpdateFactory.zoomTo(17);

    runningMap.moveCamera(center);
    runningMap.animateCamera(zoom);

    String message = String.format("Your new location found at: \n Longitude: %1$s \n Latitude: %2$s",location.getLongitude(), location.getLatitude());         
    Toast.makeText(RunningActivity.this, message, Toast.LENGTH_LONG).show();

    lm.removeUpdates(this);



}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub
    Toast.makeText(RunningActivity.this,"Provider disabled by the user. GPS turned off",Toast.LENGTH_LONG).show();
}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub
    Toast.makeText(RunningActivity.this,"Provider enabled by the user. GPS turned on",Toast.LENGTH_LONG).show();
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub
    Toast.makeText(RunningActivity.this,"Provider status changed",Toast.LENGTH_LONG).show();
}

private void setupMap() {

    if (runningMap == null) {

        runningMap = ((SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.running_map)).getMap();

        if (runningMap != null) {

            runningMap.setMyLocationEnabled(true);
            runningMap.animateCamera(CameraUpdateFactory.zoomBy(17));

            lm = (LocationManager) getSystemService(LOCATION_SERVICE);

            String provider = lm.getBestProvider(new Criteria(), true);

            if (provider == null) {

                // ask the user to turn on his gps
                onProviderDisabled(provider);
            }

            Location loc = lm.getLastKnownLocation(provider);

            if (loc != null) {

                onLocationChanged(loc);
            }


        }

    }
}

private boolean isGooglePlay(){

    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

    if(status == ConnectionResult.SUCCESS){

        return(true);
    }else{


        //Google Play services own error mesage
        //((Dialog)GooglePlayServicesUtil.getErrorDialog(status,this, 10)).show();
        Toast.makeText(this,"Google Play is not available", Toast.LENGTH_SHORT).show();     
    }

    return(false);

}

public static LatLng locationToLatLng(Location loc) {
    if(loc != null)
        return new LatLng(loc.getLatitude(), loc.getLongitude());
    return null;
}       

}

4

1 に答える 1

0

解決策はここにあります。アクティビティは、開始ボタンが押されると、最後の場所から新しい場所に行を書き込みます。これがコードです。コードは 5 秒ごとにポリラインを作成します。Google マップ アプリケーションを作成している場合は、それを使用できることを願っています。

public class RunningActivity extends FragmentActivity implements LocationListener, OnMyLocationChangeListener {
private GoogleMap map;
private LocationManager locationManager;

private static final long MIN_TIME = 5000;
private static final float MIN_DISTANCE = 5;

// stop watch
private Chronometer mChronometer;

private double longitude, latitude;

Location lastLocationloc = null;

// start & stop the time
private long startTime, elapsedTime;
// to be used in timer
private boolean runningIsOn = false;
private Thread timer;

Button start, stop;
// saving position in a map
Map<Integer, RouteObject> hashmap = new HashMap<Integer, RouteObject>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.running);
    map = ((SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.running_map)).getMap();

    map.setMapType(4);
    map.setMyLocationEnabled(true);
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    String provider = locationManager.getBestProvider(new Criteria(), true);
    locationManager.requestLocationUpdates(provider, MIN_TIME,
            MIN_DISTANCE, this);

    timer = new Thread() {

        public void run() {

            try {

                int count = 1;

                // While the user has not pressed the stop button
                while (runningIsOn) {

                    // Sleeps for 5 seconds
                    sleep(5000);

                    // Put the object in the map
                    RouteObject object = new RouteObject(count,
                            ((double) System.nanoTime() / 1000000000.0),
                            longitude, latitude);
                    hashmap.put(count, object);

                    // count the objects to give them a name.
                    count++;

                }
            }

            catch (InterruptedException e) {

                e.printStackTrace();
            }

            // Write a test to the logcat
            RouteObject.getMap(hashmap);
        }
    };

    // Connect the chronometer to show the user his stopwatch
    mChronometer = (Chronometer) findViewById(R.id.chronometer_running);

    // Watch for button clicks.
    start = (Button) findViewById(R.id.startRunningBtn);
    start.setOnClickListener(mStartListener);

    stop = (Button) findViewById(R.id.stopRunningBtn);
    stop.setOnClickListener(mStopListener);

    map.setOnMyLocationChangeListener(this);
}

View.OnClickListener mStartListener = new OnClickListener() {
    public void onClick(View v) {

        // Starting the chronometer to be shown on user screen
        mChronometer.setBase(SystemClock.elapsedRealtime());
        mChronometer.start();
        // Starting the real timing to be used in database
        startTime = System.nanoTime();
        // Setting value, to be used in thread
        runningIsOn = true;
        // Starting the Thread
        timer.start();

        stop.setBackgroundResource(R.drawable.stopon);
        start.setBackgroundResource(R.drawable.recordpause);
    }
};

View.OnClickListener mStopListener = new OnClickListener() {

    public void onClick(View v) {

        // thread should now be stopped
        runningIsOn = false;

        mChronometer.stop();

        stop.setBackgroundResource(R.drawable.stopoff);
        start.setBackgroundResource(R.drawable.recordon);

        elapsedTime = System.nanoTime() - startTime;

        // get the seconds
        double seconds = (double) elapsedTime / 1000000000.0;

        // Format the result with 4 decimals
        DecimalFormat df = new DecimalFormat("0.0000");

        // To the screen
        System.out.println("Elapsed time: " + df.format(seconds));
        // To the database
        System.out.println("Elapsed time: " + seconds);

        Toast.makeText(RunningActivity.this, df.format(seconds),
                Toast.LENGTH_LONG).show();

    }
};

@Override
public void onMyLocationChange(Location lastKnownLocation) {

    changeMapLocation(lastKnownLocation);
}

private void changeMapLocation(Location location) {

    if (lastLocationloc == null) {

        lastLocationloc = location;
    }

    LatLng lastLatLng = new LatLng(lastLocationloc.getLatitude(),lastLocationloc.getLongitude());
    LatLng thisLatLng = new LatLng(location.getLatitude(),location.getLongitude());

    // set variables for the hashmap
    longitude = location.getLongitude();
    latitude = location.getLatitude();

    if(runningIsOn) {

    map.addPolyline(new PolylineOptions()
     .add(thisLatLng,lastLatLng)
     .width(2)
     .color(Color.RED));

    }

    map.animateCamera(CameraUpdateFactory.newLatLngZoom(thisLatLng, 18),null);

    String old_message = String.format("My Old location: \n Longitude: %1$s \n Latitude: %2$s",lastLocationloc.getLongitude(),lastLocationloc.getLatitude());
    Toast.makeText(RunningActivity.this, old_message,Toast.LENGTH_LONG).show();

    String message = String.format("My new location: \n Longitude: %1$s \n Latitude: %2$s",location.getLongitude(),location.getLatitude());
    Toast.makeText(RunningActivity.this, message,Toast.LENGTH_LONG).show();

    lastLocationloc = location;

    locationManager.removeUpdates(this);
}

@Override
public void onLocationChanged(Location location) {

}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub
}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}

}

于 2013-05-07T05:35:58.660 に答える