我仍在掌握Android,并尝试制作一个应用程序,该应用程序将在Google地图上绘制我骑自行车的路径。我已经成功显示了地图,可以使用以下代码在两个坐标之间绘制一条简单的折线:
//Draws a thin red line from London to New York.
Polyline line = googlemap.addPolyline(new PolylineOptions()
.add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0))
.width(5)
.color(Color.RED));
我尝试创建一段位于"LocationChanged"方法中的代码,我假设每次位置更改时都会调用该方法,并在打开应用程序后立即开始执行此操作(方法位于代码底部)。它采用当前位置坐标和以前的当前位置坐标,并在它们之间绘制一条折线。
我已经在位置更改方法中添加了一个 toast,所以我可以看到它何时运行,但是它永远不会显示,所以我想代码中更高的位置出了问题,它没有被运行/调用。
(我已经用GPS信号在户外测试了该应用程序,但它没有画线)(应用运行没有错误,但不会画线)
我正在寻找一些帮助来让应用程序划清界限,任何帮助将不胜感激。
这是我的 java 类文件内容:
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.Projection;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapController;
import com.google.android.maps.Overlay;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.RectF;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Calendar;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.app.Activity;
import android.view.View;
import android.widget.TextView;
public class Record_screen_activity extends FragmentActivity implements
LocationListener, OnClickListener {
GoogleMap googlemap, draw;
Location currentLocation;
Location myLocation2;
Button sqlUpdate, sqlView, sqlModify, sqlLoad, sqlDelete, startChrono, pauseChrono;
EditText sqlNotes, sqlRouteName, sqlLocation, sqlRow;
TextView sqlDate;
Chronometer sqlChrono;
long time = 0;
int drawing = 1;
//add above here ===========================================================
// above I am declaring the references that I will use in this file they are
// linked below to the
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.record_screen); // Names the layout file which
// is linked to this activity
startChrono = (Button) findViewById(R.id.b_Start);
pauseChrono = (Button) findViewById(R.id.b_Pause);
startChrono.setOnClickListener(this);
pauseChrono.setOnClickListener(this);
sqlUpdate = (Button) findViewById(R.id.bSQL_Update);
sqlRouteName = (EditText) findViewById(R.id.etSQL_RouteName);
sqlLocation = (EditText) findViewById(R.id.etSQL_Location);
sqlNotes = (EditText) findViewById(R.id.etSQL_Notes);
sqlChrono = (Chronometer) findViewById(R.id.c_Timer);
sqlDate = (TextView) findViewById(R.id.tv_Date);
//add above here ===========================================================
// the above lines link the buttons and EditText fields from the xml
// Layout file to the references stated at the top of this file
sqlView = (Button) findViewById(R.id.bSQL_View);
sqlView.setOnClickListener(this);
sqlUpdate.setOnClickListener(this);
sqlRow = (EditText) findViewById(R.id.etSQL_Rowid);
sqlModify = (Button) findViewById(R.id.bSQL_Modify);
sqlLoad = (Button) findViewById(R.id.bSQL_Load);
sqlDelete = (Button) findViewById(R.id.bSQL_Delete);
// above references link buttons and tv's to the actual buttons and tv's
// in th xml file
sqlModify.setOnClickListener(this);
sqlLoad.setOnClickListener(this);
sqlDelete.setOnClickListener(this);
SupportMapFragment mf = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.mvMain);
googlemap = mf.getMap();
googlemap.setMyLocationEnabled(true);
googlemap.setMapType(GoogleMap.MAP_TYPE_TERRAIN); // map tiles type can
// be changed here
// i.e. to satalite
// view
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
Location location = locationManager
.getLastKnownLocation(locationManager.getBestProvider(criteria,
false));
if (location != null) {
googlemap
.animateCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(location.getLatitude(), location
.getLongitude()), 13));
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(location.getLatitude(), location
.getLongitude())) // Sets the center of the map to
// location user
.zoom(17) // Sets the zoom
.bearing(0) // Sets the orientation of the camera to east
.tilt(0) // Sets the tilt of the camera to 30 degrees
.build(); // Creates a CameraPosition from the builder
googlemap.animateCamera(CameraUpdateFactory
.newCameraPosition(cameraPosition));
currentLocation = location;
}
// Add a thin red line from London to New York.
// Polyline line = googlemap.addPolyline(new PolylineOptions()
// .add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0))
// .width(5)
//.color(Color.RED));
// Add a thin red line from London to New York.
//setting the date
int yy;
int mm;;
int dd;
final Calendar c = Calendar.getInstance();
yy = c.get(Calendar.YEAR);
mm = c.get(Calendar.MONTH);
dd = c.get(Calendar.DAY_OF_MONTH);
// set current date into textview
sqlDate.setText(new StringBuilder()
// Month is 0 based, just add 1
.append(dd).append("").append("/").append(mm + 1).append("/")
.append(yy));
}
public void onClick(View arg0) {
switch(arg0.getId()){
case R.id.b_Start:
sqlChrono.setBase(SystemClock.elapsedRealtime() + time); //mabe get rid of nanos
sqlChrono.start();
Dialog d = new Dialog(this);
d.setTitle("Route Now Recording"); // sets the dialog box with
// success message
TextView tv = new TextView(this);
tv.setText("Please Lock your Screen");
d.setContentView(tv);
d.show();
//sets these variables before the loop is run
break;
case R.id.b_Pause:
time = sqlChrono.getBase() - SystemClock.elapsedRealtime();
sqlChrono.stop();
drawing = 1;
break;
}
// ===============================================
// ================Update(save) button============
// ===============================================
switch (arg0.getId()) {
case R.id.bSQL_Update:
boolean didItWork = true;
try {
String routename = sqlRouteName.getText().toString();
String location = sqlLocation.getText().toString();
String notes = sqlNotes.getText().toString();
String chrono = sqlChrono.getText().toString();
String date = sqlDate.getText().toString();
//add above here ===========================================================
SQL_management_activity entry = new SQL_management_activity(
Record_screen_activity.this);
entry.open();
entry.createEntry(routename, location, notes, chrono, date);
//add above here ===========================================================
entry.close();
} catch (Exception e) {
didItWork = false;
String error = e.toString();// the error string will be printed
// to the dialog box to display the
// error code to the user
Dialog d = new Dialog(this);
d.setTitle("Error ohh no..."); // sets the diaog box with
// success mesasge
TextView tv = new TextView(this);
tv.setText(error);
d.setContentView(tv);
d.show();
} finally {
if (didItWork) {
// didItWork = true;
Dialog d = new Dialog(this);
d.setTitle("Saving Route"); // sets the diaog box with
// success mesasge
TextView tv = new TextView(this);
tv.setText("Status: Success");
d.setContentView(tv);
d.show();
Thread timer = new Thread() { // this is the same timer as
// on the spalshcren
public void run() { // it automaticaly moves to the
// review page after 500 miliseconds
try {
sleep(1000); // duration the splash screen is
// displayed for
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//Intent openMain_menu = new Intent(
// "com.hew235.mapapp.REVIEW_SCREEN_ACTIVITY");
// startActivity(openMain_menu);
}
}
};
timer.start();
}
}
break;
// ===============================================
// ==================View button================== the end of tutorial
// 18 will help make a main menu button
// ===============================================
case R.id.bSQL_View: // opens the view page
Intent i = new Intent("com.hew235.mapapp.REVIEW_SCREEN_ACTIVITY");
startActivity(i);
break;
// ===============================================
// ==================Load button==================
// ===============================================
case R.id.bSQL_Load:
boolean didItWork2 = true;
try {
String s = sqlRow.getText().toString();// this string will
// return whatever is in
// the edit text
long l = Long.parseLong(s);// converts whatever is in the above
// string into a long type variable
SQL_management_activity sma = new SQL_management_activity(this);
sma.open();
String returnedRoutename = sma.getRoutename(l);// method
String returnedLocation = sma.getLocation(l);// method
String returnedNotes = sma.getNotes(l);// method
String returnedChrono = sma.getChrono(l);// method
String returnedDate = sma.getDate(l);// method
//add above here ===========================================================
sma.close();
sqlRouteName.setText(returnedRoutename);
sqlLocation.setText(returnedLocation);
sqlNotes.setText(returnedNotes);
sqlChrono.setText(returnedChrono);
sqlDate.setText(returnedDate);
//add above here ===========================================================
} catch (Exception e) {
didItWork2 = false;
String error = e.toString();// the error string will be printed
// to the dialog box to display the
// error code to the user
Dialog d = new Dialog(this);
d.setTitle("Error ohh no..."); // sets the diaog box with
// success mesasge
TextView tv = new TextView(this);
tv.setText(error);
d.setContentView(tv);
d.show();
} finally {
if (didItWork2) {
// didItWork = true;
Dialog d = new Dialog(this);
d.setTitle("Loading Data"); // sets the diaog box with
// success mesasge
TextView tv = new TextView(this);
tv.setText("Status: Success");
d.setContentView(tv);
d.show();
}
}
break;
// ===============================================
// ==================Modify button================
// ===============================================
case R.id.bSQL_Modify:
boolean didItWork4 = true;
try {
String sRow = sqlRow.getText().toString();
String mRoutename = sqlRouteName.getText().toString();
String mLocation = sqlLocation.getText().toString();
String mNotes = sqlNotes.getText().toString();
String mChrono = sqlChrono.getText().toString();
String mDate = sqlDate.getText().toString();
//add above here ===========================================================
long lRow = Long.parseLong(sRow);
SQL_management_activity ex = new SQL_management_activity(this);
ex.open();
ex.updateEntry(lRow, mRoutename, mLocation, mNotes, mChrono, mDate); // these are the
// fields that
// are being
// updated
//add above here ===========================================================
ex.close();
} catch (Exception e) {
didItWork4 = false;
String error = e.toString();// the error string will be printed
// to the dialog box to display the
// error code to the user
Dialog d = new Dialog(this);
d.setTitle("Error ohh no..."); // sets the diaog box with
// success mesasge
TextView tv = new TextView(this);
tv.setText(error);
d.setContentView(tv);
d.show();
} finally {
if (didItWork4) {
// didItWork = true;
Dialog d = new Dialog(this);
d.setTitle("Modifying Record"); // sets the diaog box with
// success mesasge
TextView tv = new TextView(this);
tv.setText("Status: Success");
d.setContentView(tv);
d.show();
Thread timer = new Thread() { // this is the same timer as//
// on the spalshcren
public void run() { // it automaticaly moves to the//
// review page after 500 miliseconds
try {
sleep(1200); // duration the splash screen is//
// displayed for
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
Intent openMain_menu = new Intent(
"com.hew235.mapapp.REVIEW_SCREEN_ACTIVITY");
startActivity(openMain_menu);
}
}
};
timer.start();
}
}
break;
// ===============================================
// ==================Delete button================
// ===============================================
case R.id.bSQL_Delete:
boolean didItWork3 = true;
try {
String sRow1 = sqlRow.getText().toString();
long lRow1 = Long.parseLong(sRow1);
SQL_management_activity ex1 = new SQL_management_activity(this);
ex1.open();
ex1.deleteEntry(lRow1);
ex1.close();
} catch (Exception e) {
didItWork3 = false;
String error = e.toString();// the error string will be printed
// to the dialog box to display the
// error code to the user
Dialog d = new Dialog(this);
d.setTitle("Error ohh no..."); // sets the diaog box with
// success mesasge
TextView tv = new TextView(this);
tv.setText(error);
d.setContentView(tv);
d.show();
} finally {
if (didItWork3) {
// didItWork = true;
Dialog d = new Dialog(this);
d.setTitle("Deleting Record"); // sets the diaog box with
// success mesasge
TextView tv = new TextView(this);
tv.setText("Status: Success");
d.setContentView(tv);
d.show();
Thread timer = new Thread() { // this is the same timer as
// on the spalshcren
public void run() { // it automaticaly moves to the
// review page after 500 miliseconds
try {
sleep(1200); // duration the splash screen is
// displayed for
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
Intent openMain_menu = new Intent(
"com.hew235.mapapp.REVIEW_SCREEN_ACTIVITY");
startActivity(openMain_menu);
}
}
};
timer.start();
}
}
break;
}
}
private static MapController getController() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.map1_screen_activity, menu);
GoogleMap map;
return true;
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
Context context = getApplicationContext();
CharSequence text = "Hello toast! r u hungry";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
Location location1 = locationManager
.getLastKnownLocation(locationManager.getBestProvider(criteria,
false));
if (location1 != null) {
googlemap
.animateCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(location1.getLatitude(), location1
.getLongitude()), 13));
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(location1.getLatitude(), location1
.getLongitude())) // Sets the center of the map to
// location user
.zoom(17) // Sets the zoom
.bearing(0) // Sets the orientation of the camera to east
.tilt(0) // Sets the tilt of the camera to 30 degrees
.build(); // Creates a CameraPosition from the builder
googlemap.animateCamera(CameraUpdateFactory
.newCameraPosition(cameraPosition));
location1 = currentLocation;
}
currentLocation = myLocation2;
Polyline line = googlemap.addPolyline(new PolylineOptions()
.add(new LatLng (myLocation2.getLatitude(), myLocation2
.getLongitude()),
new LatLng (currentLocation.getLatitude(), currentLocation
.getLongitude()))
.width(5)
.color(Color.RED));
currentLocation = myLocation2; //sets the location variables ready for the lines to join the dots
}
@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
Context context = getApplicationContext();
CharSequence text = "status changed";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
}
我没有阅读过你所有的代码,但是这部分,你应该打印你的行,让我感到困惑:
currentLocation = myLocation2;
Polyline line = googlemap.addPolyline(new PolylineOptions()
.add(new LatLng (myLocation2.getLatitude(), myLocation2.getLongitude()), new LatLng (currentLocation.getLatitude(), currentLocation.getLongitude())).width(5)
.color(Color.RED));
currentLocation = myLocation2; //sets the location variables ready for the lines to join the dots
为什么要将折线从 X 绘制到 X? 这可能会导致一条空线,因此根本没有线。尝试绘制从 X 到 Y 的线。