twitter
    Find out what I'm doing, Follow Me :)

Android Programlama Google Places Api Kullanımı


Yapılan lokasyon uygulamalarında çevrede bulunan restaurant, cafe, atm gibi günlük hayatta yer bilgilerine ihtiyaç duyduğumuz yerler listelenmekte , bunların haritada gösterilmesi ,detaylarının getirilmesi gibi işlevler bulunmaktadır. Bunları yapılabilmesi için google gerekli apileri sağlamaktadır. Daha önce Google Maps ile ilgili pi key alımı ve kullanımından bahsetmiştim. Şimdi ise restaurant ,cafe gibi yerlerin getirilmesini sağlayan Google Places Api den bahsedeceğim. Bu api ile Google'ın desteklediği birçok lokasyon türü ile arama işlemi gerçekleştirilmektedir.

Desteklenen lokasyon türlerinin listesi :
https://developers.google.com/places/documentation/supported_types

Ayrıca bu api ile birlikte çevrede bulunan yerler , bu yerlerin detay bilgileri gibi ek özellikler de getirilebilmektedir. (Bu yerler ile ilgili yönlerin çizilebilmesi için Google Maps in en az Version2 ile birlikte Google Directions Apinin kullanılması gerekmektedir.)

Lokasyonların getirilmesi için https://code.google.com/apis/console/# adresinden Places Api keyi alınır.Bu alınan key uygulamada kullanacaktır.

Şimdi Projemizi Oluşturalım:




Bu aşamadan sonra Next deyip en son finish butonuna tıklayarak projemizi oluştuyoruz.

Yaptığımız örnek uygulamada örnek olarak 3 lokasyon türü radiobuttonlarla verilcek , seçilen türe göre belirlediğimiz yarıçap ölçüsüne göre, çevremizde bulunan lokasyonlar listelenecek. Bunun için öncelikle ActivityMain.xml layoutumza radioGroup ve listeleme işlemini yapacak bir buton ekliyoruz. Bu eklediğimiz arayüz elemanlarını MainActivity.java classımıza oluşturuyoruz.

  final RadioButton rbRestaurant = (RadioButton)findViewById(R.id.radioRes);
final RadioButton rbCafe = (RadioButton)findViewById(R.id.radioCafe);
final RadioButton rbAtm = (RadioButton)findViewById(R.id.radioAtm);
final TextView tv = (TextView)findViewById(R.id.textView1);
final Bundle bundleProp = new Bundle();
final Intent  intent = new Intent(getApplicationContext(),listplaces.class);
Button btn =(Button) findViewById(R.id.btnShow);


Daha sonra seçtiğimiz radiobutona göre lokasyon türü belirlenip bundle araclığıyla , listleme yaplıacağı acitivye gönderilir. Bunun için aşağıdaki işlemler yapılır:

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (rbRestaurant.isChecked()==true){
type = "restaurant";
}
if (rbCafe.isChecked()==true){
type = "cafe";
}
if (rbAtm.isChecked()==true){
type = "atm";
}
bundleProp.putString("filter",type);
intent.putExtras(bundleProp);
startActivity(intent);
}
});


Daha sonra listeleme işlemin yapılacağı ve çekilen yerlerin listeleneceği listplace.xml layoutunu ve listplace.java classını oluşturuyoruz. Burada şu tanımlamaları yapıyoruz :

 // Bundle for getting data
private Bundle veriler;
// Type of location for filter
private String type;
// ListView for list places
private ListView listview ;
// URL for google places API
private String requestSearchUrl;
// Progress dialog
private ProgressDialog progDialog;
// ArrayList of places
public ArrayList<String> places = new ArrayList<String>();


Bu tanımlamlarda şu işlemler yapılmaktadır :

Bundle tanımıyla MainActivity classından gelen type verisinin alınması gerçekleştirilir.Type değişkeni lokasyon türünü belirtir.Listeleme işlemi için bir listview tanımlaması yapılır. Daha sonra bilgileri çekeceğimiz Url tanımlaması , apiden verilerin çekilmesi sırasında arka planda işlem yapıldığını gösteren progressDialog ve çekilen yerlerin tutulacağı String türünde bir arraylist tanımlaması yapılır.

Bu işlemlerden sonra onCreate methodumuzda şunlar yapılır :


  super.onCreate(savedInstanceState);
setContentView(R.layout.listplaces);
listview = (ListView)findViewById(R.id.listView1);  
// Get places from Google Maps with type
veriler = getIntent().getExtras();
// Getting type from MainActivity with bundle
type = veriler.getString("filter");
// Request URL for searching places
requestSearchUrl = "https://maps.googleapis.com/maps/api/place/search/json?types="+type+"&radius=2000&sensor=false&key=AIzaSyCDRPmRMpTeMuETtL2Q3a7Ty2trBowYWRE&location=41.042074,28.953094";
// Call asyncTask
new AsyncTaskclass().execute();


