Bilgi ve Uygulama

Android Bluetooth (Java) Programlama 1

Yazar: İsmail Sahillioğlu
Tarih: 18.08.2020
Türkçe

Bluetooth Açma, Kapatma, Durum Bilgisi Alma

Bluetooth programlamanın giriş yazısında kısa bir önbilgi vermiştik. Birinci bölüm olan bu bölümde bluetooth uygulama projemizi oluşturup ilk işlemleri gerçekleyeceğiz. İlk işlemlerimiz:

  • Bluetooth donanımını etkinleştirme
  • Bluetooth donanımını etkisizleştirme
  • Bluetooth donanımının durum değişimini sistem tarafından bilgi alma olacaktır.
Bluetooth'u etkinleştirme ve etkisizleştirme işlemini arayüzde basit bir tuş (button) kullanarak yapacağız. Ayrıca Android Studio'nun hata ayıklama (debug) ekranından yararlanarak program çalışırken neler olduğunu gözleyeceğiz. 
Başlamadan önce küçük bir not: Ben eğitimi Linux işletim sistemi üzerinde hazırlıyorum. Farklı platformlarda çalışanlarınız olacaktır. Dolayısıyla farklı platformlarda bazı işlemlerin yapılışı burada anlattığımdan farklı olabilir. Eğer olursa, bu gibi farkları kapatmayı siz değerli okuyucularımıza bırakıyorum.

Android Studio'yu başlattıktan sonra yeni bir Android Java projesi oluşturarak ilk adımları atalım...



1 - Bu ekrandan Boş Etkinlik (Empty Activity) seçeneğini seçip Sonraki (Next) tuşuna basalım.





2 - Bu ekranda Ad (Name) kutusuna istediğiniz bir adı proje adı olarak girebilirsiniz. Ben, "Bluetooth Gelistirme" olarak adlandırdım. Kayıt konumu (Save location)  kutusundaki klasör simgesine tıklayıp projeniz için özel bir konum seçebilirsiniz. Dil (Language) olarak Java'nın seçili olmalıdır. En düşük (Minimum) SDK bölümünde SDK'yi Android 5.0 olarak seçtim. Daha aşağısını önermiyorum çünkü BluetoothLE (Bluetooth Low Energy) donanımı 4.3 sürümünden öncekilerde bulunmuyor. Biraz daha ileriki bölümlerde BluetoothLE ile ilgili eğitimler hazırlamayı planladığım için size önerim 5.0 sürümünden aşağı düşmemenizdir. Artık Bitir (Finish) tuşuna tıklayarak programlamaya başlayabiliriz.




3 - Yeni projemizi oluşturduktan sonra bu şekilde kod ekranı bizi karşılayacaktır. Kodlamaya başlamadan önce yapmamız gereken küçük bir işimiz olacak...





4 - Proje ilk açıldığında tasarım ekranında bir programcılık klasiği olan "Hello World!" yazısı ile karşılaşırız. Bu yazının barındırıcısı bir TextView denetimidir. Nitekim şu an için uygulamamızda bir TextView denetimine gerek duymuyoruz. Dolayısıyla bu denetimi imleç ile seçip klavyemizden Delete tuşuna basıp tasarım ekranından siliyoruz. Bunun yerine bluetooth'u kontrol etmek için bir tuş (Button) ekleyeceğiz.





5 - Boş ekranımıza kontrol tuşumuzu ekliyor ardından resimde görüldüğü gibi konumlandırıyoruz. Konumlandırabilmek için öncelikle denetimin sağ ve sol kıstırmalarını (constraints) sağdaki nitelikler (attributes) bölümünü kullanarak bağlayın. Kıstırmaları bağlamadan sürükleyip bırakırsanız tuşun bıraktığınız yerde değil ekranın sol üst köşesinde konumlandığını göreceksiniz. Bu yüzden konumlandırmak için önce en azından sağ ve sol kıstırmaları bağlayın. Sağ ve sol mesafeleri 0 seçerseniz tuş tasarım ekranında otomatik olarak ortalanacaktır. Son olarak alt kıstırmayı da bağlayıp mesafe olarak 16 seçin.  Tasarım ekranının xml kodları şöyle:
<?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=".MainActivity">

<Button
android:id="@+id/btn_ac_kapat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="BLUETOOTH AÇ"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Bu aşamadan sonra basit kontrol ekranımız artık kullanıma hazır. Sırada kodlama var!

Android sisteminde temel bluetooth işlemleri BluetoothAdapter adında bir sınıf ya da diğer bir deyişle API aracılığıyla geçekleştirilir. Ancak temel kullanım ve kontrol işlemlerini yapabilmek için öncelikle projemizin manifest dosyasında iki adet bluetooth izni bildirmemiz gerekmektedir. Bu izinler aşağıdaki gibi tanımlanır.
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.kozmotronik.bluetoothgelistirme">

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
6 - Yukarıda söz ettiğim BLUETOOTH ve BLUETOOTH_ADMIN izinlerini bu şekilde manifest dosyasında bildiriyoruz.

Kontrol tuşumuzu ve bluetooth'u kendisi ile kontrol edeceğimiz BluetoothAdapter sınıfını ilklemek için MainActivity.Java dosyasına geçelim...
public class MainActivity extends AppCompatActivity {
private BluetoothAdapter bltAdaptor;
private Button btAcKapat;
7 - Burada sınıf değişkenlerimizi tanımlıyoruz. Adlandırmaları sizler arzunuza göre yapabilirsiniz. Ancak henüz oldukça başlangıç aşamasındaysanız kod takibini kolaylaştırmak için aynı biçimde yazmanız önerilir.

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btAcKapat = findViewById(R.id.btn_ac_kapat);
bltAdaptor = BluetoothAdapter.getDefaultAdapter();
if (bltAdaptor == null) {
// Bu cihazda etkin bir bluetooth donanımı bulunmuyor
}
}

8 - MainActivity sınıfının onCreate() yordamı (method) içerisinde kontrol değişkenlerimiz olan btAcKapat ve bltAdaptor değişkenlerini bu şekilde ilkliyoruz*.

BluetoothAdapter sınıfı çalışılan cihazdaki (varsa) bluetooth donanımını temsil eder. Bu sınıfın statik bir yordamı olan getDefaultAdaptor() ile bu nesnenin referansı alınmış olur. Eğer cihazda bir bluetooth donanımı bulunmuyorsa getDefaultadaptor() null döndürür. Biz de bu durumdan yararlanıp adaptör ilklemesini yapar yapmaz cihazda bluetooth donanımının olup olmadığını basit bir if koşuluyla yokluyoruz. Bu koşul sağlanırsa (seçimsel olarak) istersek bluetooth donanımı olmadığından dolayı finish() yordamını çağırarak uygulamayı sonlandırabiliriz. Nitekim bu kodu bir Android emülatörde çalıştırırsanız bu koşul sağlanacaktır. Çünkü emülatörler bluetooth donanımı öykünmez (Öykünen varsa da ben henüz rastlamadım). 

Sıra bluetooth'u açıp kapatacak kodları yazmaya geldi. Bluetooth'u etkinleştirme işlemi doğrudan yapılamamaktadır. Bunun yerine kullanıcıya bir açma isteği gönderilerek dolaylı olarak yapılır. Bu isteği bir Intent sınıfı kullanarak yaparız. Nitekim BluetoothAdapter API belgelendirmesini inceleyecek olursanız bir enable() yordamının olduğunu göreceksiniz. Ancak Google bu yordamı bizim uygulama gibi üçüncü parti uygulamaların doğrudan kullanmamasını, bunun yerine kullanıcıya az önce söz ettiğim biçimde etkinleştirme isteği göstermemizi belirtmektedir.

// Kontrol tuşumuza basınca ne yapacağını belirtiyoruz.
btAcKapat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
bluetoothAcKapat();
}
});
9 - onCreate() yordamının içinde kontrol tuşuna bastığımızda sistem tarafından algılanması için OnClickListener() arayüzünü (interface) gerçekliyoruz. Böylece ekranda tuşa dokunduğumuzda sistem bu arayüzün onClick() soyut (abstract) yordamını çağırıyor ve tuşumuza bağlı işlemleri çalıştırıyor. Burada amacımız, içeriğini bizim yazacağımız bluetoothAcKapat() yordamının tuşa dokunulduğunda sistem tarafından çağırılmasıdır. Diğer bir deyişle; tuşa basma olayını yakalamaktır. Bluetooth açma ve kapatma işlemlerini bu yordamın içinde gerçekleyeceğiz. 


private void bluetoothAcKapat() {
if (!bltAdaptor.isEnabled()) {
// Bluetooth etkisizleştirilmiş, etkinleştirme isteği çalıştır.
Intent BTAcIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(BTAcIntent);
} else {
// Bluetooth etkinleştirilmiş, etkisizleştirme doğrudan yapılabilir.
bltAdaptor.disable();
}
}
10 - bluetoothAcKapat() yordamımızı onCreate() yordamının dışında ancak MainActivity sınırlarının içerisinde bir yerde yazıyoruz. Bu yordamımızda basitçe BluetoothAdapter sınıfının isEnabled() yordamını kullanarak bluetooth'un açık mı yoksa kapalı mı olduğunu sorguluyor; kapalıysa açma isteği çalıştırıyor, açıksa bluetooth'u kapatıyoruz. isEnabled() yordamı bluetooth açıksa true, kapalıysa false döndürür.

Bluetooth'un durum bilgisinden haberdar olmamız gerektiğinden son bir adımımız daha kaldı; IntentFilter ve  BroadcastReceiver nesnelerini kullanarak sistemin bluetooth durumu ile ilgili yayınladığı bildirimleri yakalamak.

// Bluetooth durum değiştirdiğinde sistem bildirimini yakalalamak için gerekli kod
IntentFilter BTDurumIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(bluetoothDurumAbonesi, BTDurumIntentFilter);
11 - Yine onCreate() yordamı içerisinde; bir IntentFilter nesnesi yaratıp kurucuya parametre olarak "BluetoothAdapter.ACTION_STATE_CHANGED" sabitini veriyoruz. Burada bir nevi Android işletim sistemine bluetooth değişimlerinden haberdar olmak istediğimizi bildiriyoruz. Sonrasında Context sınıfının bir üyesi olan registerReceiver() yordamını kullanarak biraz sonra BroadcastReceiver olarak oluşturacağımız bluetoothDurumAbonesi değişkenini  ve dinlemek istediğimiz şeyi belirten bilgiyi taşıyan BTDurumIntentFilter değişkenini parametre olarak veriyoruz. Bu aşamadan sonra bluetooth durum değişimini dinliyor olabileceğiz. Hemen dinleyicimizi de gerçekleyelim...


private BroadcastReceiver bluetoothDurumAbonesi = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String eylem = intent.getAction(); // Bildirim eylemini intent nesnesinden al
if (eylem.equals(BluetoothAdapter.ACTION_STATE_CHANGED)){
/* Bluetooth durum değişimini burada yakaladık. Şimdi durum bilgisini alacağız...
Durum bilgisi BluetoothAdapter sınıfı içinde tanımlanmış bir int türünde değerden ibarettir.
Bu değer işletim sistemi tarafından intent nesnesine; BluetoothAdapter.EXTRA_STATE
anahtarı ile extra veri olarak koyulur. */
int durum = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
switch (durum){

case BluetoothAdapter.STATE_OFF:
Log.i("bluetoothDurumAbonesi","Bluetooth kapalı");
// Bluetooth durumunu öğrendiğimiz için burada kontrol tuşumuzun yazısını güncelleyebiliriz
btAcKapat.setText("BLUETOOTH AÇ");
break;

case BluetoothAdapter.STATE_TURNING_OFF:
Log.i("bluetoothDurumAbonesi","Bluetooth kapanıyor...");
break;

case BluetoothAdapter.STATE_ON:
Log.i("bluetoothDurumAbonesi","Bluetooth açık");
// Burada artık bluetooth'un açık olduğunu biliyoruz. Dolayısıyla tuşumuzun yazısını güncelleyebiliriz
btAcKapat.setText("BLUETOOTH KAPAT");
break;

case BluetoothAdapter.STATE_TURNING_ON:
Log.i("bluetoothDurumAbonesi","Bluetooth açılıyor...");
break;

case BluetoothAdapter.ERROR:
Log.i("bluetoothDurumAbonesi","Bluetooth ile ilgili bir hata!");
break;

default:
Log.i("bluetoothDurumAbonesi","Tanınmayan bir bluetooth durumu...");

}
}
}
};
12 - İşte son aşamadayız! Son kodumuz olan bluetooth durum dinleyicisini de ekledikten sonra denemeye başlayabiliriz. Bu tanımlamayı onCreate() yordamı dışına ve MainActivity sınırları içinde bir yerde yazın. Sonra telefonunuzu bilgisayarınıza bağlayıp Android Studio'daki çalıştır (run) tuşuna basın**.

Derleme başarılı oldu ve uygulama telefonunuza başarıyla yüklendi ise "BLUETOOTH AÇ" kontrol tuşuna basıp Android Studio'nun hata ayıklayıcı (debugger) bölümündeki konsol çıktısını gözlemleyin. Şu çıktıları alabiliyor olmalısınız:



Projenin tamamını buradaki github adresinden elde edebilirsiniz. Bir sonrakinde görüşmek üzere bluetooth uygulamanız ile iyi eğlenceler...


* İlklemek İnglizcedeki initiate veya kısa yazılışıyla init sözcüğüne karşılık kullanılmıştır. Her ne kadar initiate başlatmak anlamına gelse de, yapılan iş bir şeyi ilk kullanıma hazırlamak olduğu için başlatmak yerine ilklemek sözcüğü daha uygun durmaktadır.
** Telefonunuzun geliştirici kipini etkinleştirdiğinizden emin olun.

Yorumlarınız

Hiç yorum yapılmamış, ilk yorumu siz yapabilirsiniz.

Bir yorum ekleyin

İsim:
E-posta:
Yorumunuz:
Güvenlik Kodu:
 
Tüm alanları doldurmak zorunludur. Yorumunuz kontrol edilince yayınlanacaktır. E-posta adresi yayınlanmaz.
Konular