Herkese tekrardan merhaba.
Bu aralar Android’e merak salmış vaziyetteyim.
Üniversite yıllarında yazdığım masaüstü uygulaması olan Muhbir – Informant için, gelen fazlaca talepler doğrultusunda mobil platforma entegre etmeye karar verdim. Prototip halini yazdım ve hatta geçen hafta Makros Bilgisayar adlı bilişim firması ile kurumsal anlamda satışı için anlaşma sağladım. Projeme destek oldular ve daha geniş kapsamlı ele aldık yazılımı. Önümüzdeki aylarda yeni ismiyle beraber ve daha kurumsal bir yapıda; yazılımın yeni özellikleriyle karşınıza çıkacak.
Aldığımız kararlar doğrultusunda hukuki anlamda ne kullanıcılarımızın ne de firmamızın sıkıntı yaşanmaması adına bireysel müşterilere değil, kurumsal firmalara satışını gerçekleştirmeye karar verdik. Çünkü bireysel kullanıcılar; kişisel bilgisayarlarına kuracaklarını iddia etseler de üçüncü bir kişinin bilgisayarına gizli kurduğu takdirde yasal sorumluluk tamamen kendisine aittir. Kaldı ki hiçbir şekilde yazılımı yazan sorumlu tutulamadığı gibi sadece şahitlik bakımından davaya müdahil olmaktadır. Çünkü yazdığım yazılımda sözleşmede tüm sorumluluk belirtilerek kullanıcı onaylayarak kurulum işlemini tamamlayabilmekteydi.
* * *
Bildiğiniz üzere Microsoft’un yaklaşık bir hafta kadar önce Xamarin’i satın alarak, daha iyi geliştirmeler yapacağını umduğum bu teknoloji sayesinde; Java öğrenmeden .Net ortamında kodlarınızı mobil platforma entegre edebilme imkanına sahipsiniz.
Xamarin’den bahsetmek gerekirse aslında bir bileşendir. Mono ile gelen bir teknoloji olmasına rağmen, adı günümüzde çok sık duyulmaya başlandı. Microsoft 2011 yılından beri bu teknolojiyi yakından izliyor ve şu ana kadar yapılan resmi açıklamalara göre 82 milyon dolar kadar bir yatırım yaptı. VS 2015 (Visual Studio) kullananlar bilirler ki Xamarin’i yeni projeler geliştirdiğimizde sol framede görebiliyorduk. Team Service veya Azure entegrasyonuyla da inceleme fırsatımız vardı. Gün geldi çattı ve Microsoft mobil platformda başarılı olmak için kendi renklerine katmak istedi, geçen hafta resmi olarak satın aldı.
.Net ortamında hep uygulama geliştirenler için oldukça ideal ve mobil platformlar için başlangıç seviyesi olabilir; ancak bir Java kadar rahat değil, bunu baştan söylemem gerekir. Çünkü optimize ve performans bakımından oldukça başarı geliyor bana Java. Yani Java, Android’te başarılı uygulama geliştirmek isteyenler için birebir.
“Ben .Net kullanırım, başka bir şey kullanmam” diyenleri de anlamam. Yenilik istiyorsak, algıyı açmak istiyorsak ve yeni diğer teknolojileri değerlendirme ihtiyacı doğurur, ki hangisi daha iyi hangisi kötü ayırt edebilelim. “.NET’ten şaşmam!” diyorsan, şuraya alalım sizi [1].
Microsoft’un Xamarin başarısını ise ileri zamanlarda göreceğiz. Yapılan resmi açıklamalara göre Nisan aylarında gelecek yeniliklerle performans bakımından oldukça daha ileri seviyeye çekileceğini belirtti. Merakla bekliyoruz efendim.
Şimdi gelelim bizim konuya..
* * *
Sizlere bu makaleyi video şeklinde çekip, en baştan nasıl yaptığımı göstermek isterdim ancak bu işlem için çok geç. Xamarin nasıl kurulur, nasıl debug modda telefon çalıştırılır, driverların kurulumu falan filan hiç Amerika’yı yeniden keşfetmeye gerek yok. Yeniden Windows kurulum ihtiyacım olduğunda elbet çeker, bu makalenin ilgili yerinde paylaşırım; sizlerde görmüş olursunuz.
Ben doğrudan kaynak kodlara, Xamarin’in genel yapısını ve bu işin püf noktasını göstermeye çalışacağım. Çünkü Xamarin ile alakalı araştırmalar yaptığımda, evet benden önce birileri “Gelen & Giden çağrıları” gösteren uygulamalar yazmışlar, hatta “Anında gelen & giden mesajları göstermeyi” bile yapmışlar 🙂
Ama bir kişi de, “Mevcut olan mesajları bulmayı” yazmamış, işte burada ben devreye giriyorum.
Hadi başlayalım.
* * *
Sisteminizde kurulu olması gerekenler:
- Visual Studio 2015, 2017 (Bu proje 2015 Enterprise içerisinde gerçekleştirildi)
- Xamarin Studio
- Kendi Android telefonunuzda denemeyi düşünüyorsanız, ilgili telefonun driverlarının yüklü olması.
İlk yapmanız gereken VS 2015’te yeni bir proje oluşturmak, ilgili adımlar New Project ->Visual C# -> Android -> Blank App (Android)
Resim 1Yeni proje ekledikten sonra, Resim 1’de görüldüğü gibi Solution Explorer’da ilgili alanlar gözükecektir.
Şimdi Xamarin’de uygulama geliştirmenin esas noktasına gelelim.
Layout ve Class’lardan bahsedelim.
Layout, aslında uygulamamızdaki tasarımıdır, katmanıdır. Yani uygulamaya eklemek istediğimiz nesneleri, araçları, resimleri veya yazıları burada yaparız. Default olarak “Main.axml” gelecektir. İçerisini açtığınızda varsayılan olarak eklendiğini göreceksiniz. Layout -> Main.axml yönergelerini takip ederek, ilgili axml dosyasına çift tıklamanız yeterlidir Solution Explorer üzerinden.
Resim 2Resim 2’de gördüğünüz ve bir bakışta anlayacağınız üzere, bu bir basit “Kaç defa tıklandığını” gösteren bir uygulama. Klasik Hello World işte 😉
Peki bu tasarımı oluşturan asıl kodlara nerede?
İşte burada devreye XAML devreye giriyor. XML yapısına benzer, WPF ile tanıdığımız özellik var. Resim 2’in sol alt köşesinde bulunan Desing | Source kısmı dikkatinizi çekmiştir. Source’a tıklayalım ve görelim bu tasarımı oluşturan ilgili kodlara.
Resim 3’te görüldüğü üzere bir XML yapısından esinlenmiş ve ilgili butona ait nitelikler tanımlanmış. Yükseklik boyutu, içerisindeki metin, name (id) gibi alanlar tanımlı.
Burada dikkatinizi çekmesini istediğim şey, id alanı. Birazdan göreceğimiz Resim 4’te, bu buton nesnesine id üzerinden erişeceğiz. Burada Id yani Name kısmı MyButton diye geçmekte. Bir nesneye ID tanımlamak için @+id/Nesneİsmi mantığı kullanılmış.
Şimdi Solution Explorer’da yer alan MainActivity.cs dosyasına çift tıklayalım. Bu formun kullanıcıya gösterilmesi ve butona tıklandığında ne yapması gerektiğini ifade eden alanları inceleyelim.
Resim 4Resim 4’te görüldüğü üzere kodlar gene hazır default olarak gelmiş ve Main.axml içerisinde yer alan butona tıklandığında yapılacak işlemler tanımlanmış.
Uygulamadaki MainActivity aslında bizim kod alanımızdır. Yani classlar üzerinden formdaki nesneye erişeceğiz, ilgili eventları, tanımlamaları burada yaparak çalışmasını istediğimiz şeyleri burada yapacağız.
Dikkatinizi çekerse Override edilmiş bir void içerisinde base’in altına yazılmış asıl kodlar.
SetContentView(Resource.Layout.Main): Uygulamamızın ilk çalıştırıldığında hangi formun ekrana geleceğini ifade eder. Masaüstünde formlarla uygulama yazan arkadaşlar Application.Run() özelliğini hatırlayacaktır. Mantık aynıdır.
Formdaki nesneye ise FindViewById ile ulaşmaktayız ve değişken olarak tanımladığımız bir buton nesnesine atanmış Resim 4’te.
Button button = FindViewById<Button>(Resource.Id.MyButton);
Yukarıdaki kod ile button adlı oluşturduğumuz Button değişkenine, Layout içerisinde yer alan buton nesnesine ulaştık. Buradaki en önemli etken ID’ye ulaşmaktır ve axml içerisinde tanımlı ilgili butonun ID’sinin MyButton olmasıdır.
button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };
Buradaki kodlarda ise layout içerisinde yer alan butona tıklandığında, hangi işlemi gerçekleştireceğini delegate ile tanımlamıştır. Yani bu kodlar derlenecek ve butonun Click event’ı çalıştığında ilgili delegate arasında yazdığımız kodlar aktif olarak, ilgili işlemi gerçekleştirecektir.
* * *
Mesajları okumak için örnek teşkil etmesi adına prototip yapabileceğimiz uygulama yazacağım. Yeni bir proje oluşturdum ve adını EKY.Mobile koydum.
Resim 5’teki gibi EKY.axml Layout’u oluşturdum olacaktır (Layout klasörüne sağ tıklayıp -> Add -> New Item dedikten sonra adını EKY.axml diye değiştirmeniz yeterli). XAML kodlarını Source alanına geçerek, kopyala/yapıştır şeklinde de otomatik gerçekleştirebilirsiniz:
Resim 5<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/editText" android:layout_width="fill_parent" android:layout_height="198.0dp" android:textAlignment="viewStart" /> <Button android:text="Button" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/buttonEKY" /> </LinearLayout>
Buraya kadar işlemimiz form ekranımızın tasarımıydı.
Xamarin’de eğer Android’in bazı özelliklerinden yararlanmak adına API’lerini kullanarak çalışmak istiyorsanız, yetkilendirme tanımlamanız gerekmektedir. Örneğin şimdi biz bu uygulamamızda mesajları okumak, telefona gelen kayıtları görüntülemek istiyorsak; bunun için özel izinleri uygulamamızda tanımlamamız gerekmektedir.
Bu işlemi Solution Explorer üzerinden, ilgili projemizin Properties kısmından yapıyoruz.
Android Manifest sekmesinde, Required permissions alanlarından Resim 6’te yer alan alanlar seçilmelidir.
Şimdi gelelim kodlara.
Direk doğrudan kodları, MainActivity.cs içerisinde yer alan alana yapıştırmanız veya kendinize göre düzenlemeniz yeterlidir.
using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using Android.Webkit; using Android.Provider; using System.Collections.Generic; using Java.Text; namespace EKY.Mobile { [Activity(Label = "EKY.Mobile", MainLauncher = true, Icon = "@drawable/icon")] [IntentFilter(new string[] { "android.provider.Telephony.READ_SMS" }, Priority = (int)IntentFilterPriority.HighPriority)] public class MainActivity : Activity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Set our view from the "main" layout resource SetContentView(Resource.Layout.EKY); // Get our button from the layout resource, // and attach an event to it Button button = FindViewById<Button>(Resource.Id.buttonEKY); button.Text = "GİT!"; button.Click += delegate { //Gelen son 10 çağrıyı bulur. //Değiştirmek için querySorter değişkeninde yer alan limit 10 kısmını değiştirmek yeterli var editText = FindViewById<EditText>(Resource.Id.editText); editText.Text = "http://eniskurtayyilmaz.com"; editText.Text = "Gelen çağrılar:" + "\n"; string queryFilter = String.Format("{0}={1}", CallLog.Calls.Type, (int)CallType.Incoming); string querySorter = String.Format("{0} desc limit 10", CallLog.Calls.Date); Android.Database.ICursor queryData = ContentResolver.Query(CallLog.Calls.ContentUri, null, queryFilter, null, querySorter); while (queryData.MoveToNext()) { editText.Text += queryData.GetString(queryData.GetColumnIndex(CallLog.Calls.Number)) + "\n"; } //Giden son 10 çağrıyı bulur editText.Text += "Giden Çağrılar:" + "\n"; queryFilter = String.Format("{0}={1}", CallLog.Calls.Type, (int)CallType.Outgoing); querySorter = String.Format("{0} desc limit 10", CallLog.Calls.Date); queryData = ContentResolver.Query(CallLog.Calls.ContentUri, null, queryFilter, null, querySorter); while (queryData.MoveToNext()) { editText.Text += queryData.GetString(queryData.GetColumnIndex(CallLog.Calls.Number)) + "\n"; } /* Gelen SMS'leri bulmak için gerekli alan. Giden smsler için Query içerisine "Telephony.Sms.Outbox.ContentUri" yazmak yeterlidir. */ editText.Text += "-------------" + "\n"; Android.Database.ICursor c = ContentResolver.Query(Telephony.Sms.Inbox.ContentUri, new String[] { "address", "body", "date" }, null, null, null); while (c.MoveToNext()) { long unixDate = long.Parse(c.GetString(c.GetColumnIndex("date"))); DateTime start = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); DateTime date = start.AddMilliseconds(unixDate).ToLocalTime(); editText.Text += "Gönderen:" + c.GetString(c.GetColumnIndex("address")) + "\n"; editText.Text += "Mesaj:" + c.GetString(c.GetColumnIndex("body")) + "\n"; editText.Text += "Tarih:" + date.ToString() + "\n"; editText.Text += "-------------" + "\n"; } }; } } }
Unutmamanız gereken bir diğer önemli konu ise ilgili yazılıma bulunduğu kod bloğunun, class başlangıcında yetki tanımlanmasıdır. Bu olmadan mesajları okumayı aklınızdan bile geçirmeyin 🙂 (Tecrübeyle sabittir)
[IntentFilter(new string[] { "android.provider.Telephony.READ_SMS" }, Priority = (int)IntentFilterPriority.HighPriority)]
Uygulamayı cep telefonunda çalıştırdıktan sonra, bendeki Screenshot’larını da sizlerle paylaşayım Resim 7-8-9):
Resim 7 Resim 8 Resim 9Bu makalede geçen bütün kodları github adresimde bulabilirsiniz:
https://github.com/eniskurtayyilmaz/EKY.Mobile-Android-Keylogger–Prototype-
Bu makale yazılırken kullanılan yardımcı şarkılar [2]
Bir sonraki makalede görüşmek üzere.
Enis Kurtay YILMAZ