2016-03-17 3 views
14

Ich verwende Google Orte API und es gibt alle Orte in meinem Standort zurück. Allerdings möchte ich nur einen Typ für "Autoreparatur" zurückgeben Ich denke, ich habe es fast, aber ich vermisse etwas, wenn jemand mich in die richtige Richtung führen könnte, wäre es großartig :)Google platziert API return einen einzigen Typ "car_repair"

Mein Code so weit 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); 
     } 
    } 

} 

Manifestdatei

<?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> 

Als ich in der URL in meinen Browser auf meinem PC geben gibt es alle Art "car_repair" in meinem Bereich daher mein API-Schlüssel funktioniert enter image description here

+0

google liefert kein Ergebnis mit Suchbegriff 'auto reparatur'. so können Sie dieses Ergebnis nicht direkt von Orten API erhalten. Du musst es selber machen. –

+0

Entsprechend tut es https://developers.google.com/places/supported_types –

Antwort

4

Versuchen Sie mit einer Abfrage ähnlich der folgenden: Speicherort ist im Format Breite, Länge ... und seien Sie vorsichtig ist "Typen" nicht geben.

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

Ich werde einen Blick darauf werfen und ich werde auf Sie zurückkommen –

+0

Ich habe die URL-Zeichenfolge 'String URL =" https: //maps.googleapis .com/maps/api/place/closedesearch/json? location = 54.27, -8.47 & types = car_repair & radius = 5000 & key = AIzaSyANj6qV9bJGYr0i-Cj5u2I4TvOCOvQRqq4 & sensor = true ";" Muss ich diese URL irgendwo zurückgeben, um ein Ergebnis zu erhalten? –

+0

Es sieht aus wie ein Problem mit Ihrem API-Schlüssel { "error_message": "Diese IP-Adresse, Website oder mobile Anwendung ist nicht berechtigt, diesen API-Schlüssel zu verwenden. Anfrage von IP-Adresse XXXXXXXX, mit leeren Referer", "html_attributions" : [], "Ergebnisse": [], "status": "REQUEST_DENIED" } – jonhid

2

Da diese API den Ortstyp in einem Bereich zurückgibt. Es gibt eine Methode kann das Ergebnis verbessern, aber immer noch nicht optimal, die setLatLngBounds heißt. Der Link ist https://developers.google.com/android/reference/com/google/android/gms/location/places/ui/PlacePicker.IntentBuilder#public-method-summary Ich habe versucht, diese API vor und finde es total ein Chaos in gewissem Maße. Zum Beispiel, wenn Sie Restaurant innerhalb einer Universität finden möchten, wird diese API Ihnen nicht nur das Restaurant, sondern auch viele andere Arten wie University zurückgeben. Das Festlegen einer Grenze ist vielleicht gut, wird aber immer noch ärgerlich, wenn Sie nur die API verwenden. Wenn Sie nur den Typ car-repair möchten, schlage ich vor, Sie schreiben einen Filter, um andere Typen zu filtern und nur Auto-Reparatur-Typ und relevante Informationen zu halten.

+0

Ich werde einen Blick darauf werfen und ich werde zu dir zurückkommen –

+0

Irgendeine Idee, wie ich diesen Filter erstellen würde –

2

Ich habe dies für Sie vorbereitet, hoffen, dass es

// 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(); 
     } 

Genießen Sie hilft !!

+0

Danke für die Rückmeldung an mich. Ich werde dies eine Einstellung geben Ich bin ziemlich neu für Android, so kann dies eine Weile dauern, um richtig zu machen. –

+0

Hat dieser Code für Sie funktioniert, da er nicht für mich funktioniert? –

+0

Was ist das Problem .. Sie haben eine PlaceList nicht null in der onPostExecute-Methode? – jonhid

Verwandte Themen