java - 改造响应方法从谷歌地图 API 解析 JSON 不起作用

标签 java android json retrofit google-maps-android-api-2

retrofitResponse 方法内的循环没有按预期循环。它应该从 google map url 获取 json 数据。

package com.webstarts.byteglory.shomadhan;

import android.*;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.location.Location;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.webstarts.byteglory.shomadhan.POJO.Example;

import retrofit.Call;
import retrofit.Callback;
import retrofit.GsonConverterFactory;
import retrofit.Response;
import retrofit.Retrofit;

public class StartActivity extends FragmentActivity implements ConnectionCallbacks, OnConnectionFailedListener, com.google.android.gms.location.LocationListener, OnMapReadyCallback {

    protected GoogleApiClient mGoogleApiClient;
    protected Location mLastLocation;
    protected static final String TAG = "Location Services Test";
    private Button search_location_button;
    private Button search_area_button;
    private Button toilet_status_button;
    protected LatLng latlng;
    protected LocationRequest mLocationRequest;

    private GoogleMap mMap;
    private int PROXIMITY_RADIUS = 10000;
    Marker mCurrLocationMarker;
    boolean mapReady = false;
    private Marker mPerth;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);
        search_location_button = (Button) findViewById(R.id.search_location_button);
        search_area_button = (Button) findViewById(R.id.search_area_button);
        toilet_status_button = (Button) findViewById(R.id.toilet_status_button);
        locationApiClient();

//        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
//                .findFragmentById(R.id.map);
//        mapFragment.getMapAsync(this);
        search_location_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                Log.i(TAG, String.valueOf(latlng.latitude));
//                Uri gmmIntentUri = Uri.parse("geo:"+String.valueOf(latlng.latitude)+","+String.valueOf(latlng.longitude)+"?z=15&q=public toilets");
//                Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
//                mapIntent.setPackage("com.google.android.apps.maps");
//                startActivity(mapIntent);

                retrofitResponse();

//                Marker loc = mMap.addMarker(new MarkerOptions().position(latlng)
//                        .title("You are here now 23"));
//                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 15));
//
//                // Zoom in, animating the camera.
//                mMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
//                Log.i(TAG, String.valueOf(latlng.latitude));


            }
        });

        MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    }

    protected synchronized void locationApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    @Override
    protected void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }

    /**
     * Runs when a GoogleApiClient object successfully connects.
     */
    @Override
    public void onConnected(Bundle connectionHint) {
        // Provides a simple way of getting a device's location and is well suited for
        // applications that do not require a fine-grained location and that do not need location
        // updates. Gets the best and most recent location currently available, which may be null
        // in rare cases when a location is not available.

        mLocationRequest = LocationRequest.create();
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationRequest.setInterval(1000);
        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;
        }
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if(mLastLocation != null) {
            latlng = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
        }
        else {
            Toast toast = Toast.makeText(this, "Turn on your location service", Toast.LENGTH_LONG);
            toast.show();
            finish();
        }
    }

    public void onLocationChanged(Location location) {

    }
    @Override
    public void onConnectionFailed(ConnectionResult result) {
        // Refer to the javadoc for ConnectionResult to see what error codes might be returned in
        // onConnectionFailed.
        Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode());
    }
    /*
    * Called by Google Play services if the connection to GoogleApiClient drops because of an
    * error.
    */
    public void onDisconnected() {
        Log.i(TAG, "Disconnected");
    }
    @Override
    public void onConnectionSuspended(int cause) {
        // The connection to Google Play services was lost for some reason. We call connect() to
        // attempt to re-establish the connection.
        Log.i(TAG, "Connection suspended");
        mGoogleApiClient.connect();
    }

    private void retrofitResponse() {

        String url = "https://maps.googleapis.com/maps/";

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        RetrofitMaps service = retrofit.create(RetrofitMaps.class);

        Call<Example> call = service.getNearbyPlaces("restaurents", latlng.latitude + "," + latlng.longitude, PROXIMITY_RADIUS);

        call.enqueue(new Callback<Example>() {
            @Override
            public void onResponse(Response<Example> response, Retrofit retrofit) {

                try {
                    mMap.clear();
                    // This loop will go through all the results and add marker on each location.
                    Log.i("ishan", String.valueOf(response.body().getResults().size()));
                    for (int i = 0; i < response.body().getResults().size(); i++) {
                        Double lat = response.body().getResults().get(i).getGeometry().getLocation().getLat();
                        Double lng = response.body().getResults().get(i).getGeometry().getLocation().getLng();
                        String placeName = response.body().getResults().get(i).getName();
                        String vicinity = response.body().getResults().get(i).getVicinity();
                        MarkerOptions markerOptions = new MarkerOptions();
                        LatLng latLng = new LatLng(lat, lng);
                        // Position of Marker on Map
                        markerOptions.position(latLng);
                        // Adding Title to the Marker
                        markerOptions.title(placeName + " : " + vicinity);
                        // Adding Marker to the Camera.
                        Marker m = mMap.addMarker(markerOptions);
                        // Adding colour to the marker
                        markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
                        // move map camera
                        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
                        mMap.animateCamera(CameraUpdateFactory.zoomTo(11));
                        Log.i("ishan", String.valueOf(i));
                    }
                } catch (Exception e) {
                    Log.d("onResponse", "There is an error");
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Throwable t) {
                Log.d("onFailure", t.toString());
            }
        });

    }

    @Override
    public void onMapReady(GoogleMap map) {
        mapReady=true;
        mMap = map;

//        //Initialize Google Play Services
//        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//            if (ContextCompat.checkSelfPermission(this,
//                    android.Manifest.permission.ACCESS_FINE_LOCATION)
//                    == PackageManager.PERMISSION_GRANTED) {
//            }
//        }





    }
}

