2016-03-02 57 views
5

我想限制我的GOOLGE的地方自动完成API的具体国家现在才IAM让整个世界建议地方......请解决该问题在此先感谢如何限制谷歌自动填充到特定的国家?

地Adapter类: -

package com.example.keita.googleplaces; 

import android.content.Context; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.Filter; 
import android.widget.Filterable; 
import android.widget.Toast; 

import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.common.api.PendingResult; 
import com.google.android.gms.common.api.Status; 
import com.google.android.gms.location.places.AutocompleteFilter; 
import com.google.android.gms.location.places.AutocompletePrediction; 
import com.google.android.gms.location.places.AutocompletePredictionBuffer; 
import com.google.android.gms.location.places.Places; 
import com.google.android.gms.maps.model.LatLngBounds; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.concurrent.TimeUnit; 

public class PlaceArrayAdapter 
     extends ArrayAdapter<PlaceArrayAdapter.PlaceAutocomplete> implements Filterable { 
    private static final String TAG = "PlaceArrayAdapter"; 
    private GoogleApiClient mGoogleApiClient; 
    private AutocompleteFilter mPlaceFilter; 
    private LatLngBounds mBounds; 
    private ArrayList<PlaceAutocomplete> mResultList; 

    /** 
    * Constructor 
    * 
    * @param context Context 
    * @param resource Layout resource 
    * @param bounds Used to specify the search bounds 
    * @param filter Used to specify place types 
    */ 
    public PlaceArrayAdapter(Context context, int resource, LatLngBounds bounds, 
          AutocompleteFilter filter) { 


     super(context, resource); 
     mBounds = bounds; 
     mPlaceFilter = filter; 
    } 

    public void setGoogleApiClient(GoogleApiClient googleApiClient) { 
     if (googleApiClient == null || !googleApiClient.isConnected()) { 
      mGoogleApiClient = null; 
     } else { 
      mGoogleApiClient = googleApiClient; 
     } 
    } 

    @Override 
    public int getCount() { 
     return mResultList.size(); 
    } 

    @Override 
    public PlaceAutocomplete getItem(int position) { 
     return mResultList.get(position); 
    } 

    private ArrayList<PlaceAutocomplete> getPredictions(CharSequence constraint) { 
     if (mGoogleApiClient != null) { 
      Log.i(TAG, "Executing autocomplete query for: " + constraint); 
      PendingResult<AutocompletePredictionBuffer> results = 
        Places.GeoDataApi 
          .getAutocompletePredictions(mGoogleApiClient, constraint.toString(), 
            mBounds, mPlaceFilter); 
      // Wait for predictions, set the timeout. 
      AutocompletePredictionBuffer autocompletePredictions = results 
        .await(60, TimeUnit.SECONDS); 
      final Status status = autocompletePredictions.getStatus(); 
      if (!status.isSuccess()) { 
       Toast.makeText(getContext(), "Error: " + status.toString(), 
         Toast.LENGTH_SHORT).show(); 
       Log.e(TAG, "Error getting place predictions: " + status 
         .toString()); 
       autocompletePredictions.release(); 
       return null; 
      } 

      Log.i(TAG, "Query completed. Received " + autocompletePredictions.getCount() 
        + " predictions."); 
      Iterator<AutocompletePrediction> iterator = autocompletePredictions.iterator(); 
      ArrayList resultList = new ArrayList<>(autocompletePredictions.getCount()); 
      while (iterator.hasNext()) { 
       AutocompletePrediction prediction = iterator.next(); 
       resultList.add(new PlaceAutocomplete(prediction.getPlaceId(), 
         prediction.getDescription())); 
      } 
      // Buffer release 
      autocompletePredictions.release(); 
      return resultList; 
     } 
     Log.e(TAG, "Google API client is not connected."); 
     return null; 
    } 

    @Override 
    public Filter getFilter() { 
     Filter filter = new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults results = new FilterResults(); 
       if (constraint != null) { 
        // Query the autocomplete API for the entered constraint 
        mResultList = getPredictions(constraint); 
        if (mResultList != null) { 
         // Results 
         results.values = mResultList; 
         results.count = mResultList.size(); 
        } 
       } 
       return results; 
      } 

      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
       if (results != null && results.count > 0) { 
        // The API returned at least one result, update the data. 
        notifyDataSetChanged(); 
       } else { 
        // The API did not return any results, invalidate the data set. 
        notifyDataSetInvalidated(); 
       } 
      } 
     }; 
     return filter; 
    } 

    class PlaceAutocomplete { 

     public CharSequence placeId; 
     public CharSequence description; 

     PlaceAutocomplete(CharSequence placeId, CharSequence description) { 
      this.placeId = placeId; 
      this.description = description; 
     } 

     @Override 
     public String toString() { 
      return description.toString(); 
     } 
    } 
} 

MainActivity类别: -

package com.example.keita.googleplaces; 

import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.text.Html; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AutoCompleteTextView; 
import android.widget.TextView; 
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.PendingResult; 
import com.google.android.gms.common.api.ResultCallback; 
import com.google.android.gms.location.places.Place; 
import com.google.android.gms.location.places.PlaceBuffer; 
import com.google.android.gms.location.places.Places; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.LatLngBounds; 

public class MainActivity extends AppCompatActivity implements 
     GoogleApiClient.OnConnectionFailedListener, 
     GoogleApiClient.ConnectionCallbacks{ 
    private static final String LOG_TAG = "MainActivity"; 
    private static final int GOOGLE_API_CLIENT_ID = 0; 
    private AutoCompleteTextView mAutocompleteTextView; 
    private TextView mNameTextView; 
    private TextView mAddressTextView; 
    private TextView mIdTextView; 
    private TextView mPhoneTextView; 
    private TextView mWebTextView; 
    private TextView mAttTextView; 
    private GoogleApiClient mGoogleApiClient; 
    private PlaceArrayAdapter mPlaceArrayAdapter; 
    private static final LatLngBounds LAT_LNG_BOUNDS = new LatLngBounds(
      new LatLng(32.6393,-117.004304), new LatLng(44.901184 ,-67.32254)); 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 

     mGoogleApiClient = new GoogleApiClient.Builder(MainActivity.this) 
       .addApi(Places.GEO_DATA_API) 
       .enableAutoManage(this, GOOGLE_API_CLIENT_ID, this) 
       .addConnectionCallbacks(this) 
       .build(); 
     mAutocompleteTextView = (AutoCompleteTextView) findViewById(R.id 
       .autoCompleteTextView); 
     mAutocompleteTextView.setThreshold(3); 
     mNameTextView = (TextView) findViewById(R.id.name); 
     mAddressTextView = (TextView) findViewById(R.id.address); 
     mIdTextView = (TextView) findViewById(R.id.place_id); 
     mPhoneTextView = (TextView) findViewById(R.id.phone); 
     mWebTextView = (TextView) findViewById(R.id.web); 
     mAttTextView = (TextView) findViewById(R.id.att); 
     mAutocompleteTextView.setOnItemClickListener(mAutocompleteClickListener); 
     mPlaceArrayAdapter = new PlaceArrayAdapter(this, android.R.layout.simple_list_item_1, 
       LAT_LNG_BOUNDS, null); 
     mAutocompleteTextView.setAdapter(mPlaceArrayAdapter); 
    } 
    private AdapterView.OnItemClickListener mAutocompleteClickListener 
      = new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      final PlaceArrayAdapter.PlaceAutocomplete item = mPlaceArrayAdapter.getItem(position); 
      final String placeId = String.valueOf(item.placeId); 
      Log.i(LOG_TAG, "Selected: " + item.description); 
      PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi 
        .getPlaceById(mGoogleApiClient, placeId); 
      placeResult.setResultCallback(mUpdatePlaceDetailsCallback); 
      Log.i(LOG_TAG, "Fetching details for ID: " + item.placeId); 
     } 
    }; 

    private ResultCallback<PlaceBuffer> mUpdatePlaceDetailsCallback 
      = new ResultCallback<PlaceBuffer>() { 
     @Override 
     public void onResult(PlaceBuffer places) { 
      if (!places.getStatus().isSuccess()) { 
       Log.e(LOG_TAG, "Place query did not complete. Error: " + 
         places.getStatus().toString()); 
       return; 
      } 
      // Selecting the first object buffer. 
      final Place place = places.get(0); 
      CharSequence attributions = places.getAttributions(); 

      mNameTextView.setText(Html.fromHtml(place.getName() + "")); 
      mAddressTextView.setText(Html.fromHtml(place.getAddress() + "")); 
      mIdTextView.setText(Html.fromHtml(place.getId() + "")); 
      mPhoneTextView.setText(Html.fromHtml(place.getPhoneNumber() + "")); 
      mWebTextView.setText(place.getWebsiteUri() + ""); 
      if (attributions != null) { 
       mAttTextView.setText(Html.fromHtml(attributions.toString())); 
      } 
     } 
    }; 

    @Override 
    public void onConnected(Bundle bundle) { 
     mPlaceArrayAdapter.setGoogleApiClient(mGoogleApiClient); 
     Log.i(LOG_TAG, "Google Places API connected."); 

    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     Log.e(LOG_TAG, "Google Places API connection failed with error code: " 
       + connectionResult.getErrorCode()); 

     Toast.makeText(this, 
       "Google Places API connection failed with error code:" + 
         connectionResult.getErrorCode(), 
       Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     mPlaceArrayAdapter.setGoogleApiClient(null); 
     Log.e(LOG_TAG, "Google Places API connection suspended."); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

content_main.xml: -

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="com.example.keita.googleplaces.MainActivity" 
    tools:showIn="@layout/activity_main"> 

    <AutoCompleteTextView 
     android:id="@+id/autoCompleteTextView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="50dp" 
     android:hint="Enter Place Here"/> 

    <TextView 
     android:id="@+id/header" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/autoCompleteTextView" 
     android:layout_marginTop="20dp" 
     android:text="Selected Place:" 
     android:textStyle="bold"/> 

    <TextView 
     android:id="@+id/name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/header" 
     android:layout_marginTop="20dp"/> 

    <TextView 
     android:id="@+id/address" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/name"/> 

    <TextView 
     android:id="@+id/place_id" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/address"/> 

    <TextView 
     android:id="@+id/phone" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/place_id" 
     android:autoLink="phone"/> 

    <TextView 
     android:id="@+id/web" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/phone" 
     android:autoLink="web"/> 

    <TextView 
     android:id="@+id/att" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:autoLink="web"/> 

    ImageView 
     android:id="@+id/poweredBy" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/att" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:src="@drawable/powered_by_google_light"/> 

    ImageView 
     android:id="@+id/truiton_image" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:layout_above="@+id/poweredBy" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:layout_marginBottom="-20dp" 
     android:src="@mipmap/ic_launcher"/> 


</LinearLayout> 

回答

1

只需添加到您查询您发送给Google Places API的:

components=country:your_country_code 

你可以找到国家代码here

https://maps.googleapis.com/maps/api/place/autocomplete/json?input=bhubaneshwar&components=country:in&sensor=false&key=your_key 

让我知道这是你想要的。

谢谢

7

在Android中,我们可以用这种方式限制:

添加AutoCompletionFilter在你的代码,而不是通过


要限制谷歌的地方autocomplement澳大利亚。

AutocompleteFilter filter = 
    new AutocompleteFilter.Builder().setCountry("AU").build(); 

国家限制结果。这应该是ISO 3166-1 Alpha-2国家代码(不区分大小写)。如果没有设置,则不会进行国家/地区过滤。 ,给予不同的国家代码https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2

@Saipraneeth难敌正确的行代码如下链接:

mPlaceArrayAdapter = 
    new PlaceArrayAdapter(this, 
          android.R.layout.simple_list_item_1, 
          LAT_LNG_BOUNDS, 
          filter); 
+1

感谢。让我的一天:) – pRaNaY

相关问题