Burada new AsyncTaskclass().execute(); ile yerlerin çekilmesi sırasında kullanıcıya arka planda işlemlerin yapıldıgını gösteren dialog gösterilmesini sağlar.


 private class AsyncTaskclass extends AsyncTask<Void, Integer, Void> {
@Override
protected void onPreExecute() {
// Creating progress dialog
progDialog = new ProgressDialog(listplaces.this);
progDialog.setMessage(Html.fromHtml("Searching   : "+ "<br><b>"+type+"</b></br>"));
progDialog.show();
}
@Override
protected Void doInBackground(Void... params) {
// Searching places
getPlaces(requestSearchUrl);
return null;
}
@Override
protected void onPostExecute(Void result) {
// Close progressDialog and set adapter to listView
progDialog.dismiss();
runOnUiThread(new Runnable() {
public void run() {
  ListView listView1 = (ListView)findViewById(R.id.listView1);
  MyCustomAdapter adapter = new MyCustomAdapter(listplaces.this, R.layout.listplaces, places);
  listView1.setAdapter(adapter);
  progDialog.dismiss();
}
});
}
}


Bu class tanımlamamız 3 adımdan oluşur , sırasıyla : onPreExecute, doinBackground ve onPostExecute. onPreExecute kısmında dialog kısmının görünmesini sağlar. DoinBackGround kısmında ise arka planda yapılan işler çağrılır. onPostExecute da doinBackGrounda yapılan işlemler bittikten sonra yapılması gereken diğer işlemleri gerçekleştirir. Burada getPlaces methodu ile Google Places Apiden yerlerin çekilmesi doinBackgorunda kısmında yapılırken bu işlem bittikten sonra çekilen yerlerin listesinin gösterilmesi için onPostExecute kısmında lisviewın adapterı set edilir ve böylece listview beslenmiş olur. Dialog da kapatılır.

Şimdi ise yerlerin çekilmesi için Json ile parse işlemi yapacağız. Bunun için methoda gerekli url verilir . Bu url ile Json yardımıyla gerekli olan name stringi karşısıındaki değerler çekilir. (JSON yapısını  daha sonraki yazımda anlatacağım). Bu method ve yardımcı methodu aşağıdaki gibidir :


/**This method  processing JSON with JavaScript and searching nearby places 
* @param requestUrl
*/
private void getPlaces(String requestUrl){
String result = null;
DefaultHttpClient client = new DefaultHttpClient();
try {
HttpGet httpget = new HttpGet(requestUrl);
HttpResponse response = client.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity!=null){
InputStream stream = entity.getContent();
result = convertToString(stream);
stream.close();
JSONObject jsonObject = new JSONObject(result);
JSONArray  jarray = jsonObject.getJSONArray("results");
for (int i = 0; i < jarray.length(); i++) {
JSONObject obje = jarray.getJSONObject(i);
places.add(obje.getString("name"));
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**This method inputStreams convert to string
* @param stream
* @return stringBuilder.toString()
*/
private String convertToString(InputStream stream){
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}


Bu fonksiyondan sonra onPostExecute methodunda yapılacak işlemler için gerekli olan CustomListView yapısı için class tanımlamızı yapalım. CustomListview listviewdan farklı olarak , yanında image gibi ek arayüz elemanlarını barındırır. Listviewdan gelişmiş bir yapıdır diyebiliriz. Bunun için class yapımız şu şekildedir :


 public class MyCustomAdapter extends ArrayAdapter<String> {
 public MyCustomAdapter(Context context, int textViewResourceId,
   ArrayList<String> xmlList) {
  super(context, textViewResourceId, xmlList);
  // TODO Auto-generated constructor stub
 }
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  // TODO Auto-generated method stub
  //return super.getView(position, convertView, parent);
  View row = convertView;
  if(row==null){
   LayoutInflater inflater=getLayoutInflater();
   row=inflater.inflate(R.layout.customlist, parent, false);
  }
  TextView label=(TextView)row.findViewById(R.id.text1);
  label.setText(places.get(position));
  ImageView image =(ImageView)row.findViewById(R.id.img);
  image.setImageResource(R.drawable.marker_blue);
  return row;
 }
}



Ayrıca uygulamaızın çalışabilmesi için permissionmızı eklemeiz gerekir. AndroidManifest.xml içinde şu izinimizi ekliyoruz ve AndroidManifest.xml içeriği şu şekilde olur :


 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.googleplaces"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.googleplaces.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
      
        <activity
            android:name=".listplaces"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="com.example.googleplaces.LISTPLACES" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>


Bu şekilde örnek uygulamamızı tamamlamış oluyoruz. Uygulamanın ekran görüntüleri şu şekildedir :



































4 yorum:

CI dedi ki...

Are you an app developer?

Unknown dedi ki...

Merhabalar,
Yazı için çok teşekkürler gerçekten işime yaradı :)
Arama yaparken harita üzerinde bir sınırlandırma yapabilir miyiz? mesela sadece İstanbul için. Şimdiden çok teşekkür ederim.

Unknown dedi ki...

requestSearchUrl 'ye girdiklerinizi açıklayabilir misiniz?

inderjitihlenfeld dedi ki...

Best sports toto | Sporting 100
Best sports toto sports toto. Sporting 100 바카라 사이트 검증 offers football match analysis, 슬롯 나라 betting 고양에프씨 tips, previews and advice for all leagues and competitions. 토토사이트 Sign up now and get an 토토 사이트 추천

Yorum Gönder