简体   繁体   English

如何在数据库中的地图上绘制标记

[英]How to plot a marker on maps from the database

I am new to Android Development as well as new to StackOveflow. 我是Android开发的新手,也是StackOveflow的新手。 Sorry if I am asking a repeated question. 抱歉,如果我问一个重复的问题。 I was making an app to fetch location coordinates from MySQL database and plot the markers on the map. 我正在制作一个应用程序,用于从MySQL数据库获取位置坐标并在地图上绘制标记。 I am able to fetch the value into a textView. 我能够将值提取到textView中。

String answer = "-32.430412,-58.321323,#-32.430412,-58.321323,#-32.430412,-58.321323,#";

It perfectly works when the co ordinates are entered in this way but does not work when the coordinates are fetched from the database. 当以这种方式输入坐标时,它完美地工作,但是当从数据库中获取坐标时,它不工作。

String answer = json_string;

I am unable to find the solution to the problem. 我找不到解决问题的方法。 The app closes with a null pointer exception This is my MapsActivity.java 该应用程序以空指针异常关闭。这是我的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"));


    }
}

And my PHP is as follows: 我的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();
?>

I even tried the exact same result to confirm still there was a exception. 我什至尝试使用完全相同的结果来确认仍然存在异常。

And the Exception looks like this: 异常如下所示:

    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) 

So now I fixed the problem in app on kitkat rom but why is it now crashingg on Lollipop rom. 所以现在我在kitkat rom上的应用程序中修复了该问题,但为什么现在在Lollipop rom上崩溃了。 Also could anyone give a link to understand all these crash logs myself. 任何人都可以自己提供链接以了解所有这些崩溃日志。

Crash Log in 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) 

The new Program after applying SharedPreference which works in Kitkat but crashes in Lollipop and other Higher roms(Oreo). 应用了可在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);
    }

}

Its actually giving you null value. 它实际上为您提供了空值。 Network call happens in a separate thread. 网络调用发生在单独的线程中。 If it was in the same thread then the data would have retained. 如果在同一线程中,则数据将保留。 But in android if you do the network call on the UI thread then you will get an "App not responding" dialog. 但是在android中,如果您在UI线程上进行网络调用,则会出现“应用未响应”对话框。 Now to retain data from network calls use SharedPreferences . 现在,要保留网络调用中的数据,请使用SharedPreferences It is the simplest way to store data and then retrieve later. 这是存储数据然后再检索的最简单方法。 You can also try using StringBuffer 您也可以尝试使用StringBuffer

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM