簡體   English   中英

如何在數據庫中的地圖上繪制標記

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM