[英]How to plot a marker on maps from the database
我是Android開發的新手,也是StackOveflow的新手。 抱歉,如果我問一個重復的問題。 我正在制作一個應用程序,用於從MySQL數據庫獲取位置坐標並在地圖上繪制標記。 我能夠將值提取到textView中。
String answer = "-32.430412,-58.321323,#-32.430412,-58.321323,#-32.430412,-58.321323,#";
當以這種方式輸入坐標時,它完美地工作,但是當從數據庫中獲取坐標時,它不工作。
String answer = json_string;
我找不到解決問題的方法。 該應用程序以空指針異常關閉。這是我的MapsActivity.java
public void getCoords(View view) {
new CoordsBackgroundTask().execute();
}
class CoordsBackgroundTask extends AsyncTask<Void, Void, String> {
String json_url_coords;
@Override
protected void onPreExecute() {
json_url_coords = "http://192.168.225.139/location_marker/just.php";
}
@Override
protected String doInBackground(Void... voids) {
try {
URL url = new URL(json_url_coords);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
while ((JSON_STRING = bufferedReader.readLine()) != null) {
stringBuilder.append(JSON_STRING + "\n");
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return stringBuilder.toString().trim();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
TextView textview = (TextView) findViewById(R.id.textviewMaps);
textview.setText(result);
json_string = result;
Toast.makeText(getApplicationContext(), json_string, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
setUpMap();
}
public void Gpsconnection() {
gps = new GPSCord(MapsActivity.this);
if (gps.canGetLocation()) {
longitude = gps.getLongitude();
latitude = gps.getLatitude();
// Toast.makeText(getApplicationContext(),"Longitude:"+Double.toString(longitude)+"\nLatitude:"+Double.toString(latitude),Toast.LENGTH_SHORT).show();
} else {
gps.showSettingsAlert();
}
}
private void setUpMap() {
String answer = "-32.430412,-58.321323,#-32.430412,-58.321323,#-32.430412,-58.321323,#";
//String answer = json_string;
String[] parts = answer.split("#");
for (String point : parts) {
String[] pointData = point.split(",");
Float lat = Float.parseFloat(pointData[0]);
Float lng = Float.parseFloat(pointData[1]);
mMap.addMarker(new MarkerOptions()
.position(new LatLng(lat, lng))
.title("Hello world"));
}
}
我的PHP如下:
<?php
$mysqli = new mysqli("localhost", "root", "password", "location_marker");
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
$query = "SELECT markers.lat, markers.lng
FROM markers";
if ($result = $mysqli->query($query)) {
/* fetch associative array */
while ($row = $result->fetch_assoc()) {
/*
echo $row['lat'];
echo ',';
echo $row['lng'];
echo ',';
echo '#';
*/
}
echo '-32.430412,-58.321323,#-32.430412,-58.321323,#-32.430412,-58.321323,#';
/* free result set */
$result->free();
}
/* close connection */
$mysqli->close();
?>
我什至嘗試使用完全相同的結果來確認仍然存在異常。
異常如下所示:
02-19 02:40:42.246 28422-28441/com.hexapixel.hexa I/dalvikvm: Total arena pages for JIT: 21
02-19 02:40:44.786 28422-28422/com.hexapixel.hexa D/AndroidRuntime: Shutting down VM
02-19 02:40:44.786 28422-28422/com.hexapixel.hexa W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x430f2140)
02-19 02:40:44.796 28422-28422/com.hexapixel.hexa E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.hexapixel.hexa, PID: 28422
java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:3846)
at android.view.View.performClick(View.java:4478)
at android.view.View$PerformClick.run(View.java:18698)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at android.view.View$1.onClick(View.java:3841)
at android.view.View.performClick(View.java:4478)
at android.view.View$PerformClick.run(View.java:18698)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.hexapixel.hexa.MapsActivity.setUpMap(MapsActivity.java:193)
at com.hexapixel.hexa.MapsActivity.getCoords(MapsActivity.java:62)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at android.view.View$1.onClick(View.java:3841)
at android.view.View.performClick(View.java:4478)
at android.view.View$PerformClick.run(View.java:18698)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(Native Method)
所以現在我在kitkat rom上的應用程序中修復了該問題,但為什么現在在Lollipop rom上崩潰了。 任何人都可以自己提供鏈接以了解所有這些崩潰日志。
崩潰登錄棒棒糖rom:
02-21 00:34:59.509 19445-19552/com.hexapixel.hexa I/art: DexFile_isDexOptNeeded failed to open oat file '/data/dalvik-cache/x86/data@data@com.google.android.gms@app_chimera@m@0000000d@GoogleCertificates_GmsCore_prodlmp_alldpi_release.apk@classes.dex' for file location '/data/data/com.google.android.gms/app_chimera/m/0000000d/GoogleCertificates_GmsCore_prodlmp_alldpi_release.apk': Failed to open oat filename for reading: No such file or directory
02-21 00:35:00.769 19445-19445/com.hexapixel.hexa D/AndroidRuntime: Shutting down VM
02-21 00:35:00.769 19445-19445/com.hexapixel.hexa E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.hexapixel.hexa, PID: 19445
java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:4007)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19761)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5253)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java:4002)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19761)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5253)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
at com.hexapixel.hexa.MapsActivity.setUpMap(MapsActivity.java:227)
at com.hexapixel.hexa.MapsActivity.getCoords(MapsActivity.java:78)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java:4002)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19761)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5253)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
應用了可在Kitkat中使用但在Lollipop和其他高等roms(Oreo)中崩潰的SharedPreference之后的新程序。
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,GoogleMap.OnInfoWindowClickListener {
private GoogleMap mMap;
private GPSCord gps;
double longitude;
double latitude;
public String JSON_STRING;
public String json_string;
public static final String MY_PREFS_NAME = "MyPrefsFile";
private static final String TAG = "Maps Activity check";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
Gpsconnection();
Toast.makeText(getApplicationContext(), "yolla location traced \n Longitude:" + Double.toString(longitude) + "\nLatitude:" + Double.toString(latitude), Toast.LENGTH_SHORT).show();
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
}
public void getCoords(View view) {
new CoordsBackgroundTask().execute();
setUpMap();
}
class CoordsBackgroundTask extends AsyncTask<Void, Void, String> {
String json_url_coords;
@Override
protected void onPreExecute() {
json_url_coords = "http://192.168.225.139/location_marker/just.php";
}
@Override
protected String doInBackground(Void... voids) {
try {
URL url = new URL(json_url_coords);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
while ((JSON_STRING = bufferedReader.readLine()) != null) {
stringBuilder.append(JSON_STRING + "\n");
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return stringBuilder.toString().trim();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
TextView textview = (TextView) findViewById(R.id.textviewMaps);
textview.setText(result);
json_string = result;
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
editor.putString("name", json_string);
editor.commit();
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
//setUpMap();
// marker information tab clicked...........
googleMap.setOnInfoWindowClickListener(this);
// Add a marker in Sydney and move the camera
LatLng loc1 = new LatLng(latitude, longitude);
mMap.addMarker(new MarkerOptions().position(loc1).title("My Current Location").snippet("").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));
float zoomLevel = 16; //This goes up to 21
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(loc1, zoomLevel));
}
public void Gpsconnection() {
gps = new GPSCord(MapsActivity.this);
if (gps.canGetLocation()) {
longitude = gps.getLongitude();
latitude = gps.getLatitude();
// Toast.makeText(getApplicationContext(),"Longitude:"+Double.toString(longitude)+"\nLatitude:"+Double.toString(latitude),Toast.LENGTH_SHORT).show();
} else {
gps.showSettingsAlert();
}
}
private void setUpMap() {
SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
String name = prefs.getString("name", "No name defined");
Toast.makeText(getApplicationContext(), name, Toast.LENGTH_SHORT).show();
String answer = name;
String[] parts = answer.split("#");
for (String point : parts) {
String[] pointData = point.split(",");
Float lat = Float.parseFloat(pointData[0]);
Float lng = Float.parseFloat(pointData[1]);
String agencyName = pointData[2];
String mainphoneNo = pointData[3];
//String altphoneNo = pointData[4];
mMap.addMarker(new MarkerOptions()
.position(new LatLng(lat, lng))
.title(agencyName)
.snippet(mainphoneNo));
}
}
@Override
public void onInfoWindowClick(Marker marker) {
String uri = "tel:" + marker.getSnippet();
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse(uri));
startActivity(intent);
}
}
它實際上為您提供了空值。 網絡調用發生在單獨的線程中。 如果在同一線程中,則數據將保留。 但是在android中,如果您在UI線程上進行網絡調用,則會出現“應用未響應”對話框。 現在,要保留網絡調用中的數據,請使用SharedPreferences
。 這是存儲數據然后再檢索的最簡單方法。 您也可以嘗試使用StringBuffer
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.