Java 打开两次android时,Google地图活动无法运行?我的程序是如何获得多个标记之间的最近距离
我是谷歌android编程的开发者,现在我的项目是如何在谷歌地图上的多个标记之间获得最近的距离。当应用程序在编译后第一次运行时,它工作正常。但在我关闭应用程序并再次运行后,应用程序突然停止。 这是我的密码 MainActivity.javaJava 打开两次android时,Google地图活动无法运行?我的程序是如何获得多个标记之间的最近距离,java,android,eclipse,google-maps,Java,Android,Eclipse,Google Maps,我是谷歌android编程的开发者,现在我的项目是如何在谷歌地图上的多个标记之间获得最近的距离。当应用程序在编译后第一次运行时,它工作正常。但在我关闭应用程序并再次运行后,应用程序突然停止。 这是我的密码 MainActivity.java package com.example.dispel; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i
package com.example.dispel;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
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.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends FragmentActivity implements LocationListener {
GoogleMap googleMap;
ArrayList<LatLng> mMarkerPoints=null;
SupportMapFragment fm;
ImageView iv;
String atmhasil=null;
JSONArray jArray;
LocationManager locationManager;
String gps_mode=null;
Polyline poliline=null;
Boolean end_value;
LatLng dest;
Location location;
Byte status_location;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gpson();
// Getting Google Play availability status
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());
// Showing status
if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available
int requestCode = 10;
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
dialog.show();
}else { // Google Play Services are available
// Getting reference to the SupportMapFragment of activity_main.xml
fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
// Getting GoogleMap object from the fragment
//globalvariable ak= new globalvariable();
if(fm==null){
fm.setRetainInstance(true);
}else{
googleMap = fm.getMap();
}
// Enabling MyLocation Layer of Google Map
googleMap.setMyLocationEnabled(true);
// Getting LocationManager object from System Service LOCATION_SERVICE
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
// Creating a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Getting the name of the best provider
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 35000, 0, this);
String provider = locationManager.getBestProvider(criteria, true);
// Getting Current Location
location = locationManager.getLastKnownLocation(provider);
gps_mode="yes";
new download_database().execute("atm.php");
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
// Getting latitude of the current location
double latitude = location.getLatitude();
// Getting longitude of the current location
double longitude = location.getLongitude();
// Creating a LatLng object for the current location
LatLng latLng = new LatLng(latitude, longitude);
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
// Zoom in the Google Map
googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));
// Showing the current location in Google Map
// tvLocation.setText(latitude + " dan " + longitude);
if (gps_mode != null)
{
//poliline.remove();
//poliline=null;
choose_route csr= new choose_route(latLng, mMarkerPoints);
csr.execute();
/* try
{
String coba= csr.get();
//txtv.setText("" + coba + "");
} catch (Exception ex)
{
}
//TextView txtv= (TextView) findViewById(R.id.tv_location);
// String cob = csr.get();
String url = getDirectionsUrl(latLng, dest);
DirectionJsonPharser _distance= new DirectionJsonPharser();
txtv.setText(_distance.distance_count(url));
DownloadTask downloadTask = new DownloadTask();
// Start downloading json data from Google Directions API
downloadTask.execute(url);*/}
// Setting latitude and longitude in the TextView tv_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
}
/* (non-Javadoc)
* @see android.support.v4.app.FragmentActivity#onResume()
*/
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 20000, 0, this);
gps_mode="yes";
}
/* (non-Javadoc)
* @see android.support.v4.app.FragmentActivity#onStop()
*/
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
}
/* (non-Javadoc)
* @see android.support.v4.app.FragmentActivity#onDestroy()
*/
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
public void gpson(){
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
!lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
// Build the alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Informasi!");
builder.setMessage("Tolong Nyalakan GPS Anda.");
builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
// Show location settings when the user acknowledges the alert dialog
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
});
Dialog alertDialog = builder.create();
alertDialog.setCanceledOnTouchOutside(false);
alertDialog.show();}
}
public void callatm(){
globalvariable ak= new globalvariable();
atmhasil=ak.koneksi("atm.php","");
try{
jArray= new JSONArray(atmhasil);
JSONObject json_data=null;
for (int i=0;i< jArray.length();i++)
{
json_data=jArray.getJSONObject(i);
double lati= Double.parseDouble(json_data.getString("l1"));
double lang= Double.parseDouble(json_data.getString("l2"));
googleMap.addMarker(new MarkerOptions().position(new LatLng(lati, lang)).title(json_data.getString("nm")));
}
}catch(Exception ex){
}
}
private String getDirectionsUrl(LatLng origin,LatLng dest){
// Origin of route
String str_origin = "origin="+origin.latitude+","+origin.longitude;
// Destination of route
String str_dest = "destination="+dest.latitude+","+dest.longitude;
// Sensor enabled
String sensor = "sensor=false";
// Building the parameters to the web service
String parameters = str_origin+"&"+str_dest+"&"+sensor;
// Output format
String output = "json";
// Building the url to the web service
String url = "https://maps.googleapis.com/maps/api/directions/"+output+"?"+parameters;
return url;
}
private class DownloadTask extends AsyncTask<String, Void, String>{
// Downloading data in non-ui thread
@Override
protected String doInBackground(String... url) {
// For storing data from web service
String data = "";
try{
// Fetching the data from web service
data = downloadUrl(url[0]);
}catch(Exception e){
Log.d("Background Task",e.toString());
}
return data;
}
// Executes in UI thread, after the execution of
// doInBackground()
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
ParserTask parserTask = new ParserTask();
// Invokes the thread for parsing the JSON data
parserTask.execute(result);
}
}
private String downloadUrl(String strUrl) throws IOException{
String data = "";
InputStream iStream = null;
HttpURLConnection urlConnection = null;
try{
URL url = new URL(strUrl);
// Creating an http connection to communicate with url
urlConnection = (HttpURLConnection) url.openConnection();
// Connecting to url
urlConnection.connect();
// Reading data from url
iStream = urlConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(iStream));
StringBuffer sb = new StringBuffer();
String line = "";
while( ( line = br.readLine()) != null){
sb.append(line);
}
data = sb.toString();
br.close();
}catch(Exception e){
Log.d("Exception while downloading url", e.toString());
}finally{
iStream.close();
urlConnection.disconnect();
}
return data;
}
private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>> >{
// Parsing the data in non-ui thread
@Override
protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {
JSONObject jObject;
List<List<HashMap<String, String>>> routes = null;
try{
jObject = new JSONObject(jsonData[0]);
DirectionJsonPharser parser = new DirectionJsonPharser();
// Starts parsing data
routes = parser.parse(jObject);
}catch(Exception e){
e.printStackTrace();
}
return routes;
}
// Executes in UI thread, after the parsing process
@Override
protected void onPostExecute(List<List<HashMap<String, String>>> result) {
ArrayList<LatLng> points = null;
PolylineOptions lineOptions = null;
if(poliline != null)
{
poliline.remove();
poliline=null;
}
// Traversing through all the routes
for(int i=0;i<result.size();i++){
points = new ArrayList<LatLng>();
lineOptions = new PolylineOptions();
// Fetching i-th route
List<HashMap<String, String>> path = result.get(i);
// Fetching all the points in i-th route
for(int j=0;j<path.size();j++){
HashMap<String,String> point = path.get(j);
double lat = Double.parseDouble(point.get("lat"));
double lng = Double.parseDouble(point.get("lng"));
LatLng position = new LatLng(lat, lng);
points.add(position);
}
// Adding all the points in the route to LineOptions
lineOptions.addAll(points);
lineOptions.width(5);
lineOptions.color(Color.RED);
}
// Drawing polyline in the Google Map for the i-th route
//googleMap.addPolyline(lineOptions);
poliline= googleMap.addPolyline(lineOptions);
}
}
// Async Data atm
private class download_database extends AsyncTask<String, Void, String>{
/* (non-Javadoc)
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
globalvariable ak= new globalvariable();
atmhasil=ak.koneksi(params[0],"");
return atmhasil;
}
/* (non-Javadoc)
* @see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
try{
jArray= new JSONArray(result);
JSONObject json_data=null;
mMarkerPoints= new ArrayList<LatLng>();
for (int i=0;i< jArray.length();i++)
{
json_data=jArray.getJSONObject(i);
double lati= Double.parseDouble(json_data.getString("l1"));
//tvloc.setText(""+ lati + "" );
double lang= Double.parseDouble(json_data.getString("l2"));
googleMap.addMarker(new MarkerOptions().position(new LatLng(lati, lang)).title(json_data.getString("nm")));
mMarkerPoints.add(new LatLng(lati, lang));
}
if(location!=null){
onLocationChanged(location);
}
}catch(Exception ex){
}
}
/* (non-Javadoc)
* @see android.os.AsyncTask#onPreExecute()
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
}
private class choose_route extends AsyncTask<ArrayList<LatLng>, Void, String>{
/* (non-Javadoc)
* @see android.os.AsyncTask#doInBackground(Params[])
*/
LatLng firs_point;
ArrayList<LatLng> atm_sync;
public choose_route(LatLng firs_point, ArrayList<LatLng> atm_sync){
this.firs_point=firs_point;
this.atm_sync=atm_sync;
}
@Override
protected String doInBackground(ArrayList<LatLng>... params) {
// TODO Auto-generated method stub
ArrayList<LatLng> atmarray= new ArrayList<LatLng>();
atmarray=atm_sync;
final Integer[] idx=new Integer[atmarray.size()] ;
final double[] data=new double[atmarray.size()] ;
for (int i=0; i< atmarray.size();i++)
{
/*DirectionJsonPharser _distance= new DirectionJsonPharser();
String url = getDirectionsUrl(firs_point, atmarray.get(i) );*/
//txtv.setText(_distance.distance_count(url));
idx[i]=i;
data[i]=(double) distance_AtoB(firs_point, atmarray.get(i));
/* data[i]= Double.parseDouble(_distance.distance_count(url));*/
}
Arrays.sort(idx, new Comparator<Integer>() {
@Override public int compare(final Integer o1, final Integer o2) {
return Double.compare(data[o1], data[o2]);
}
});
globalvariable ak= new globalvariable();
//Toast.makeText(getApplicationContext(), idx[0], Toast.LENGTH_SHORT).show();
atmhasil=ak.koneksi("atm.php","" + idx[0] + "");
return atmhasil ;
}
/* (non-Javadoc)
* @see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
try{
jArray= new JSONArray(result);
JSONObject json_data=null;
for (int i=0;i< jArray.length();i++)
{
json_data=jArray.getJSONObject(i);
double lati= Double.parseDouble(json_data.getString("l1"));
double lang= Double.parseDouble(json_data.getString("l2"));
googleMap.addMarker(new MarkerOptions().position(new LatLng(lati, lang)).title(json_data.getString("nm")));
dest= new LatLng(lati, lang);
}
TextView txtv= (TextView) findViewById(R.id.tv_location);
String url = getDirectionsUrl(firs_point, dest);
DownloadTask downloadTask = new DownloadTask();
// Start downloading json data from Google Directions API
downloadTask.execute(url);
}catch(Exception ex){
/* TextView txtv= (TextView) findViewById(R.id.tv_location);
txtv.setText("" + ex.toString() +"");*/
}
}
/* (non-Javadoc)
* @see android.os.AsyncTask#onPreExecute()
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
}
private float distance_AtoB(LatLng Apoint,LatLng Bpoint){
Location locationA = new Location("point A");
locationA.setLatitude(Apoint.latitude);
locationA.setLongitude(Apoint.longitude);
Location locationB = new Location("point B");
locationB.setLatitude(Bpoint.latitude);
locationB.setLongitude(Bpoint.longitude);
float distance_point = locationA.distanceTo(locationB);
return distance_point;
}
/* (non-Javadoc)
* @see android.support.v4.app.FragmentActivity#onKeyDown(int, android.view.KeyEvent)
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK)
{
//do whatever you want the 'Back' button to do
//as an example the 'Back' button is set to start a new Activity named 'NewActivity'
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Intent inte= new Intent(this,Log_in.class);
startActivity(inte);
finish();
}
return true;
}
}
当发生错误时,您可以发布日志猫吗?@Lal是的,我的问题中包括了我的日志猫。请帮帮我……:'MainActivity中第516行是什么?@Lal final Integer[]idx=新整数[atmarray.size];检查516行之前是否有atmarray.size的值
05-11 15:23:46.050: W/dalvikvm(11959): threadid=29: thread exiting with uncaught exception (group=0x4001e578)
05-11 15:23:46.060: E/AndroidRuntime(11959): FATAL EXCEPTION: AsyncTask #5
05-11 15:23:46.060: E/AndroidRuntime(11959): java.lang.RuntimeException: An error occured while executing doInBackground()
05-11 15:23:46.060: E/AndroidRuntime(11959): at android.os.AsyncTask$3.done(AsyncTask.java:200)
05-11 15:23:46.060: E/AndroidRuntime(11959): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
05-11 15:23:46.060: E/AndroidRuntime(11959): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
05-11 15:23:46.060: E/AndroidRuntime(11959): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
05-11 15:23:46.060: E/AndroidRuntime(11959): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
05-11 15:23:46.060: E/AndroidRuntime(11959): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
05-11 15:23:46.060: E/AndroidRuntime(11959): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
05-11 15:23:46.060: E/AndroidRuntime(11959): at java.lang.Thread.run(Thread.java:1019)
05-11 15:23:46.060: E/AndroidRuntime(11959): Caused by: java.lang.NullPointerException
05-11 15:23:46.060: E/AndroidRuntime(11959): at com.example.dispel.MainActivity$choose_route.doInBackground(MainActivity.java:516)
05-11 15:23:46.060: E/AndroidRuntime(11959): at com.example.dispel.MainActivity$choose_route.doInBackground(MainActivity.java:1)
05-11 15:23:46.060: E/AndroidRuntime(11959): at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-11 15:23:46.060: E/AndroidRuntime(11959): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
05-11 15:23:46.060: E/AndroidRuntime(11959): ... 4 more