#11 – Android HTTP Requests: Android’ten Web Server ile İletişime Geçelim!
Merhaba, bu yazıda android ten web server ile iletişime geçen bir uygulamanın yapımı adım adım anlatılmıştır.
[wpdm_file id=9]Android telefonumuzdan yazdığımız bir mesajı gönder butonuna basarak istediğimiz bir web sayfamızın istediğimiz bir sayfasına gönderip ve de bu mesajları o sayfaya yazdıracağız. Evet Başlayalım!
Android iki tane HTTP client içerir bunlar: HttpUrlConnection ve Apache Client. Biz bu dersimizde Apache Client altındaki DefaulHttpClient sınıfını kullacağız. Bu sınıf http istekleri(requests) yapmamıza olanak verir ki bu da tam olarak bizim istediğimiz şey. Artık gerekli adımlara geçebiliriz.
Gerekli Adımlar:
1. Eclipse te yeni bir android projesi oluşturup bir isim verin.
2. İlk önce arayüzü oluşturalım. Bir başlık tabımız, bir mesaj kutumuz ve bir de gönder butonumuz olsun. Bunlar için aşağıda verdiğim kodu main.xml dosyasına girin. Bu kodları daha önce de kullandığımız için tekrar açıklamasını yapmıyorum. Açıklamaları için önceki derslerimize göz atabilirsiniz.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Android HTTP POST ile mesaj yollama" android:background="#0470d9" android:textColor="#fff" android:textSize="20dp" android:textStyle="bold" /> <TextView android:layout_marginTop="10dp" android:id="@+id/msj" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mesaj: " android:textColor="#fff" android:textSize="20dp" /> <EditText android:layout_marginTop="5dp" android:id="@+id/edmesaj" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" > <requestFocus /> </EditText> <Button android:id="@+id/gndr" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Gönder" android:onClick="send"/> </LinearLayout>
3. Uygulamamızda interneti kullanmamız gerektiğinden dolayı AndroidManifest.xml dosyasına aşağıda verdiğim internet iznini ekleyin:
<uses-permission android:name="android.permission.INTERNET" />
4. main.java ya da projenizin_ismi.java dosyasına aşağıda verdiğim kodları girin. Kodların açıklamaları aşağıda verilmiştir. Okumayı ihmal etmeyin.
package com.androidevreni.httprequests; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.EditText; public class AndroidHTTPRequestsActivity extends Activity { // değişkenleri giriyoruz EditText msg; String mesaj; // HTTP client oluşturuyoruz HttpClient httpClient = new DefaultHttpClient(); // HTTP post oluşturuyoruz HttpPost httpPost = new HttpPost( "web-sayfanızın-adresi"); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // nesneye ulaşıyoruz msg = (EditText) findViewById(R.id.edmesaj); } public void send(View v) { // mesajı kutudan alıp string e çeviriyoruz mesaj=msg.getText().toString(); // post parameterlerini oluşturuyoruz // bunlar key(anahtar) ve value(değer) List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(2); nameValuePair.add(new BasicNameValuePair("email", "user@gmail.com")); nameValuePair.add(new BasicNameValuePair("message", mesaj)); // post parametrelerini url ye ekliyoruz try { httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair)); } catch (UnsupportedEncodingException e) { // hata varsa loga yazdırıyoruz e.printStackTrace(); } // HTTP isteğini yapıyoruz try { HttpResponse response = httpClient.execute(httpPost); // cevabı loga yazdırıyoruz Log.d("Http Response:", response.toString()); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
5. Bu adımdan sonra server tarafını ayarlamamız gerekiyor. Bunun için web sayfanızda yeni bir sayfa açıp url den post parametlerini seçip alan ve bu değerleri bir dosyaya yazdıran php scripti yazmanız yeterlidir. Daha sonra bu dosyanın içeriğini de bir sayfanıza yazdırabilirsiniz. Bu şekilde uygulamamızdan gönderdiğiniz mesajımız direk istediğimiz sayfamızda görülücektir. Evet web ile iletişime geçtik, aşağıdaki videoyu izleyin!
6. Uygulamamızı Test Ediyoruz:
Bir Android yazısının daha sonuna geldik :). Yeni yazılar için Android Evreni‘ni Takip Etmeye Devam Edin.
Kolay gelsin.
do you have a twitter that i can follow
Hi, you can follow the new articles and tutorials using our Facebook or Google+ page or you can subscribe to our newsletter using register form in the right sidebar just by entering your email and activating it by using the email will be sent you!
Kolay gelsin
programı yüklediğimde
public class AndroidHTTPRequestsActivity extends Activity {
kısmında hata aldım buradaki AndroidHTTPRequestsActivity i main_activity şeklinde değiştirdim.
Programı derlediğimde ise Exception hatasına düştü log kayıtlarıma baktığımda ise
HttpResponse response = httpClient.execute(httpPost);
kısmında hata verdi acaba nerede yanlış yaptım.
saygılarımla
merhaba İbrahim bey,
size yardımcı olabilmem için log kayıtlarının tamamını görmem gerekiyor. Buraya yorum olarak yazabilirseniz yardımcı olurum.
10-12 13:47:57.644: W/dalvikvm(858): threadid=1: thread exiting with uncaught exception (group=0x41465700)
10-12 13:47:57.754: E/AndroidRuntime(858): FATAL EXCEPTION: main
10-12 13:47:57.754: E/AndroidRuntime(858): java.lang.IllegalStateException: Could not execute method of the activity
10-12 13:47:57.754: E/AndroidRuntime(858): at android.view.View$1.onClick(View.java:3633)
10-12 13:47:57.754: E/AndroidRuntime(858): at android.view.View.performClick(View.java:4240)
10-12 13:47:57.754: E/AndroidRuntime(858): at android.view.View$PerformClick.run(View.java:17721)
10-12 13:47:57.754: E/AndroidRuntime(858): at android.os.Handler.handleCallback(Handler.java:730)
10-12 13:47:57.754: E/AndroidRuntime(858): at android.os.Handler.dispatchMessage(Handler.java:92)
10-12 13:47:57.754: E/AndroidRuntime(858): at android.os.Looper.loop(Looper.java:137)
10-12 13:47:57.754: E/AndroidRuntime(858): at android.app.ActivityThread.main(ActivityThread.java:5103)
10-12 13:47:57.754: E/AndroidRuntime(858): at java.lang.reflect.Method.invokeNative(Native Method)
10-12 13:47:57.754: E/AndroidRuntime(858): at java.lang.reflect.Method.invoke(Method.java:525)
10-12 13:47:57.754: E/AndroidRuntime(858): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-12 13:47:57.754: E/AndroidRuntime(858): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-12 13:47:57.754: E/AndroidRuntime(858): at dalvik.system.NativeStart.main(Native Method)
10-12 13:47:57.754: E/AndroidRuntime(858): Caused by: java.lang.reflect.InvocationTargetException
10-12 13:47:57.754: E/AndroidRuntime(858): at java.lang.reflect.Method.invokeNative(Native Method)
10-12 13:47:57.754: E/AndroidRuntime(858): at java.lang.reflect.Method.invoke(Method.java:525)
10-12 13:47:57.754: E/AndroidRuntime(858): at android.view.View$1.onClick(View.java:3628)
10-12 13:47:57.754: E/AndroidRuntime(858): … 11 more
10-12 13:47:57.754: E/AndroidRuntime(858): Caused by: android.os.NetworkOnMainThreadException
10-12 13:47:57.754: E/AndroidRuntime(858): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
10-12 13:47:57.754: E/AndroidRuntime(858): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
10-12 13:47:57.754: E/AndroidRuntime(858): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
10-12 13:47:57.754: E/AndroidRuntime(858): at java.net.InetAddress.getAllByName(InetAddress.java:214)
10-12 13:47:57.754: E/AndroidRuntime(858): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
10-12 13:47:57.754: E/AndroidRuntime(858): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
10-12 13:47:57.754: E/AndroidRuntime(858): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
10-12 13:47:57.754: E/AndroidRuntime(858): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
10-12 13:47:57.754: E/AndroidRuntime(858): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
10-12 13:47:57.754: E/AndroidRuntime(858): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
10-12 13:47:57.754: E/AndroidRuntime(858): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
10-12 13:47:57.754: E/AndroidRuntime(858): at com.example.androidphp.main.send(main.java:66)
10-12 13:47:57.754: E/AndroidRuntime(858): … 14 more
FATAL EXCEPTION :main hatasının nedeni birden fazla şey olabilir,.java uzantılı activity kodlarınızı görmem gerekiyor. Ancak yazımda anlattığım adımları takip ettiyseniz ve gerekli kısımları kendi web serverınıza göre ayarladı iseniz çalışması gerekir.
java dosyasını adresinize mail olarak attım.
Hocam size düzeltilmiş ve çalışan halini email atıyorum. Dikkat etmeniz gereken şeyler şunlar:
1. Java dosyasındaki sınıfın ismi java dosyasının ismi ile aynı olmalıdır. Yani eğer java dosyasının ismi ‘MainActivity.java’ ise sınıfın ismi de MainActivity olmalıdır. Yani şöyle başlamalıdır:
public class MainActivity extends Activity
2. XML dosyasında oluşturduğumuz nesnelere java dosyasından ulaşırız. XML dosyasında oluşturduğumuz nesnelerin isimleri(idleri) ile onlara ulaşırız. Buna dikkat etmek gerekir, aksi takdirde eclipse hata verecektir.
3. AndroidManifest.xml dosyasına internet izni ile ilgili kodu eklemeniz gerekir. İnterneti kullandığımız için. Kodu aşağıda verdim tekrar.
4. Bir de nereye göndermek istiyorsanız o web sayfada bir php scripti olmalıdır, gelen mesajları ne yapmak istediğinize göre bu scripti yazmalısınız. Mesela size bir örnek vereyim:
——PHP KODUMUZ———–
<?php
// get the "message" variable from the post request
// this is the data coming from the Android app
$message=$_POST["message"];
echo $message;
// specify the file where we will save the contents of the variable message
$filename="androidmesajdosyamiz.html";
// write (append) the data to the file
if ($message!=null) {
file_put_contents($filename,$message,FILE_APPEND);
file_put_contents($filename,"
“,FILE_APPEND);
}
// load the contents of the file to a variable
$androidmessages=file_get_contents($filename);
// display the contents of the variable (which has the contents of the file)
echo $androidmessages;
?>
———–PHP KODUMUZUN SONU———–
Bu dediğim düzenlemeleri sizin gönderdiğiniz koda yaptıktan sonra sıkıntısız çalıştı.
Umarım yardımcı olabilmişimdir, kolay gelsin..
İbrahim bey, projeyi oluştururken minSDKVersion default olarak ‘2.2 versiyonu’ seçilidir. Onu 4.3 yaparsanız emülatörde büyük ihtimal çalışacaktır. Bu versiyon değerini AndroidManifest.xml dosyasından da değiştirebilirsiniz.
Çok teşekkürler ilginiz için.Elinize sağlık
Rica Ederim. Her zaman
PHP SCRİPTİ ve projenin kaynak dosyalarını paylaşabilir misiniz?
Merhaba A.D, yoğunluğumdan dolayı pek ilgilenemedim blogumla bir süredir. Kaynak kodları ve Php scripti bugün derse ekleyeceğim, indirirsiniz
Uygulama Source ünü ve PHP Scripti paylaşmamışsınız sanırım , en kısa zamanda paylaşabilir misiniz ?
merhaba, kaynak kod ve PHP script derse eklenmiştir. Oradan indirebilirsiniz. Kolay gelsin.
Hocam hocam
Android dersleriniz cok guzel ins. hizinizi kesmezsiniz
Bu konu da cok acik var ya =-O
teşekkürler :).
Merhaba, aslında çok önemli olan ve yeteri kadar bilgi bulunmayan bir konuda danışmak istedim. yapacağım android uygulamasında anlık olarak web serviceden data alışverişi sağlamam gerekiyor.Örn:borsa döviz takibi gibi uygulamalar var şuan.anlık olarak yeni veriler ekleniyor yada güncelleniyor. facebooktaki sayfa yenilenmeden eklenen haber akışları yada bildirimler gibi.Yapmak istediğim web sitemizden anlık olarak verilerin uygulamamıza akması. bu nasıl yapılıyor nasıl yapılabiliri. Teşekkür ederim şimdiden paylaşımlarınızı bekliyoruz.
merhaba,
şuan çok yoğunum, dediğiniz konu hakkında bir örnek hazırlayıp bir ders olarak yayınlayacağım. Üzgünüm şuan vaktim yok.
Admin bir konuda yardımına ihtiyacım var android eclipse üzerinden twitter da paylaşım yapmam gerekiyor nasıl bir yol izlemem gerek hiç bilmmedğim bi yazılım
yardımcı olursan çok sevinirim
admin androidten twitterda paylaşım yapmam gerekiyo bu konuya benzer mi acaba yardımcı olur musun
merhaba Adem bey,
size tam olarak istediğiniz konu hakkında bazı kaynaklar önereceğim.
Kaynak :
http://www.codelearn.org/android-tutorial/twitter/get_started
Kolay gelsin..
admin ilgin için teşekkürler ama nasıl bir yol izliyceğimi anlamadım neleri yüklemem gerek internet sitesi ingilizce çeviri yapıyorum ama bir şey anlamadım yardımcı olursan çok sevinirim ben bilgisayarıma eclipse yükleyip bu progamdan twitterde paylaşım yapmamı sağlıcak olan programı yapmam lazım konum bu türkçe bir site bulabilirmiyim nerelerde aramam lazım ilgili olduğun için çok saol
merhaba,
sorunuzu net olarak açıklamanız gerekiyor. Anladığım kadarıyla sizin probleminiz bir android uygulaması yazmak değil. Eğer öyle ise, sadece twitter da paylaşım yapmanızı sağlayacak bir program yazmanız gerekiyorsa durum değişir. “Java ile twitter da paylaşım, java ile tweet atmak” tarzı anahtar kelimeler ile arama yaparsanız bazı kaynaklar bulabilirsiniz.
İyi çalışmalar.
android eclipse ile twitterda paylaşım yapmamı sağlıcak olan program kodları lazım bana nerde bulablirim
merhaba Adem bey,
android ve eclipse birbirinden çok farklı şeyler. Eclipse bir IDE(Integrated Development Environment) dir. Android ise bir işletim sistemidir. Lütfen önce bunların ne olduğunu öğrenip sorunuzu düzgün şekilde sorun. Şuan probleminizi düzgün şekilde dile getiremiyorsunuz. Sorunuz açıklayıcı, düzgün ve net olmazsa size yardımcı olamam. İkincisi araştırmanızı kendiniz yapmak zorundasınız. Benden direk kodları istemeniz doğru değil.
İyi çalışmalar.
Mustafa hocam merhaba, sitenizi takip ediyorum
benim basit bir sorum olacak örneğin: xxx.com e-ticaret sitemizi apk ya nasıl çeviririz bunun için siteler var ama reklamlarıyla dolduruyorlar ve güvenemiyoruz . sitenizde rastlayamadık bu konuya. şimdiden teşekkür ederiz.
merhaba Muhammet bey,
ileri seviyede bir uygulama yapmak istemiyorsanız webview kullanabilirsiniz. İleri seviyede mesela bahsettiğiniz örnekler gibi bir uygulama düşünüyorsanız birkaç bloktan oluşmak zorunda olacak ve bir süreç alacaktır. Siz nasıl bir uygulama düşünüyorsunuz websiteniz için?
php dosyasının ıcıne baska herhangı bısey yazıyormuyuz peki ,bende hata verip durduruyor.
Hatayı buraya yazarsanız yardımcı olabilirim
Ben mi göremiyorum yoksa yapılmamış mı? Anlayamadığım bi nokta var… Gönder isminde bi button var ancak java kısmında tanımlanmamış ve
ve java kısmında SendMessage isminde bi method var ama o method bir buttonun click eventinde çağırılmamış…
button1.onclickListener gibi bir kullanım göremiyorum…
o halde sendmessage nasıl tetikleniyor?
layout dosyasında button tanımlarken: android:onClick=”send” ifadesi ile button a dokunulduğunda send(View v) metodu çağırılır. İllaki setOnClickListener demeye gerek yoktur.