2016-03-17 19 views
14

Sto utilizzando Google Places API e restituisce tutti i luoghi nella mia posizione. Comunque voglio solo restituire un tipo per "riparazione auto" Penso di averlo quasi ma mi manca qualcosa se qualcuno mi può guidare nella giusta direzione sarebbe fantastico :)Google places API restituisce un singolo tipo "car_repair"

Il mio codice finora PlacPickerActivity

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.text.Html; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import com.google.android.gms.common.GooglePlayServicesNotAvailableException; 
import com.google.android.gms.common.GooglePlayServicesRepairableException; 
import com.google.android.gms.location.places.Place; 
import com.google.android.gms.location.places.ui.PlacePicker; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.LatLngBounds; 


public class PlacePickerActivity extends AppCompatActivity { 

    private static final int PLACE_PICKER_REQUEST = 1; 
    String url="https://maps.googleapis.com/maps/api/place/textsearch/json?type=car_repair&key=AIzaSyBKsTtLyMBQH8mhvbknJ4MvZwACotmeYO0"; 

    private TextView mName; 
    private TextView mAddress; 
    private TextView mAttributions; 
    private TextView mNumber; 
    private static final LatLngBounds Sligo = new LatLngBounds(
      new LatLng(54.27, -8.47), new LatLng(54.27, -8.47)); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_place_picker); 
     mName = (TextView) findViewById(R.id.textView); 
     mAddress = (TextView) findViewById(R.id.textView2); 
     mAttributions = (TextView) findViewById(R.id.textView3); 
     mNumber = (TextView) findViewById(R.id.textView4); 
     Button pickerButton = (Button) findViewById(R.id.pickerButton); 
     pickerButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        PlacePicker.IntentBuilder intentBuilder = 
          new PlacePicker.IntentBuilder(); 
        intentBuilder.setLatLngBounds(Sligo); 

        Intent intent = intentBuilder.build(PlacePickerActivity.this); 
        startActivityForResult(intent, PLACE_PICKER_REQUEST); 

       } catch (GooglePlayServicesRepairableException 
         | GooglePlayServicesNotAvailableException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, 
            int resultCode, Intent data) { 

     if (requestCode == PLACE_PICKER_REQUEST 
       && resultCode == Activity.RESULT_OK) { 

      final Place place = PlacePicker.getPlace(this, data); 
      final CharSequence name = place.getName(); 
      final CharSequence address = place.getAddress(); 
      final CharSequence formatted_phone_number = place.getPhoneNumber(); 
      String attributions = (String) place.getAttributions(); 
      if (attributions == null) { 
       attributions = ""; 
      } 

      mName.setText(name); 
      mAddress.setText(address); 
      mAttributions.setText(Html.fromHtml(attributions)); 
      mNumber.setText(formatted_phone_number); 


     } else { 
      super.onActivityResult(requestCode, resultCode, data); 
     } 
    } 

} 

File manifesto

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.truiton.placepicker"> 

    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 

     <meta-data 
      android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version"/> 

     <meta-data 
      android:name="com.google.android.geo.API_KEY" 
      android:value="AIzaSyBKsTtLyMBQH8mhvbknJ4MvZwACotmeYO0"/> 

     <activity 
      android:name=".PlacePickerActivity" 
      android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 

       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Quando ho digitare l'URL nel browser sul mio PC restituisce tutto il tipo "car_repair" nella mia zona, pertanto il mio API Key funziona enter image description here

+0

google non fornisce alcun risultato con la parola chiave "riparazione auto". quindi non puoi ottenere questo risultato direttamente da posti api. Devi farlo da solo. –

+0

In base a questo, https://developers.google.com/places/supported_types –

risposta

4

Provare con una query simile a questa: La posizione è in formato latitudine, longitudine ... e fare attenzione è "tipi" non digitare.

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=54.27,-8.47&radius=1000&types=car_repair&key=AddYourOwnKeyHere 
+0

darò un'occhiata e tornerò a voi –

+0

Ho la stringa url 'String url =" https: //maps.googleapis .com/maps/api/place/nearbysearch/json? location = 54.27, -8.47 & types = car_repair & radius = 5000 & key = AIzaSyANj6qV9bJGYr0i-Cj5u2I4TvOCOvQRqq4 & sensor = true ";' Ho bisogno di restituire questo URL da qualche parte per ottenere un risultato? –

+0

Sembra che ci sia qualche problema con la tua chiave API { "error_message": "Questo IP, sito o applicazione mobile non è autorizzato a utilizzare questa chiave API. Richiesta ricevuta dall'indirizzo IP XXXXXXXX, con referente vuoto", "html_attributions" : [], "risultati": [], "stato": "REQUEST_DENIED" } – jonhid

2

