Android Google Places API Place Autocomplete Kullanımı
Merhabalar, bu yazımda sizlere Place Autocomplete API’yi projemize nasıl dahil edebileceğimizden bahsedeceğim.
Place Autocomplete, otomatik olarak mekan adı tamamlamayı sağlar. Kullanıcı herhangi bir arama yapmaya başladığı anda yerlerin bir listesini sunar.
Place Autocomplete’i uygulamamıza dahil etmek için iki seçenek bulunmaktadır:
- AutocompleteSupportFragment kullanarak eklenebilir.
- AutoComplete Intent kullanarak eklenebilir.
Öncelikle AutocompleteSupportFragment’ın nasıl kullanılacağına bakalım.
NOT: Google Cloud Platform’undan Places API’yi etkinleştirip API Key oluşturmanız gerekmektedir. API Key’i nasıl oluşturacağınızı bilmiyorsanız daha önceki yazımdan faydalanabilirsiniz.
Key aldıktan ve Places API’yi etkinleştirdikten sonra values klasörü altında google_maps_api.xml adında bir dosya oluşturalım. Oluşturduğumuz dosya içerisine keyi ekleyelim.
google_maps_api.xml
<resources>
<string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">API_KEYINIZI_YAZINIZ</string>
</resources>
Manifest dosyası içerisinde bu keyi belirtmemiz gerekiyor.
AndroidManifest.xml
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />
Bir Activity oluşturalım. Places API’yi başlatmak için aşağıdaki satırları activityimize ekleyelim. Her iki yöntemde de Place API’yi kesinlikle başlatmamız gerekmektedir.
String apiKey = getString(R.string.google_maps_key);
if (!Places.isInitialized()) {
Places.initialize(getApplicationContext(), apiKey);
}
PlacesClient placesClient = Places.createClient(this);
1- AutocompleteSupportFragment Kullanımı
Oluşturduğumuz activitynin layoutuna AutocompleteSupportFragmenti ekleyelim.
activity_autocomplete_example.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".AutocompleteActivity">
<fragment
android:id="@+id/autocomplete_fragment"
android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"
tools:layout_editor_absoluteX="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
Oluşturduğumuz AutocompleteSupportFragmentin bir nesnesini oluşturarak bir PlaceSelectionListener ekleyelim. PlaceSelectionListener seçtiğimiz yer ile ilgili bize yanıt döndürür.
//autocompletefragment nesnesi oluşturur
AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);
//döndürülecek yer verisi türlerini belirtir
autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME));
//selected olayı gerçekleştiğinde kod bloğu çalıştırmaya yarar
autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
//selected işlemi gerçekleşince çalışacak kod bloğu
@Override
public void onPlaceSelected(Place place) {
Toast.makeText(getApplicationContext(), "Place: " + place.getName() + ", " + place.getId(),Toast.LENGTH_LONG).show();
}
//hata oluştuğunda çalışacak kod bloğu
@Override
public void onError(Status status) {
Toast.makeText(getApplicationContext(),"An error occurred: " + status,Toast.LENGTH_LONG).show();
}
});
Bu adımları gerçekleştirdikten sonra activity sınıfının son hali aşağıdaki gibi olacaktır.
AutocompleteExampleActivity.java
public class AutocompleteExampleActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_autocomplete_example);
String apiKey = getString(R.string.google_maps_key);
if (!Places.isInitialized()) {
Places.initialize(getApplicationContext(), apiKey);
}
PlacesClient placesClient = Places.createClient(this);
//autocompletefragment nesnesi oluşturur
AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);
//döndürülecek yer verisi türlerini belirtir
autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME));
//selected olayı gerçekleştiğinde kod bloğu çalıştırmaya yarar
autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
//selected işlemi gerçekleşince çalışacak kod bloğu
@Override
public void onPlaceSelected(Place place) {
Toast.makeText(getApplicationContext(), "Place: " + place.getName() + ", " + place.getId(), Toast.LENGTH_LONG).show();
}
//hata oluştuğunda çalışacak kod bloğu
@Override
public void onError(Status status) {
Toast.makeText(getApplicationContext(), "An error occurred: " + status, Toast.LENGTH_LONG).show();
}
});
}
}
İşte bu kadar :)
2- AutoComplete Intent Kullanımı
Bu işlemi gerçekleştirmek için öncelikle uygulamamızda bulunan toolbar içerisine search iconu ekleyelim. Search iconu eklemek için: res -> Android resource file -> Resource type : Menu seçeneğini seçerek dosyamıza bir isim verelim. Oluşturduğumuz dosya içerisine aşağıdaki satırları ekleyelim.
toolbar_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="@string/action_search"
app:showAsAction="always" />
</menu>
Oluşturduğumuz menüyü toolbar içerisine eklememiz için onCreateOptionsMenu() methodunu activity içerisine ekleyelim.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_menu, menu);
return true;
}
Daha sonra hangi elemana tıklandığının kontrolünü yapabilmek için onOptionsItemSelected() methodunu ekleyelim.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.search:
onSearchCalled();
return true;
default:
return false;
}
}
Search iconuna tıklandığında Autocomplete.IntentBuilder’ı başlatmak için onSearchCalled() methodunu oluşturalım. startActivityForResult() methodu activityler arası geçiş yapılmasını sağlar.
public void onSearchCalled() {
//döndürülecek yer verisi türlerini belirtir
List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME);
// autocomplete intentini başlatır
Intent intent = new Autocomplete.IntentBuilder(
AutocompleteActivityMode.FULLSCREEN, fields)
.build(this);
startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);
}
Activityler arası geçiş yapıldıktan sonra yeni activityde bulunan bilginin önceki activitye iletilmesi için onActivityResult() methodu kullanılır.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == AUTOCOMPLETE_REQUEST_CODE) {
//başarılı sonuç döndürüldüğünde çalışacak kod bloğu
if (resultCode == RESULT_OK) {
Place place = Autocomplete.getPlaceFromIntent(data);
Toast.makeText(getApplicationContext(), "Place: " + place.getName() + ", " + place.getId(), Toast.LENGTH_LONG).show();
}
//hata oluştuğunda çalışacak kod bloğu
else if (resultCode == AutocompleteActivity.RESULT_ERROR) {
Status status = Autocomplete.getStatusFromIntent(data);
Toast.makeText(getApplicationContext(), status.getStatusMessage(), Toast.LENGTH_LONG).show();
}
}
}
Bu adımları da gerçekleştirdikten sonra activity sınıfının son hali aşağıdaki gibi olacaktır.
AutocompleteExampleActivity.java
public class AutocompleteExampleActivity extends AppCompatActivity {
private static final int AUTOCOMPLETE_REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_autocomplete_example);
String apiKey = getString(R.string.google_maps_key);
if (!Places.isInitialized()) {
Places.initialize(getApplicationContext(), apiKey);
}
PlacesClient placesClient = Places.createClient(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.search:
onSearchCalled();
return true;
default:
return false;
}
}
public void onSearchCalled() {
//döndürülecek yer verisi türlerini belirtir
List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME);
// autocomplete intentini başlatır
Intent intent = new Autocomplete.IntentBuilder(
AutocompleteActivityMode.FULLSCREEN, fields)
.build(this);
startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == AUTOCOMPLETE_REQUEST_CODE) {
//başarılı sonuç döndürüldüğünde çalışacak kod bloğu
if (resultCode == RESULT_OK) {
Place place = Autocomplete.getPlaceFromIntent(data);
Toast.makeText(getApplicationContext(), "Place: " + place.getName() + ", " + place.getId(), Toast.LENGTH_LONG).show();
}
//hata oluştuğunda çalışacak kod bloğu
else if (resultCode == AutocompleteActivity.RESULT_ERROR) {
Status status = Autocomplete.getStatusFromIntent(data);
Toast.makeText(getApplicationContext(), status.getStatusMessage(), Toast.LENGTH_LONG).show();
}
}
}
}
Projemizi çalıştırdığımızda uygulamaya ait ekran görüntüsü aşağıdaki gibi olacaktır.
Böylece Google Places API Place Autocomplete servisini nasıl kullanacağımızı öğrenmiş olduk. Daha fazla bilgi için Google Maps dokümantasyonunu inceleyebilirsiniz.