无法使用json在地图上绘制标记

时间:2016-09-12 14:10:34

标签: android json google-maps

标记没有在地图上显示,json数据完全正常,我可以看到,虽然调试。但标记没有在地图上显示

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback  {
public GoogleMap mMap;

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


public void onMapSearch (View view) throws IOException {

    //hide button when button is pressed
    InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

    //preview the entered address as an Tost in bar
    EditText locationSearch = (EditText) findViewById(R.id.editText);
    String location = locationSearch.getText().toString();

    //this will animate camera and zoom 12.0f
    mMap.animateCamera(CameraUpdateFactory.zoomTo(12.0f));



    //further address search codes
    List<Address> addressList = null;

    //if nothing will be entered in the edit-text will not show a toast rather than crashing of thekha app
    if (locationSearch.getText().toString().equals("")){
        Toast.makeText(this,"Bitch please enter A Value",Toast.LENGTH_LONG).show();
    }
    else {

        //process of exception handling and finding location
        if (location != null || !location.equals("")) {
            Geocoder geocoder = new Geocoder(this);
            try {
                addressList = geocoder.getFromLocationName(location, 1);
            } catch (IOException e) {
                e.printStackTrace();
              }
            //if address is greater than one then these processes will happen

            if(addressList.size()>0) {
                Address address = addressList.get(0);
                LatLng latLng = new LatLng(address.getLatitude(), address.getLongitude());
                mMap.addMarker(new MarkerOptions()
                        .position(latLng)
                        .title(location + " is Here- ")
                        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));
                mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));

                Toast.makeText(this, location+" is here, Zoom In or Zoom Out to make your Thekha Visible ", Toast.LENGTH_LONG)
                        .show(); //popup type to show entered data
            }
            else {
                //process where entered entry will not gonna find , this will gonna a toast to show popup

                Toast.makeText(this,"Entered Address Not Found", Toast.LENGTH_LONG).show();

            }
        }

    }
}


private class RetriveMarkerTask extends AsyncTask<StringBuilder,Void,StringBuilder> {
    private Context context;
    private String jsonData;

    public RetriveMarkerTask(Context context) {
        this.context = context;
    }

    @Override
    protected StringBuilder doInBackground(StringBuilder... stringBuilders) {
        android.os.Debug.waitForDebugger();

        HttpURLConnection conn = null;
        final StringBuilder json = new StringBuilder();
        try {
            //connect to the web service
            URL url = new URL("http://www.loofre.com/api-for-webservice/?debug=true&action=getLocations");
            conn = (HttpURLConnection) url.openConnection();
            InputStreamReader in = new InputStreamReader(conn.getInputStream());
            //This will read the json data into string builder
            int read;
            char[] buff = new char[1024];
            while ((read = in.read(buff)) != -1) {
                json.append(buff, 0, read);
            }
            this.jsonData = new String(buff);
        } catch (IOException e) {
            return null;
        } catch (Exception ex) {
            return null;
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
            return json;
        }
    }

    @Override
    protected void onPostExecute(StringBuilder stringBuilder) {
        super.onPostExecute(stringBuilder);
        try {
            ((MapsActivity)context).createMarkerFromJson(this.jsonData);
        }catch (JSONException e){
            e.printStackTrace();
        }
    }
}



void createMarkerFromJson (String json) throws JSONException {
    // de-derialize the json string into an array of objects


        JSONArray jsonArray = new JSONArray(json);
        for (int i =0; i<jsonArray.length(); i++){
            //create marker of each place in the json data
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            String placeName = jsonObject.getString("name");
            String placeAddress = jsonObject.getString("address");
            double latitude = jsonObject.getJSONArray("latlang").getDouble(0);
            double longitude = jsonObject.getJSONArray("latlang").getDouble(1);
            LatLng loc = new LatLng(latitude, longitude);
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(loc, 13));
            mMap.addMarker(new MarkerOptions()
                    .title(placeName)
                    .snippet(placeAddress)
                    .position(loc)
            );
        }

    }

//OnReady map starts here when we can enter or add Marker to the map
@Override
public void onMapReady(GoogleMap googleMap) {
   mMap = googleMap;

    try {
        RetriveMarkerTask markerTask = new RetriveMarkerTask(this);
        markerTask.execute();
    }catch (Exception e){
        Toast.makeText(this,"Can not fetch data",Toast.LENGTH_LONG).show();
    }

    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission
            (this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //  int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    //tool bar and other tool related on map uiSettings
    mMap.setMyLocationEnabled(true);
    mMap.getUiSettings().setZoomControlsEnabled(true);
    mMap.getUiSettings().setMapToolbarEnabled(true);
    mMap.getUiSettings().setMyLocationButtonEnabled(true);

}

}

1 个答案:

答案 0 :(得分:0)

为什么不在构造函数中传递mMap,然后在您的AsyncTask类中移动createMarkerFromJson函数,而不是将上下文传递给您的任务然后再转换上下文以调用函数。如果返回的Json数据是正确的,这将帮助我们验证您的标记是否正在添加到正确的内容中。你对moveCamera的调用是否发生?