Google API Android 上的地图不接受纬度和经度值?
Google Maps API on Android not accepting Lat and Long values?
所以我想访问远程 mySQL 数据库并访问存储在那里的纬度和经度坐标。我写了一个 config.php 和 fetch.php,使用 JSON 获取数据,在这个脚本中,latVal 和 longVal 值没有在 onMapReady() 方法中加载(它们是空白的) ,而它们在 getJSON() 方法中包含准确的值。为什么会这样?
代码:
package com.rageking.xyber.dashboardtest;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.telecom.Connection;
import android.view.View;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.*;
import java.util.HashMap;
import com.google.android.gms.common.api.Response;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import org.json.JSONException;
import org.json.JSONObject;
public class ChildTrackerPage extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
ConnectionHTTP myCon = new ConnectionHTTP();
String latVal, longVal;
double latNum, longNum;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_child_tracker_page);
getJSON("http://webgax.com/schoolapp/fetch.php");
// 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);
}
public void goToMenu(View view) {
Intent i1 = new Intent(this, UserHome.class);
startActivity(i1);
}
private void getJSON(final String urlWebService) {
class GetJSON extends AsyncTask<String, Void, String> {
@Override
public void onPreExecute() {
super.onPreExecute();
}
@Override
public void onPostExecute(String s) {
super.onPostExecute(s);
//Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show();
try {
JSONObject jsonObject = new JSONObject(s);
longVal = jsonObject.getString("lat");
latVal = jsonObject.getString("lng");
//Toast.makeText(getApplicationContext(),longVal, Toast.LENGTH_SHORT).show();
//Toast.makeText(getApplicationContext(),latVal,Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public String doInBackground(String... strings) {
HashMap<String,String> hashMap=new HashMap<>();
return myCon.postRequest(hashMap, "http://webgax.com/schoolapp/fetch.php");
}
}
GetJSON getJSON = new GetJSON();
getJSON.execute();
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
//latNum =Double.parseDouble(latVal);
//longNum = Double.parseDouble(longVal);
//latNum = Double.valueOf(latVal);
//longNum = Double.valueOf(longVal);
Toast.makeText(getApplicationContext(),latVal,Toast.LENGTH_LONG).show();
//Toast.makeText(getApplicationContext(),longVal,Toast.LENGTH_LONG).show();
LatLng addr = new LatLng(22, 88);
float zoomLevel = 16; //This goes up to 21
mMap.addMarker(new MarkerOptions().position(addr).title("WebGax"));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(addr, zoomLevel));
}
}
如评论中所述,您应该在地图准备好更新后尝试更新地图...
使用您的初始代码,您之前调用了 AsyncTask,这取决于服务器的响应时间,当您具有纬度和经度值时,地图可能会准备好或没有准备好。
检查下面我的建议,我只是从 onCreate 调用中删除对您的异步任务的调用,并将其移动到地图准备好接收数据之后。
public class ChildTrackerPage extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
private ConnectionHTTP myCon = new ConnectionHTTP();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_child_tracker_page);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
public void goToMenu(View view) {
Intent i1 = new Intent(this, UserHome.class);
startActivity(i1);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
GetJSON getJSON = new GetJSON();
getJSON.execute();
}
private class GetJSON extends AsyncTask<String, Void, String> {
@Override
public String doInBackground(String... strings) {
HashMap<String,String> hashMap=new HashMap<>();
return myCon.postRequest(hashMap, "http://webgax.com/schoolapp/fetch.php");
}
@Override
public void onPostExecute(String s) {
JSONObject jsonObject = new JSONObject(s);
//I'm not sure why you do that instead of just using optDouble on your JSON but I don't know the contect of your JSON
String longVal = jsonObject.getString("lat");
String latVal = jsonObject.getString("lng");
double latNum = Double.parseDouble(latVal);
double longNum = Double.parseDouble(longVal);
LatLng addr = new LatLng(latNum, longNum);
float zoomLevel = 16; //This goes up to 21
if(mMap!=null){
mMap.addMarker(new MarkerOptions().position(addr).title("WebGax"));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(addr, zoomLevel));
}
}
}
}
所以我想访问远程 mySQL 数据库并访问存储在那里的纬度和经度坐标。我写了一个 config.php 和 fetch.php,使用 JSON 获取数据,在这个脚本中,latVal 和 longVal 值没有在 onMapReady() 方法中加载(它们是空白的) ,而它们在 getJSON() 方法中包含准确的值。为什么会这样?
代码:
package com.rageking.xyber.dashboardtest;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.telecom.Connection;
import android.view.View;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.*;
import java.util.HashMap;
import com.google.android.gms.common.api.Response;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import org.json.JSONException;
import org.json.JSONObject;
public class ChildTrackerPage extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
ConnectionHTTP myCon = new ConnectionHTTP();
String latVal, longVal;
double latNum, longNum;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_child_tracker_page);
getJSON("http://webgax.com/schoolapp/fetch.php");
// 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);
}
public void goToMenu(View view) {
Intent i1 = new Intent(this, UserHome.class);
startActivity(i1);
}
private void getJSON(final String urlWebService) {
class GetJSON extends AsyncTask<String, Void, String> {
@Override
public void onPreExecute() {
super.onPreExecute();
}
@Override
public void onPostExecute(String s) {
super.onPostExecute(s);
//Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show();
try {
JSONObject jsonObject = new JSONObject(s);
longVal = jsonObject.getString("lat");
latVal = jsonObject.getString("lng");
//Toast.makeText(getApplicationContext(),longVal, Toast.LENGTH_SHORT).show();
//Toast.makeText(getApplicationContext(),latVal,Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public String doInBackground(String... strings) {
HashMap<String,String> hashMap=new HashMap<>();
return myCon.postRequest(hashMap, "http://webgax.com/schoolapp/fetch.php");
}
}
GetJSON getJSON = new GetJSON();
getJSON.execute();
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
//latNum =Double.parseDouble(latVal);
//longNum = Double.parseDouble(longVal);
//latNum = Double.valueOf(latVal);
//longNum = Double.valueOf(longVal);
Toast.makeText(getApplicationContext(),latVal,Toast.LENGTH_LONG).show();
//Toast.makeText(getApplicationContext(),longVal,Toast.LENGTH_LONG).show();
LatLng addr = new LatLng(22, 88);
float zoomLevel = 16; //This goes up to 21
mMap.addMarker(new MarkerOptions().position(addr).title("WebGax"));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(addr, zoomLevel));
}
}
如评论中所述,您应该在地图准备好更新后尝试更新地图... 使用您的初始代码,您之前调用了 AsyncTask,这取决于服务器的响应时间,当您具有纬度和经度值时,地图可能会准备好或没有准备好。
检查下面我的建议,我只是从 onCreate 调用中删除对您的异步任务的调用,并将其移动到地图准备好接收数据之后。
public class ChildTrackerPage extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
private ConnectionHTTP myCon = new ConnectionHTTP();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_child_tracker_page);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
public void goToMenu(View view) {
Intent i1 = new Intent(this, UserHome.class);
startActivity(i1);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
GetJSON getJSON = new GetJSON();
getJSON.execute();
}
private class GetJSON extends AsyncTask<String, Void, String> {
@Override
public String doInBackground(String... strings) {
HashMap<String,String> hashMap=new HashMap<>();
return myCon.postRequest(hashMap, "http://webgax.com/schoolapp/fetch.php");
}
@Override
public void onPostExecute(String s) {
JSONObject jsonObject = new JSONObject(s);
//I'm not sure why you do that instead of just using optDouble on your JSON but I don't know the contect of your JSON
String longVal = jsonObject.getString("lat");
String latVal = jsonObject.getString("lng");
double latNum = Double.parseDouble(latVal);
double longNum = Double.parseDouble(longVal);
LatLng addr = new LatLng(latNum, longNum);
float zoomLevel = 16; //This goes up to 21
if(mMap!=null){
mMap.addMarker(new MarkerOptions().position(addr).title("WebGax"));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(addr, zoomLevel));
}
}
}
}