Poiché questa API restituisce il tipo di posto all'interno di un ambito. C'è un metodo che può migliorare il risultato ma non è ancora ottimale, che è chiamato setLatLngBounds. Il collegamento è https://developers.google.com/android/reference/com/google/android/gms/location/places/ui/PlacePicker.IntentBuilder#public-method-summary Ho provato questa API prima e trovo che è totalmente un casino in una certa misura. Ad esempio, se si desidera trovare ristorante all'interno di un'università, questa API non solo restituirà il ristorante ma anche molti altri tipi come University. Impostare un limite può essere buono ma ottiene comunque risultati fastidiosi se si utilizza solo l'API. Se si desidera solo il tipo di car-repair, suggerisco di scrivere un filtro per filtrare altri tipi e solo di mantenere il tipo di riparazione auto e le informazioni pertinenti.

+0

Ti darò un'occhiata e ti risponderò –

+0

Qualche idea su come creerei questo filtro –

2

ho preparato questo per voi, spero che aiuta

// A class to store your results 
public class Place { 
    private String icon; 
    private Double latitude; 

    public void setIcon(String icon) { 
     this.icon=icon; 
    } 

    public void setLatitude(Double latitude) { 
     this.latitude=latitude; 
    } 

    // ..... 
} 

// Utility class to keep things simple 
public class Functions { 

    public static JSONObject convertInputStreamToJSONObject(InputStream inputStream) 
     throws JSONException, IOException 
    { 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
     String line = ""; 
     String result = ""; 
     while ((line = bufferedReader.readLine()) != null) 
      result += line; 

     inputStream.close(); 
     return new JSONObject(result); 

    } 

    public static ArrayList<Place> parsePlacesFromJson(JSONObject datos) throws JSONException { 

     List<Place> placesList = new ArrayList<>(); 

     // in your case this must be "results" I think 
     final int LIST_LENGTH = datos.getJSONArray("results").length(); 
     //final int LIST_LENGTH = datos.getJSONArray("nameOfTheJsonMainArray").length(); 

     Log.d("Length", String.valueOf(LIST_LENGTH)); 


     // For every element in the list 
     for(int i = 0; i < LIST_LENGTH; i++) { 

      // Instance of a new Place 
      Place place = new Place(); 

      // Get data as needed, this represents one place 
      JSONObject obj = datos.getJSONArray("results").getJSONObject(i); 

      Double latitude = obj.getJSONObject("geometry").getJSONObject("location").getDouble("lat"); 
      String icon = obj.getString("icon"); 

      place.setLatitude(latitude); 
      place.setIcon(icon); 
      //.... 
      placesList.add(place) 

     } 

     return placesList; 
    } 
} 

// The google places reader class 
public class ApiReader { 


    private static final String TAG = "API_READER"; 
    Context context; 
    View v; 

    public ApiReader(Context context, View v) { 
     this.context = context; 
     this.v = v; 
    } 


    private static final String APIKEY = "yourkeyhere"; 


    private static String ENDPOINT = 
     "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=54.27,-8.47&radius=1000&types=car_repair&key=%s"; 



    // Method to be called 
    public void getCarRepairs() throws IOException { 
     URL url = new URL(String.format(ENDPOINT, APIKEY)); 
     new GetPlaces().execute(url); 
    } 




    // Inner asyctask class 
    private class GetPlaces extends AsyncTask<URL, Integer, List<Place>> { 
     List<Place> lista; 
     @Override 
     protected List<Place> doInBackground(URL... params) { 
      JSONObject datos; 
      URL url = params[0]; 
      HttpURLConnection urlConnection = null; 


      try { 
       urlConnection = (HttpURLConnection) url.openConnection(); 
       InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
       datos = Functions.convertInputStreamToJSONObject(in); 
       Log.i(TAG, datos.toString()); 

       // De los datos obtenemos un objeto Place 

       lista = Functions.parsePlacesFromJson(datos); 
       Log.i(TAG, "" + lista.toString()); 
       Log.i(TAG, "Went into try was OK."); 

      } catch (Exception e) { 
      Log.e(TAG, e.toString()); 
      Log.i(TAG, "Went into catch"); 

      } finally { 
       urlConnection.disconnect(); 
       Log.i(TAG, "Went into finally, urlConnection disconnected."); 
      } 

      return lista; 
     } 


     // This method it gets what the "doInBackGround" returns 
     protected void onPostExecute(List<Place> placesList) { 

      if(placesList != null) { 

       // Do whatever with the list of places 
       //Functions.updateView(v, placesList); 

      } 
     } 
    } 

} 

// And to make things work in yout activity just do like this 

     ApiReader api = new ApiReader(this, findViewById(R.id.mainLayout)); 

     try { 
      api.getCarRepairs(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

Godetevi !!

+0

Grazie per avermi contattato. Darò questo un colpo sono abbastanza nuovo per Android quindi questo potrebbe richiedere un po 'di tempo per andare bene. –

+0

Questo codice ha funzionato per te in quanto non sembra funzionare per me. –

+0

Qual'è il problema .. hai un placeList non null nel metodo onPostExecute ?? – jonhid

Problemi correlati