这是改造后的界面。它只有 GET,因为它只是从 map url 读取数据。

package com.webstarts.byteglory.shomadhan;

import com.webstarts.byteglory.shomadhan.POJO.Example;

import retrofit.Call;
import retrofit.http.GET;
import retrofit.http.Query;



    public interface RetrofitMaps {

        /*
         * Retrofit get annotation with our URL
         * And our method that will return us details of student.
         */
        @GET("api/place/nearbysearch/json?sensor=true&key=AIzaSyABCGHHSFDGSDsdfGADFnM")
        Call<Example> getNearbyPlaces(@Query("type") String type, @Query("location") String location, @Query("radius") int radius);

    }

最佳答案

我刚刚在 onResponse 改进函数中循环,如下所示: public void onResponse(调用调用,响应响应){

            /* implement the toast */
            /* =new ArrayList<User>(); */
           ArrayList<User> test;
            test=response.body().getUsers();
            String jax= test.get(0).getFarm_name();
           //Toast.makeText(MarkerDemoActivity.this, "farm name is "+jax, Toast.LENGTH_LONG).show();
            //LatLng m_cord,String farm_name,String desc
            int i = 0;
            while ( test.size()>i) {
                String farm_name = test.get(i).getFarm_name();
                String desc1 = test.get(i).getOwner_tel();
                String desc2 = test.get(i).getFarm_type();
                String cords = test.get(i).getM_cord();
                //split the co-ords
                String[] latlong = cords.split(",");
                double latitude = Double.parseDouble(latlong[0]);
                double longitude = Double.parseDouble(latlong[1]);
                LatLng location = new LatLng(latitude, longitude);
                //do the loop here
                // Add lots of markers to the map.  LatLng m_cord,String farm_name,String desc
                addMarkersToMapJax(location, farm_name, desc1 + desc2);
                i++;
            }
        }

我创建了一个标记函数来加载坐标:

private void addMarkersToMapJax(LatLng m_cord,String farm_name,String desc) {
        // Uses a colored icon.
        mArc = mMap.addMarker(new MarkerOptions()
                .position(m_cord)
                .title(farm_name)
                .snippet(desc)

关于java - 改造响应方法从谷歌地图 API 解析 JSON 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40389721/

相关文章:

java - hibernate/jpa Autowire 注释产生 Nullpointer 异常错误

java - 数据结构的工作方式类似于 Map,但允许随机更改键顺序

Android 发布构建错误 : "The value for this property cannot be changed any further."

javascript - 从 JSON 在单个 Highcharts 图中绘制多个系列

ruby-on-rails - 无法将数组转换为字符串错误

javascript - 跨域 JSON - 哪个服务器提供源有关系吗?

java - maven项目中如何判断版本来自哪里?

java - 墙跟随迷宫解算器

android - 错误运行 Tensorflow 示例 Android

android - ExoPlayer:如何更改 Controller 元素的颜色