Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android-如何从JSON文件脱机显示地图上的标记?_Android_Json_Google Maps_Google Maps Api 3_Google Maps Markers - Fatal编程技术网

android-如何从JSON文件脱机显示地图上的标记?

android-如何从JSON文件脱机显示地图上的标记?,android,json,google-maps,google-maps-api-3,google-maps-markers,Android,Json,Google Maps,Google Maps Api 3,Google Maps Markers,我想离线加载json文件资源文件夹中的标记,并在地图上显示它。 以前我可以将标记显示为textview,但无法在地图上显示。 该应用程序显示地图,但不显示标记 我不知道为什么 stations.json map.xml 地图活性 您的代码中存在多个问题: 您没有从异步任务调用getJSONFromAssets 您正在加载映射之前执行异步任务 在drawMarker方法中,创建一个新的GoogleMap引用并将其设置为null。这行不通。 您的代码忽略了name字段,我假设您希望将其作为InfoW

我想离线加载json文件资源文件夹中的标记,并在地图上显示它。 以前我可以将标记显示为textview,但无法在地图上显示。 该应用程序显示地图,但不显示标记

我不知道为什么

stations.json

map.xml

地图活性


您的代码中存在多个问题:

您没有从异步任务调用getJSONFromAssets 您正在加载映射之前执行异步任务 在drawMarker方法中,创建一个新的GoogleMap引用并将其设置为null。这行不通。 您的代码忽略了name字段,我假设您希望将其作为InfoWindow的代码段。 以下是更新的代码,修复了上述所有问题:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
    private Marker marker;
    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);
        // 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);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        new AsyncTaskGetMareker().execute();
    }

    public String getJSONFromAssets() {
        String json = null;
        try {
            InputStream inputData = getAssets().open("stations.json");
            int size = inputData.available();
            byte[] buffer = new byte[size];
            inputData.read(buffer);
            inputData.close();
            json = new String(buffer, "UTF-8");
        } catch (IOException ex) {
            ex.printStackTrace();
            return null;
        }
        return json;
    }

    private class AsyncTaskGetMareker extends AsyncTask<String , String, JSONArray> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected JSONArray doInBackground(String... strings) {
            String stationsJsonString = getJSONFromAssets();
            try {
                JSONArray stationsJsonArray = new JSONArray(stationsJsonString);
                return stationsJsonArray;
            } catch (JSONException e) {
                e.printStackTrace();
            }
            //This will only happen if an exception is thrown above:
            return null;
        }

        protected void onPostExecute (JSONArray result){
            if (result !=null){
                for (int i =0; i <result.length(); i++){
                    JSONObject jsonObject= null;
                    try {
                        jsonObject= result.getJSONObject(i);
                        String name=jsonObject.getString("name");
                        String lat=jsonObject.getString("lat");
                        String lang=jsonObject.getString("lang");

                        drawMarker(new LatLng(Double.parseDouble(lat),
                                Double.parseDouble(lang)), name);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }

        }

        private void drawMarker(LatLng point, String name) {
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.position(point);
            markerOptions.snippet(name);
            mMap.addMarker(markerOptions);
        }
    }

}
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment"/>
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
    private Marker marker;
    private GoogleMap mMap;

    public MapsActivity() throws JSONException {
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);
        // 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);

        new AsyncTaskGetMareker().execute();


    }

    public String getJSONFromAssets() {
        String json = null;
        try {
            InputStream inputData = getAssets().open("stations.json");
            int size = inputData.available();
            byte[] buffer = new byte[size];
            inputData.read(buffer);
            inputData.close();
            json = new String(buffer, "UTF-8");
        } catch (IOException ex) {
            ex.printStackTrace();
            return null;
        }
        return json;

    }


    private class AsyncTaskGetMareker extends AsyncTask
    <String , String, JSONArray>{
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected JSONArray doInBackground(String... strings) {
            return null;
        }

        protected void onPostExecute (JSONArray result){
            if (result !=null){
                for (int i =0; i <result.length(); i++){
                    JSONObject jsonObject= null;
                    try {
                        jsonObject= result.getJSONObject(i);
                        String name=jsonObject.getString("name");
                        String lat=jsonObject.getString("lat");
                        String lang=jsonObject.getString("lang");


                        drawMarker(new LatLng(Double.parseDouble(lat),
                                Double.parseDouble(lang)));

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }

        }

        private void drawMarker(LatLng point) {
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.position(point);
            GoogleMap googleMap = null;
            googleMap.addMarker(markerOptions);
        }




    }


    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
    }
}
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
    private Marker marker;
    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);
        // 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);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        new AsyncTaskGetMareker().execute();
    }

    public String getJSONFromAssets() {
        String json = null;
        try {
            InputStream inputData = getAssets().open("stations.json");
            int size = inputData.available();
            byte[] buffer = new byte[size];
            inputData.read(buffer);
            inputData.close();
            json = new String(buffer, "UTF-8");
        } catch (IOException ex) {
            ex.printStackTrace();
            return null;
        }
        return json;
    }

    private class AsyncTaskGetMareker extends AsyncTask<String , String, JSONArray> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected JSONArray doInBackground(String... strings) {
            String stationsJsonString = getJSONFromAssets();
            try {
                JSONArray stationsJsonArray = new JSONArray(stationsJsonString);
                return stationsJsonArray;
            } catch (JSONException e) {
                e.printStackTrace();
            }
            //This will only happen if an exception is thrown above:
            return null;
        }

        protected void onPostExecute (JSONArray result){
            if (result !=null){
                for (int i =0; i <result.length(); i++){
                    JSONObject jsonObject= null;
                    try {
                        jsonObject= result.getJSONObject(i);
                        String name=jsonObject.getString("name");
                        String lat=jsonObject.getString("lat");
                        String lang=jsonObject.getString("lang");

                        drawMarker(new LatLng(Double.parseDouble(lat),
                                Double.parseDouble(lang)), name);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }

        }

        private void drawMarker(LatLng point, String name) {
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.position(point);
            markerOptions.snippet(name);
            mMap.addMarker(markerOptions);
        }
    }

}