java - 如何在数据库中的 map 上绘制标记

标签 java android string maps

我是 Android 开发新手,也是 StackOveflow 新手。抱歉,如果我重复问一个问题。 我正在制作一个应用程序来从 MySQL 数据库获取位置坐标并在 map 上绘制标记。 我能够将值提取到 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 上崩溃了。任何人都可以提供一个链接来让我自己理解所有这些崩溃日志。

Lollipop 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) 

应用 SharedPreference 后的新程序可以在 Kitkat 中运行,但在 Lollipop 和其他高级 ROM(Oreo)中崩溃。

    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

关于java - 如何在数据库中的 map 上绘制标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48854831/

相关文章:

java - Java 项目中的自动更新属性文件值

java - JSch 中断命令执行

java - 如何将项目从 gwt 2.5.1 升级到 gwt 2.7.0 ?

android - 在将最低 SDK 版本设置为 21 时,此应用与您的所有设备都不兼容

java - 如何在 Java StringBuffer 中捕获某些文本

java - 错误:cannot find symbol -variable

java - hibernate.properties 类路径冲突

单声道android的Java反射

android - 软件更新 macOS Mojave 后 ADB 不工作

C# - 按任意数量的制表符和空格拆分字符串