{"id":34291,"date":"2025-11-14T09:31:19","date_gmt":"2025-11-14T06:31:19","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/"},"modified":"2025-11-14T09:31:19","modified_gmt":"2025-11-14T06:31:19","slug":"android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/","title":{"rendered":"Android Bluetooth Geli\u015ftirme: Kapsaml\u0131 Rehber ve Uygulamalar"},"content":{"rendered":"<p><body><\/p>\n<p>Mobil d\u00fcnyada cihazlar aras\u0131 ileti\u015fimin temel ta\u015flar\u0131ndan Bluetooth, Android uygulamalar\u0131nda kritik bir rol oynar. Ak\u0131ll\u0131 cihazlar\u0131m\u0131z\u0131n vazge\u00e7ilmezi haline gelen bu teknolojiyle neler yapabilece\u011fimizi, s\u0131f\u0131rdan ba\u015flayarak ad\u0131m ad\u0131m ke\u015ffedelim.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn birbirine ba\u011fl\u0131 d\u00fcnyas\u0131nda, cihazlar aras\u0131 kablosuz ileti\u015fim, kullan\u0131c\u0131 deneyiminin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. \u0130\u015fte tam da bu noktada Bluetooth teknolojisi devreye girer. Android ekosisteminde Bluetooth, ak\u0131ll\u0131 telefonlar\u0131m\u0131zdan tabletlerimize, hatta giyilebilir teknolojilere kadar geni\u015f bir yelpazede, d\u00fc\u015f\u00fck g\u00fc\u00e7l\u00fc ve k\u0131sa mesafeli veri al\u0131\u015fveri\u015fi i\u00e7in standart bir y\u00f6ntem sunar. \u00d6ncelikle, Bluetooth&#8217;un temel i\u015flevlerini ve Android uygulamalar\u0131 i\u00e7in neden bu kadar kritik oldu\u011funu anlamakla ba\u015flayal\u0131m. Bluetooth, genellikle iki ana modda \u00e7al\u0131\u015f\u0131r: Klasik Bluetooth (Bluetooth Classic) ve Bluetooth D\u00fc\u015f\u00fck Enerji (Bluetooth Low Energy &#8211; BLE).<\/p>\n<p>Klasik Bluetooth, genellikle daha y\u00fcksek bant geni\u015fli\u011fi gerektiren ses ak\u0131\u015f\u0131 (kulakl\u0131klar, hoparl\u00f6rler) veya b\u00fcy\u00fck dosya transferleri gibi uygulamalar i\u00e7in tercih edilir. A2DP (Advanced Audio Distribution Profile) ve HFP (Hands-Free Profile) gibi profiller, klasik Bluetooth&#8217;un yayg\u0131n kullan\u0131m alanlar\u0131n\u0131 olu\u015fturur. Di\u011fer yandan, BLE, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, \u00e7ok d\u00fc\u015f\u00fck g\u00fc\u00e7 t\u00fcketimiyle karakterizedir ve IoT (Nesnelerin \u0130nterneti) cihazlar\u0131, ak\u0131ll\u0131 sens\u00f6rler, fitness takip\u00e7ileri ve ak\u0131ll\u0131 ev aksesuarlar\u0131 gibi uygulamalar i\u00e7in idealdir. Bu iki modun farkl\u0131 kullan\u0131m senaryolar\u0131na sahip olmas\u0131, Android geli\u015ftiricilerine geni\u015f bir esneklik sunar.<\/p>\n<p>Bluetooth&#8217;un Android uygulamalar\u0131 i\u00e7in \u00f6nemi saymakla bitmez. \u00d6rne\u011fin, bir ak\u0131ll\u0131 ev uygulamas\u0131 d\u00fc\u015f\u00fcn\u00fcn; termostat\u0131n\u0131zla veya ayd\u0131nlatma sisteminizle do\u011frudan etkile\u015fim kurmak i\u00e7in BLE kullan\u0131labilir. Ayr\u0131ca, sa\u011fl\u0131k ve fitness uygulamalar\u0131, kalp at\u0131\u015f h\u0131z\u0131 monit\u00f6rleri veya ad\u0131m sayarlar\u0131 gibi giyilebilir cihazlardan veri toplamak i\u00e7in yine BLE&#8217;ye ba\u015fvurur. Klasik Bluetooth ise, ara\u00e7 i\u00e7i e\u011flence sistemleriyle veya ba\u015fka bir Android cihazla h\u0131zl\u0131ca b\u00fcy\u00fck dosyalar payla\u015fmak gibi senaryolarda hayat kurtar\u0131c\u0131 olabilir. Bu teknoloji sayesinde, uygulamalar\u0131m\u0131z fiziksel d\u00fcnyayla daha derinlemesine etkile\u015fim kurabilir, kullan\u0131c\u0131 deneyimini zenginle\u015ftirebilir ve yeni i\u015flevsellikler sunabilir. Bu geni\u015f kullan\u0131m alan\u0131, Android geli\u015ftiricilerinin Bluetooth yeteneklerini iyi bilmesini zorunlu k\u0131lar. \u0130zin y\u00f6netimi, cihaz ke\u015ffi, g\u00fcvenli ba\u011flant\u0131 kurulumu ve veri transferi gibi konular, ba\u015far\u0131l\u0131 bir Bluetooth entegrasyonu i\u00e7in temel ta\u015flar\u0131 olu\u015fturur. T\u00fcm bu nedenlerle, Android geli\u015ftirme yolculu\u011funuzda Bluetooth&#8217;u anlamak ve etkin bir \u015fekilde kullanabilmek, uygulaman\u0131z\u0131n potansiyelini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r.<\/p>\n<h2 id=\"android-uygulamalar\u0131nda-bluetooth-nas\u0131l-etkinle\u015ftirilir-ve-cihazlar-nas\u0131l-ke\u015ffedilir\">Android Uygulamalar\u0131nda Bluetooth Nas\u0131l Etkinle\u015ftirilir ve Cihazlar Nas\u0131l Ke\u015ffedilir?<\/h2>\n<p>Android uygulaman\u0131zda Bluetooth \u00f6zelliklerini kullanmaya ba\u015flamadan \u00f6nce at\u0131lmas\u0131 gereken ilk ve en \u00f6nemli ad\u0131mlar, gerekli izinleri talep etmek, Bluetooth adapt\u00f6r\u00fcn\u00fc etkinle\u015ftirmek ve \u00e7evredeki cihazlar\u0131 ke\u015ffetmektir. Bu s\u00fcre\u00e7ler, uygulaman\u0131z\u0131n cihazlar aras\u0131 ileti\u015fim kurabilmesi i\u00e7in temel olu\u015fturur ve hatas\u0131z bir \u015fekilde yap\u0131land\u0131r\u0131lmal\u0131d\u0131r. \u0130zinler, Android 6.0 (API 23) ve sonras\u0131 i\u00e7in \u00f6zellikle \u00f6nem arz eder, \u00e7\u00fcnk\u00fc kullan\u0131c\u0131dan \u00e7al\u0131\u015fma zaman\u0131nda (runtime) onay al\u0131nmas\u0131 gerekir.<\/p>\n<p>\u00d6ncelikle, uygulaman\u0131z\u0131n Bluetooth donan\u0131m\u0131na eri\u015febilmesi i\u00e7in manifest dosyan\u0131zda \u015fu izinleri belirtmeniz gerekir:<\/p>\n<pre><code><uses-permission android:name=\"android.permission.BLUETOOTH\" \/>\n<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" \/>\n<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" \/>\n<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" \/>\n<uses-permission android:name=\"android.permission.BLUETOOTH_SCAN\" android:usesPermissionFlags=\"neverForLocation\" \/>\n<uses-permission android:name=\"android.permission.BLUETOOTH_ADVERTISE\" \/>\n<uses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\" \/>\n<\/pre>\n<p><\/code><\/p>\n<p><code>BLUETOOTH<\/code> ve <code>BLUETOOTH_ADMIN<\/code> Klasik Bluetooth i\u00e7in temel izinlerdir. Android 10 (API 29) ve \u00f6ncesinde cihaz ke\u015ffi i\u00e7in <code>ACCESS_FINE_LOCATION<\/code> veya <code>ACCESS_COARSE_LOCATION<\/code> izni gereklidir, \u00e7\u00fcnk\u00fc Bluetooth taramas\u0131 konum bilgisi sa\u011flayabilir. Android 12 (API 31) ve sonras\u0131 i\u00e7in ise <code>BLUETOOTH_SCAN<\/code>, <code>BLUETOOTH_ADVERTISE<\/code> ve <code>BLUETOOTH_CONNECT<\/code> izinleri tan\u0131t\u0131lm\u0131\u015ft\u0131r. Bu yeni izinler, konum iznine gerek kalmadan Bluetooth i\u015flevselli\u011fini kullanman\u0131za olanak tan\u0131r, ancak yine de \u00e7al\u0131\u015fma zaman\u0131nda kullan\u0131c\u0131 onay\u0131 gerektirir.<\/p>\n<p>\u0130zinleri manifest dosyan\u0131za ekledikten sonra, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fma zaman\u0131nda bu izinleri istemesi gerekir. \u00d6rne\u011fin, bir etkinlik (Activity) i\u00e7inde \u015fu \u015fekilde kontrol edebilirsiniz:<\/p>\n<pre><code><pre><code>\nprivate val REQUEST_ENABLE_BT = 1\nprivate val REQUEST_BLUETOOTH_PERMISSIONS = 2\n\nfun checkBluetoothPermissions() {\n    val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()\n\n    \/\/ Bluetooth'un cihazda desteklenip desteklenmedi\u011fini kontrol et\n    if (bluetoothAdapter == null) {\n        \/\/ Cihaz Bluetooth'u desteklemiyor\n        Toast.makeText(this, \"Bu cihaz Bluetooth'u desteklemiyor.\", Toast.LENGTH_LONG).show()\n        return\n    }\n\n    \/\/ Bluetooth kapal\u0131ysa a\u00e7ma iste\u011fi g\u00f6nder\n    if (!bluetoothAdapter.isEnabled) {\n        val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)\n        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)\n    }\n\n    \/\/ Gerekli \u00e7al\u0131\u015fma zaman\u0131 izinlerini kontrol et ve iste (API 31+)\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n        val permissions = arrayOf(\n            Manifest.permission.BLUETOOTH_SCAN,\n            Manifest.permission.BLUETOOTH_CONNECT,\n            Manifest.permission.BLUETOOTH_ADVERTISE\n        )\n        val deniedPermissions = permissions.filter {\n            ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED\n        }\n\n        if (deniedPermissions.isNotEmpty()) {\n            ActivityCompat.requestPermissions(this, deniedPermissions.toTypedArray(), REQUEST_BLUETOOTH_PERMISSIONS)\n        }\n    } else { \/\/ API 30 ve alt\u0131 i\u00e7in konum izni kontrol\u00fc\n        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {\n            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_BLUETOOTH_PERMISSIONS)\n        }\n    }\n}\n\noverride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n    super.onActivityResult(requestCode, resultCode, data)\n    if (requestCode == REQUEST_ENABLE_BT) {\n        if (resultCode == Activity.RESULT_OK) {\n            Toast.makeText(this, \"Bluetooth ba\u015far\u0131yla a\u00e7\u0131ld\u0131.\", Toast.LENGTH_SHORT).show()\n        } else {\n            Toast.makeText(this, \"Bluetooth a\u00e7\u0131lamad\u0131.\", Toast.LENGTH_SHORT).show()\n        }\n    }\n}\n\noverride fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n    super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n    if (requestCode == REQUEST_BLUETOOTH_PERMISSIONS) {\n        if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {\n            Toast.makeText(this, \"T\u00fcm Bluetooth izinleri verildi.\", Toast.LENGTH_SHORT).show()\n        } else {\n            Toast.makeText(this, \"Baz\u0131 Bluetooth izinleri reddedildi.\", Toast.LENGTH_LONG).show()\n        }\n    }\n}\n<\/code><\/pre>\n<p>Bluetooth adapt\u00f6r\u00fc etkinle\u015ftirildikten ve gerekli izinler al\u0131nd\u0131ktan sonra, \u00e7evredeki cihazlar\u0131 ke\u015ffetmeye ba\u015flayabilirsiniz. Klasik Bluetooth i\u00e7in cihaz ke\u015ffi, adapt\u00f6r\u00fcn belirli bir s\u00fcre boyunca tarama yapmas\u0131yla ger\u00e7ekle\u015fir. Ke\u015ffedilen cihazlar, bir BroadcastReceiver arac\u0131l\u0131\u011f\u0131yla yakalan\u0131r.<\/p>\n<pre><code><pre><code>\nprivate val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()\nprivate val discoveredDevices = mutableListOf<BluetoothDevice>()\n\n\/\/ Cihaz ke\u015ffini dinlemek i\u00e7in BroadcastReceiver\nprivate val receiver = object : BroadcastReceiver() {\n    override fun onReceive(context: Context, intent: Intent) {\n        when(intent.action) {\n            BluetoothDevice.ACTION_FOUND -> {\n                val device: BluetoothDevice? = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)\n                device?.let {\n                    if (!discoveredDevices.contains(it)) {\n                        discoveredDevices.add(it)\n                        \/\/ Cihaz ad\u0131n\u0131 ve adresini loglayabilir veya UI'a ekleyebilirsiniz\n                        Log.d(\"Bluetooth\", \"Cihaz bulundu: ${it.name} - ${it.address}\")\n                    }\n                }\n            }\n            BluetoothAdapter.ACTION_DISCOVERY_FINISHED -> {\n                Log.d(\"Bluetooth\", \"Cihaz ke\u015ffi tamamland\u0131.\")\n                \/\/ UI'\u0131 g\u00fcncelleyebilir veya taramay\u0131 durdurabilirsiniz\n            }\n        }\n    }\n}\n\nfun startDiscovery() {\n    \/\/ BluetoothAdapt\u00f6r\u00fcn\u00fcn null olmad\u0131\u011f\u0131n\u0131 ve etkin oldu\u011funu kontrol edin\n    bluetoothAdapter?.let {\n        if (!it.isEnabled) {\n            \/\/ Bluetooth etkin de\u011filse, kullan\u0131c\u0131dan a\u00e7mas\u0131n\u0131 isteyin\n            val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)\n            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)\n            return\n        }\n\n        \/\/ Discovery devam ediyorsa \u00f6nce iptal et\n        if (it.isDiscovering) {\n            it.cancelDiscovery()\n        }\n\n        \/\/ BroadcastReceiver'\u0131 kaydet\n        val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)\n        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)\n        registerReceiver(receiver, filter)\n\n        \/\/ Ke\u015ffi ba\u015flat\n        val success = it.startDiscovery()\n        if (success) {\n            Toast.makeText(this, \"Cihaz ke\u015ffi ba\u015flat\u0131ld\u0131...\", Toast.LENGTH_SHORT).show()\n        } else {\n            Toast.makeText(this, \"Cihaz ke\u015ffi ba\u015flat\u0131lamad\u0131.\", Toast.LENGTH_SHORT).show()\n        }\n    }\n}\n\noverride fun onDestroy() {\n    super.onDestroy()\n    \/\/ Receiver'\u0131 kay\u0131ttan \u00e7\u0131kar\n    unregisterReceiver(receiver)\n    \/\/ Discovery devam ediyorsa iptal et\n    bluetoothAdapter?.cancelDiscovery()\n}\n<\/code><\/pre>\n<p>Bu ad\u0131mlar, uygulaman\u0131z\u0131n Bluetooth ileti\u015fimine ba\u015flamas\u0131 i\u00e7in temel haz\u0131rl\u0131\u011f\u0131 sa\u011flar. Cihaz ke\u015ffi genellikle yakla\u015f\u0131k 12 saniye s\u00fcrer ve bu s\u00fcre zarf\u0131nda CPU yo\u011fun \u00e7al\u0131\u015f\u0131r, bu nedenle uygulaman\u0131z\u0131n aray\u00fcz\u00fcn\u00fcn donmamas\u0131 i\u00e7in bu i\u015flemleri genellikle bir arka plan i\u015f par\u00e7ac\u0131\u011f\u0131nda (thread) veya Coroutine i\u00e7inde yapman\u0131z \u00f6nerilir. Ayr\u0131ca, tarama i\u015flemi tamamland\u0131\u011f\u0131nda veya uygulaman\u0131z kapanmadan \u00f6nce <code>cancelDiscovery()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 yaparak pil t\u00fcketimini optimize etmeyi unutmay\u0131n. Bu \u015fekilde, kullan\u0131c\u0131 dostu ve performans\u0131 y\u00fcksek bir Bluetooth uygulamas\u0131 i\u00e7in sa\u011flam bir temel olu\u015fturmu\u015f olursunuz.<\/p>\n<div class=\"uzman-ipucu\">\n  Uzman \u0130pucu: Android 12 (API 31) ve \u00fczeri i\u00e7in Bluetooth izinlerini y\u00f6netirken, <code>BLUETOOTH_SCAN<\/code> iznini isterken <code>android:usesPermissionFlags=\"neverForLocation\"<\/code> niteli\u011fini kullanmak, konum izni gereklili\u011fini atlayarak kullan\u0131c\u0131 gizlili\u011fini art\u0131rabilir ve izin diyaloglar\u0131n\u0131 basitle\u015ftirebilirsiniz. Bu sayede, uygulaman\u0131z\u0131n sadece Bluetooth i\u015flevi i\u00e7in izin istedi\u011fi daha net belirtilir.\n<\/div>\n<h3 id=\"bluetooth-klasik-ile-g\u00fcvenli-ba\u011flant\u0131-kurma-ve-veri-transferi\">Bluetooth Klasik ile G\u00fcvenli Ba\u011flant\u0131 Kurma ve Veri Transferi<\/h3>\n<p>Cihaz ke\u015ffini tamamlad\u0131ktan ve hedef cihaz\u0131 belirledikten sonraki ad\u0131m, iki cihaz aras\u0131nda g\u00fcvenli bir ba\u011flant\u0131 kurmak ve veri transferini ger\u00e7ekle\u015ftirmektir. Klasik Bluetooth, genellikle bir istemci (client) ve bir sunucu (server) mimarisini kullan\u0131r. Bir cihaz bir sunucu soketi a\u00e7arak gelen ba\u011flant\u0131lar\u0131 beklerken, di\u011fer cihaz bir istemci soketi arac\u0131l\u0131\u011f\u0131yla bu sunucuya ba\u011flanmaya \u00e7al\u0131\u015f\u0131r. Bu s\u00fcre\u00e7, genellikle bir UUID (Universally Unique Identifier) kullan\u0131larak belirli bir servis profilinin hedeflenmesiyle ger\u00e7ekle\u015fir.<\/p>\n<p>Sunucu taraf\u0131nda, bir <code>BluetoothServerSocket<\/code> olu\u015fturulur ve <code>listenUsingRfcommWithServiceRecord()<\/code> metodu ile gelen ba\u011flant\u0131lar beklenir. Bu metod, bir servis ad\u0131 ve bir UUID al\u0131r. UUID, uygulaman\u0131z\u0131n sa\u011flad\u0131\u011f\u0131 servis i\u00e7in benzersiz bir tan\u0131mlay\u0131c\u0131 olmal\u0131d\u0131r ve hem sunucu hem de istemci taraf\u0131nda ayn\u0131 UUID kullan\u0131lmal\u0131d\u0131r. Sunucu, <code>accept()<\/code> metodunu \u00e7a\u011f\u0131rarak bir ba\u011flant\u0131y\u0131 bloke edici bir \u015fekilde bekler. Bir ba\u011flant\u0131 kuruldu\u011funda, bu metod bir <code>BluetoothSocket<\/code> d\u00f6nd\u00fcr\u00fcr. \u0130\u015fte sunucu taraf\u0131 i\u00e7in basit bir \u00f6rnek:<\/p>\n<pre><code><pre><code>\nprivate inner class AcceptThread(private val bluetoothAdapter: BluetoothAdapter) : Thread() {\n    private val mmServerSocket: BluetoothServerSocket? by lazy(LazyThreadSafetyMode.NONE) {\n        bluetoothAdapter.listenUsingRfcommWithServiceRecord(\"MyAppName\", MY_UUID)\n    }\n\n    override fun run() {\n        var socket: BluetoothSocket? = null\n        \/\/ Ba\u011flant\u0131y\u0131 kabul etme d\u00f6ng\u00fcs\u00fc. Bir ba\u011flant\u0131 kabul edilirse veya bir hata olu\u015fursa d\u00f6ng\u00fcden \u00e7\u0131k\u0131l\u0131r.\n        while (true) {\n            try {\n                socket = mmServerSocket?.accept() \/\/ Bloklay\u0131c\u0131 \u00e7a\u011fr\u0131\n            } catch (e: IOException) {\n                Log.e(TAG, \"Socket'in kabul\u00fc ba\u015far\u0131s\u0131z oldu\", e)\n                break\n            }\n\n            socket?.also {\n                \/\/ Ba\u011flant\u0131 ba\u015far\u0131l\u0131 oldu, yeni bir thread'de veri transferini y\u00f6net\n                manageConnectedSocket(it)\n                mmServerSocket?.close()\n                return\n            }\n        }\n    }\n\n    fun cancel() {\n        try {\n            mmServerSocket?.close()\n        } catch (e: IOException) {\n            Log.e(TAG, \"ServerSocket kapat\u0131lamad\u0131\", e)\n        }\n    }\n}\n<\/code><\/pre>\n<p>\u0130stemci taraf\u0131nda ise, hedef <code>BluetoothDevice<\/code> nesnesi \u00fczerinden <code>createRfcommSocketToServiceRecord()<\/code> metodu \u00e7a\u011f\u0131r\u0131larak bir <code>BluetoothSocket<\/code> olu\u015fturulur. Ard\u0131ndan, <code>connect()<\/code> metodu \u00e7a\u011f\u0131r\u0131larak sunucuya ba\u011flan\u0131lmaya \u00e7al\u0131\u015f\u0131l\u0131r. Bu metod da bloklay\u0131c\u0131d\u0131r ve arka plan i\u015f par\u00e7ac\u0131\u011f\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 \u00f6nemlidir. \u0130\u015fte istemci taraf\u0131 i\u00e7in bir \u00f6rnek:<\/p>\n<pre><code><pre><code>\nprivate inner class ConnectThread(private val device: BluetoothDevice, private val bluetoothAdapter: BluetoothAdapter) : Thread() {\n    private val mmSocket: BluetoothSocket? by lazy(LazyThreadSafetyMode.NONE) {\n        device.createRfcommSocketToServiceRecord(MY_UUID)\n    }\n\n    override fun run() {\n        \/\/ Ke\u015fif s\u0131ras\u0131nda ba\u011flanmaya \u00e7al\u0131\u015f\u0131rken ke\u015ffi iptal edin\n        bluetoothAdapter.cancelDiscovery()\n\n        mmSocket?.let { socket ->\n            try {\n                \/\/ Sunucuya ba\u011flan. Bu bloklay\u0131c\u0131 bir \u00e7a\u011fr\u0131d\u0131r ve ba\u015far\u0131l\u0131 oldu\u011funda geri d\u00f6ner\n                socket.connect()\n            } catch (e: IOException) {\n                \/\/ Ba\u011flant\u0131 ba\u015far\u0131s\u0131z oldu, soketi kapat ve \u00e7\u0131k\n                try {\n                    socket.close()\n                } catch (e2: IOException) {\n                    Log.e(TAG, \"Soket kapat\u0131lamad\u0131\", e2)\n                }\n                return\n            }\n\n            \/\/ Ba\u011flant\u0131 ba\u015far\u0131l\u0131 oldu, yeni bir thread'de veri transferini y\u00f6net\n            manageConnectedSocket(socket)\n        }\n    }\n\n    fun cancel() {\n        try {\n            mmSocket?.close()\n        } catch (e: IOException) {\n            Log.e(TAG, \"Soket kapat\u0131lamad\u0131\", e)\n        }\n    }\n}\n<\/code><\/pre>\n<p>Ba\u011flant\u0131 her iki tarafta da ba\u015far\u0131yla kurulduktan sonra, <code>BluetoothSocket<\/code> nesnesinden <code>getInputStream()<\/code> ve <code>getOutputStream()<\/code> metotlar\u0131 arac\u0131l\u0131\u011f\u0131yla veri ak\u0131\u015flar\u0131 elde edilir. Bu ak\u0131\u015flar kullan\u0131larak veriler g\u00f6nderilip al\u0131nabilir. Veri transferi i\u00e7in \u00f6zel bir i\u015f par\u00e7ac\u0131\u011f\u0131 olu\u015fturmak ve bu ak\u0131\u015flar\u0131 dinlemek veya bunlara yazmak, uygulaman\u0131n ana UI i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n engellenmemesi i\u00e7in hayati \u00f6neme sahiptir. Veri transferi \u00f6rne\u011fi a\u015fa\u011f\u0131daki gibidir:<\/p>\n<pre><code><pre><code>\nprivate inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() {\n    private val mmInStream: InputStream = mmSocket.inputStream\n    private val mmOutStream: OutputStream = mmSocket.outputStream\n    private val mmBuffer: ByteArray = ByteArray(1024) \/\/ Veri okumak i\u00e7in tampon\n\n    override fun run() {\n        var numBytes: Int \/\/ Okunan bayt say\u0131s\u0131\n        while (true) {\n            try {\n                \/\/ Giri\u015f ak\u0131\u015f\u0131ndan oku\n                numBytes = mmInStream.read(mmBuffer)\n                \/\/ Okunan baytlar\u0131 ana aktiviteye g\u00f6nder (\u00f6rne\u011fin bir Handler kullanarak)\n                val readMessage = String(mmBuffer, 0, numBytes)\n                Log.d(TAG, \"Al\u0131nan mesaj: $readMessage\")\n                \/\/ handler.obtainMessage(MESSAGE_READ, numBytes, -1, mmBuffer).sendToTarget()\n            } catch (e: IOException) {\n                Log.d(TAG, \"Giri\u015f ak\u0131\u015f\u0131 kesildi\", e)\n                break\n            }\n        }\n    }\n\n    \/\/ Harici aktiviteye \u00e7\u0131k\u0131\u015f ak\u0131\u015f\u0131na yazma \u00e7a\u011fr\u0131s\u0131\n    fun write(bytes: ByteArray) {\n        try {\n            mmOutStream.write(bytes)\n            Log.d(TAG, \"G\u00f6nderilen mesaj: ${String(bytes)}\")\n            \/\/ handler.obtainMessage(MESSAGE_WRITE, -1, -1, bytes).sendToTarget()\n        } catch (e: IOException) {\n            Log.e(TAG, \"\u00c7\u0131k\u0131\u015f ak\u0131\u015f\u0131na yaz\u0131l\u0131rken hata olu\u015ftu\", e)\n        }\n    }\n\n    \/\/ Ba\u011flant\u0131y\u0131 kapat\n    fun cancel() {\n        try {\n            mmSocket.close()\n        } catch (e: IOException) {\n            Log.e(TAG, \"Soket kapat\u0131l\u0131rken hata olu\u015ftu\", e)\n        }\n    }\n}\n<\/code><\/pre>\n<p>Her \u00fc\u00e7 thread de (AcceptThread, ConnectThread, ConnectedThread) ba\u011flant\u0131n\u0131n ve veri transferinin belirli a\u015famalar\u0131n\u0131 y\u00f6netmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. <code>manageConnectedSocket(BluetoothSocket)<\/code> fonksiyonu, ba\u011flant\u0131 kurulduktan sonra <code>ConnectedThread<\/code>'i ba\u015flatmak ve y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Bu yap\u0131, Klasik Bluetooth ile iki Android cihaz aras\u0131nda g\u00fcvenli ve istikrarl\u0131 bir \u015fekilde veri al\u0131\u015fveri\u015fi yapman\u0131z\u0131 sa\u011flar. Bu i\u015flemler s\u0131ras\u0131nda olu\u015fabilecek hatalar\u0131 (\u00f6rne\u011fin, ba\u011flant\u0131 kesilmesi) do\u011fru bir \u015fekilde y\u00f6netmek, uygulaman\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir.<\/p>\n<div class=\"uzman-ipucu\">\n  Uzman \u0130pucu: Bluetooth ileti\u015fiminde kullan\u0131lan UUID'lerin, uygulaman\u0131za \u00f6zel ve benzersiz oldu\u011fundan emin olun. Kendi UUID'nizi olu\u015fturmak i\u00e7in \u00e7evrimi\u00e7i UUID jenerat\u00f6rlerini kullanabilirsiniz. Ayn\u0131 UUID'nin hem sunucu hem de istemci taraf\u0131nda birebir ayn\u0131 olmas\u0131, ba\u011flant\u0131n\u0131n ba\u015far\u0131l\u0131 olmas\u0131 i\u00e7in \u015fartt\u0131r.\n<\/div>\n<h3 id=\"vaka-analizi-\u0130ki-android-cihaz-aras\u0131nda-dosya-payla\u015f\u0131m\u0131\">Vaka Analizi: \u0130ki Android Cihaz Aras\u0131nda Dosya Payla\u015f\u0131m\u0131<\/h3>\n<p>Klasik Bluetooth'un en pratik kullan\u0131m senaryolar\u0131ndan biri, iki Android cihaz aras\u0131nda dosya payla\u015f\u0131m\u0131d\u0131r. Bu senaryoyu uygulamak i\u00e7in yukar\u0131da bahsedilen sunucu-istemci mimarisini ve veri ak\u0131\u015flar\u0131n\u0131 kullanarak bir dosyan\u0131n baytlar\u0131n\u0131 g\u00f6nderebiliriz. Diyelim ki A cihaz\u0131 bir foto\u011fraf\u0131 B cihaz\u0131na g\u00f6ndermek istiyor. A cihaz\u0131 istemci rol\u00fcn\u00fc \u00fcstlenirken, B cihaz\u0131 sunucu olarak hareket edecektir.<\/p>\n<p><strong>B Cihaz\u0131 (Sunucu):<\/strong><\/p>\n<ol>\n<li>Bluetooth adapt\u00f6r\u00fcn\u00fc etkinle\u015ftirir ve gerekli izinleri al\u0131r.<\/li>\n<li><code>AcceptThread<\/code>'i ba\u015flatarak gelen ba\u011flant\u0131 iste\u011fini dinler.<\/li>\n<li>A cihaz\u0131ndan gelen bir ba\u011flant\u0131y\u0131 kabul etti\u011finde, <code>BluetoothSocket<\/code> nesnesini al\u0131r.<\/li>\n<li><code>ConnectedThread<\/code>'i ba\u015flat\u0131r ve gelen <code>InputStream<\/code>'den dosya baytlar\u0131n\u0131 okur.<\/li>\n<li>Okudu\u011fu baytlar\u0131 bir dosyaya yazar (\u00f6rne\u011fin, uygulaman\u0131n \u00f6zel depolama alan\u0131na veya ortak bir medya dizinine).<\/li>\n<li>Dosya transferi tamamland\u0131\u011f\u0131nda ba\u011flant\u0131y\u0131 kapat\u0131r.<\/li>\n<\/ol>\n<p><strong>A Cihaz\u0131 (\u0130stemci):<\/strong><\/p>\n<ol>\n<li>Bluetooth adapt\u00f6r\u00fcn\u00fc etkinle\u015ftirir ve gerekli izinleri al\u0131r.<\/li>\n<li>Cihaz ke\u015ffini ba\u015flat\u0131r ve B cihaz\u0131n\u0131 bulur.<\/li>\n<li>B cihaz\u0131na ba\u011flanmak i\u00e7in <code>ConnectThread<\/code>'i ba\u015flat\u0131r, sunucunun UUID'sini kullanarak bir <code>BluetoothSocket<\/code> olu\u015fturur ve ba\u011flan\u0131r.<\/li>\n<li>Ba\u011flant\u0131 ba\u015far\u0131l\u0131 oldu\u011funda, g\u00f6nderilecek dosyan\u0131n <code>InputStream<\/code>'ini elde eder.<\/li>\n<li><code>ConnectedThread<\/code>'in <code>write()<\/code> metodunu kullanarak dosyan\u0131n baytlar\u0131n\u0131 par\u00e7a par\u00e7a <code>OutputStream<\/code>'e yazar.<\/li>\n<li>Dosya transferi tamamland\u0131\u011f\u0131nda ba\u011flant\u0131y\u0131 kapat\u0131r.<\/li>\n<\/ol>\n<p>Bu senaryoda, dosya transferinin g\u00fcvenilirli\u011fi i\u00e7in baz\u0131 ek hususlar \u00f6nemlidir. \u00d6rne\u011fin, dosyan\u0131n toplam boyutunu transferden \u00f6nce kar\u015f\u0131 tarafa bildirmek, al\u0131c\u0131 cihaz\u0131n ne kadar veri bekledi\u011fini bilmesini sa\u011flar. Ayr\u0131ca, her bir veri par\u00e7as\u0131n\u0131n ba\u015far\u0131yla al\u0131n\u0131p al\u0131nmad\u0131\u011f\u0131n\u0131 teyit etmek i\u00e7in basit bir onay mekanizmas\u0131 (ACK\/NACK) uygulanabilir. B\u00fcy\u00fck dosyalar i\u00e7in, transferin ilerleyi\u015fini kullan\u0131c\u0131ya g\u00f6stermek (progress bar) kullan\u0131c\u0131 deneyimini iyile\u015ftirecektir. Ayr\u0131ca, dosya ad\u0131n\u0131n da transferden \u00f6nce g\u00f6nderilmesi, al\u0131c\u0131 cihaz\u0131n dosyay\u0131 do\u011fru adla kaydetmesini sa\u011flar. Bu vaka analizi, Klasik Bluetooth'un dosya payla\u015f\u0131m\u0131 gibi pratik ve yayg\u0131n kullan\u0131m senaryolar\u0131nda nas\u0131l kullan\u0131labilece\u011fini g\u00f6stermektedir.<\/p>\n<h2 id=\"bluetooth-d\u00fc\u015f\u00fck-enerji-ble-ile-modern-uygulamalar-geli\u015ftirme\">Bluetooth D\u00fc\u015f\u00fck Enerji (BLE) ile Modern Uygulamalar Geli\u015ftirme<\/h2>\n<p>Klasik Bluetooth'un yan\u0131 s\u0131ra, Bluetooth D\u00fc\u015f\u00fck Enerji (BLE), modern Android uygulamalar\u0131nda giderek daha fazla \u00f6nem kazanmaktad\u0131r. \u00d6zellikle Nesnelerin \u0130nterneti (IoT) cihazlar\u0131, giyilebilir teknolojiler ve ak\u0131ll\u0131 sens\u00f6rler gibi d\u00fc\u015f\u00fck g\u00fc\u00e7 t\u00fcketimi gerektiren senaryolar i\u00e7in BLE, ideal bir \u00e7\u00f6z\u00fcmd\u00fcr. BLE, Klasik Bluetooth'a k\u0131yasla daha h\u0131zl\u0131 ba\u011flant\u0131 s\u00fcreleri, daha basit profiller ve en \u00f6nemlisi \u00e7ok daha d\u00fc\u015f\u00fck enerji t\u00fcketimi sunar. Bu b\u00f6l\u00fcmde, Android'de BLE geli\u015ftirmenin temel ta\u015flar\u0131n\u0131, GATT profillerini ve \u00f6rnek bir BLE tarama ve ba\u011flant\u0131 ak\u0131\u015f\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<p>BLE'nin kalbinde GATT (Generic Attribute Profile) yatar. GATT, BLE cihazlar\u0131n\u0131n veri al\u0131\u015fveri\u015fi yapma \u015feklini tan\u0131mlayan bir yap\u0131d\u0131r. Her BLE cihaz\u0131, bir GATT sunucusu olarak davranabilir ve servisler (Services) ve karakteristikler (Characteristics) ad\u0131 verilen yap\u0131land\u0131r\u0131lm\u0131\u015f verileri sunar. Servisler, belirli bir i\u015flevselli\u011fi grupland\u0131r\u0131r (\u00f6rne\u011fin, Kalp At\u0131\u015f H\u0131z\u0131 Servisi). Her servis i\u00e7inde ise, karakteristikler bulunur; bunlar, servis ile ilgili tek bir veri noktas\u0131n\u0131 temsil eder (\u00f6rne\u011fin, kalp at\u0131\u015f h\u0131z\u0131 de\u011feri). Karakteristikler ayr\u0131ca a\u00e7\u0131klay\u0131c\u0131lar (Descriptors) i\u00e7erebilir, bu da karakteristik hakk\u0131nda ek bilgi sa\u011flar. Bu hiyerar\u015fik yap\u0131, BLE cihazlar\u0131 aras\u0131ndaki veri ileti\u015fimini standartla\u015ft\u0131r\u0131r.<\/p>\n<p>Android'de BLE ile \u00e7al\u0131\u015fmak i\u00e7in, \u00f6ncelikle Bluetooth adapt\u00f6r\u00fcn\u00fc ve izinleri yukar\u0131da Klasik Bluetooth i\u00e7in anlat\u0131ld\u0131\u011f\u0131 gibi etkinle\u015ftirmelisiniz. Ek olarak, BLE taramas\u0131 i\u00e7in <code>BluetoothLeScanner<\/code> s\u0131n\u0131f\u0131n\u0131 kullan\u0131r\u0131z. Bu s\u0131n\u0131f, \u00e7evredeki BLE cihazlar\u0131n\u0131 asenkron olarak taramak i\u00e7in g\u00fc\u00e7l\u00fc filtreleme yetenekleri sunar. Tarama sonu\u00e7lar\u0131 bir <code>ScanCallback<\/code> \u00fczerinden al\u0131n\u0131r:<\/p>\n<pre><code><pre><code>\nprivate val bluetoothLeScanner: BluetoothLeScanner? by lazy {\n    bluetoothAdapter?.bluetoothLeScanner\n}\n\nprivate val scanSettings = ScanSettings.Builder()\n    .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)\n    .build()\n\nprivate val leScanCallback: ScanCallback = object : ScanCallback() {\n    override fun onScanResult(callbackType: Int, result: ScanResult) {\n        super.onScanResult(callbackType, result)\n        result.device?.let { device ->\n            \/\/ Cihaz\u0131 listede olup olmad\u0131\u011f\u0131n\u0131 kontrol et ve ekle\n            Log.d(\"BLE\", \"BLE cihaz\u0131 bulundu: ${device.name ?: \"Bilinmeyen\"} - ${device.address}\")\n            \/\/ Cihaz\u0131 bir RecyclerView'e ekleyebilirsiniz\n        }\n    }\n\n    override fun fun onBatchScanResults(results: MutableList<ScanResult>?) {\n        super.onBatchScanResults(results)\n        results?.forEach { result ->\n            result.device?.let { device ->\n                Log.d(\"BLE\", \"Batch BLE cihaz\u0131 bulundu: ${device.name ?: \"Bilinmeyen\"} - ${device.address}\")\n            }\n        }\n    }\n\n    override fun onScanFailed(errorCode: Int) {\n        super.onScanFailed(errorCode)\n        Log.e(\"BLE\", \"BLE taramas\u0131 ba\u015far\u0131s\u0131z oldu: $errorCode\")\n        Toast.makeText(this@MainActivity, \"BLE taramas\u0131 ba\u015far\u0131s\u0131z oldu.\", Toast.LENGTH_SHORT).show()\n    }\n}\n\nfun startBleScan() {\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED)) {\n        \/\/ \u0130zinleri iste\n        ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT), REQUEST_BLUETOOTH_PERMISSIONS)\n        return\n    }\n    \/\/ \u0130zinler kontrol edildikten veya zaten verilmi\u015fse taramay\u0131 ba\u015flat\n    bluetoothLeScanner?.startScan(null, scanSettings, leScanCallback)\n    Toast.makeText(this, \"BLE taramas\u0131 ba\u015flat\u0131ld\u0131...\", Toast.LENGTH_SHORT).show()\n    \/\/ Belirli bir s\u00fcre sonra taramay\u0131 durdurmak i\u00e7in Handler kullan\u0131n\n    Handler(Looper.getMainLooper()).postDelayed({ stopBleScan() }, SCAN_PERIOD)\n}\n\nfun stopBleScan() {\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED)) {\n        \/\/ \u0130zinleri kontrol et, gerekirse tekrar iste (veya taramay\u0131 durdurma)\n        Log.w(\"BLE\", \"BLE taramas\u0131 durdurulamad\u0131, izinler eksik.\")\n        return\n    }\n    bluetoothLeScanner?.stopScan(leScanCallback)\n    Toast.makeText(this, \"BLE taramas\u0131 durduruldu.\", Toast.LENGTH_SHORT).show()\n}\n<\/code><\/pre>\n<p>Bir BLE cihaza ba\u011fland\u0131ktan sonra, <code>BluetoothGatt<\/code> objesini kullanarak servisleri ke\u015ffeder, karakteristikleri okur\/yazar ve bildirimlere (notifications) abone olabilirsiniz. Ba\u011flant\u0131, <code>BluetoothDevice<\/code> objesinin <code>connectGatt()<\/code> metodu ile kurulur ve bir <code>BluetoothGattCallback<\/code> \u00fczerinden ba\u011flant\u0131 durumu, servis ke\u015ffi ve karakteristik de\u011fi\u015fiklikleri gibi olaylar dinlenir.<\/p>\n<pre><code><pre><code>\nprivate var bluetoothGatt: BluetoothGatt? = null\n\nprivate val gattCallback = object : BluetoothGattCallback() {\n    override fun onConnectionStateChange(gatt: BluetoothGatt?, status: Int, newState: Int) {\n        super.onConnectionStateChange(gatt, status, newState)\n        if (newState == BluetoothProfile.STATE_CONNECTED) {\n            Log.i(\"BLE\", \"BLE cihaz\u0131na ba\u011flan\u0131ld\u0131.\")\n            gatt?.discoverServices() \/\/ Servisleri ke\u015ffet\n        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {\n            Log.i(\"BLE\", \"BLE cihaz\u0131ndan ba\u011flant\u0131 kesildi.\")\n            bluetoothGatt?.close()\n            bluetoothGatt = null\n        }\n    }\n\n    override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {\n        super.onServicesDiscovered(gatt, status)\n        if (status == BluetoothGatt.GATT_SUCCESS) {\n            gatt?.services?.forEach { service ->\n                Log.d(\"BLE\", \"Servis bulundu: ${service.uuid}\")\n                service.characteristics.forEach { characteristic ->\n                    Log.d(\"BLE\", \"Karakteristik bulundu: ${characteristic.uuid}\")\n                    \/\/ \u0130stenilen karakteristikten veri okuma veya bildirimlere abone olma\n                    if (characteristic.uuid == MY_CHARACTERISTIC_UUID) {\n                        gatt.readCharacteristic(characteristic) \/\/ Tek seferlik okuma\n                        gatt.setCharacteristicNotification(characteristic, true) \/\/ Bildirimleri etkinle\u015ftir\n                        val descriptor = characteristic.getDescriptor(CCC_DESCRIPTOR_UUID)\n                        descriptor?.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE\n                        gatt.writeDescriptor(descriptor) \/\/ Bildirimleri a\u00e7mak i\u00e7in descriptor yaz\n                    }\n                }\n            }\n        } else {\n            Log.w(\"BLE\", \"Servis ke\u015ffi ba\u015far\u0131s\u0131z oldu: $status\")\n        }\n    }\n\n    override fun onCharacteristicRead(gatt: BluetoothGatt?, characteristic: BluetoothGattCharacteristic?, status: Int) {\n        super.onCharacteristicRead(gatt, characteristic, status)\n        if (status == BluetoothGatt.GATT_SUCCESS) {\n            val value = characteristic?.value?.let { String(it, Charsets.UTF_8) }\n            Log.d(\"BLE\", \"Karakteristik okundu: ${characteristic?.uuid} -> $value\")\n        }\n    }\n\n    override fun onCharacteristicChanged(gatt: BluetoothGatt?, characteristic: BluetoothGattCharacteristic?, value: ByteArray?) {\n        super.onCharacteristicChanged(gatt, characteristic, value)\n        val changedValue = value?.let { String(it, Charsets.UTF_8) }\n        Log.d(\"BLE\", \"Karakteristik de\u011fi\u015fti (bildirim): ${characteristic?.uuid} -> $changedValue\")\n        \/\/ UI'\u0131 g\u00fcncelle\n    }\n\n    override fun onCharacteristicWrite(gatt: BluetoothGatt?, characteristic: BluetoothGattCharacteristic?, status: Int) {\n        super.onCharacteristicWrite(gatt, characteristic, status)\n        if (status == BluetoothGatt.GATT_SUCCESS) {\n            Log.d(\"BLE\", \"Karakteristik ba\u015far\u0131yla yaz\u0131ld\u0131: ${characteristic?.uuid}\")\n        } else {\n            Log.e(\"BLE\", \"Karakteristik yazma ba\u015far\u0131s\u0131z oldu: $status\")\n        }\n    }\n}\n\nfun connectToBleDevice(device: BluetoothDevice) {\n    if (bluetoothGatt == null) {\n        bluetoothGatt = device.connectGatt(this, false, gattCallback)\n        \/\/ AutoConnect false olarak ayarlanm\u0131\u015ft\u0131r. Gerekirse true yapabilirsiniz.\n        \/\/ false: Cihaz ba\u011flant\u0131dan uzakla\u015fsa bile otomatik olarak tekrar ba\u011flanmaya \u00e7al\u0131\u015fmaz.\n        \/\/ true: Ba\u011flant\u0131 kesildi\u011finde otomatik olarak tekrar ba\u011flanmaya \u00e7al\u0131\u015f\u0131r.\n    } else {\n        bluetoothGatt?.connect() \/\/ Zaten ba\u011fl\u0131ysa tekrar ba\u011flanmay\u0131 dener\n    }\n}\n<\/code><\/pre>\n<p>BLE ile \u00e7al\u0131\u015f\u0131rken dikkat edilmesi gereken en \u00f6nemli nokta, i\u015flemlerin asenkron do\u011fas\u0131d\u0131r. <code>BluetoothGattCallback<\/code> \u00fczerindeki t\u00fcm metodlar, Android'in ana i\u015f par\u00e7ac\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r, bu nedenle UI g\u00fcncellemelerini do\u011frudan bu metodlar i\u00e7inde yapabilirsiniz. Ancak, uzun s\u00fcreli veya yo\u011fun i\u015flemler i\u00e7in yine de ayr\u0131 i\u015f par\u00e7ac\u0131klar\u0131 kullanmak ak\u0131ll\u0131ca olacakt\u0131r. Ayr\u0131ca, pil \u00f6mr\u00fcn\u00fc korumak ad\u0131na tarama ve ba\u011flant\u0131 s\u00fcrelerini optimize etmek, uygulaman\u0131z\u0131n kullan\u0131c\u0131lar taraf\u0131ndan tercih edilmesini sa\u011flayacakt\u0131r. BLE, modern uygulamalar\u0131n enerji verimlili\u011fi ve IoT entegrasyonu ihtiya\u00e7lar\u0131 i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r.<\/p>\n<h3 id=\"ble-ba\u011flant\u0131s\u0131nda-dikkat-edilmesi-gerekenler-ve-optimizasyon\">BLE Ba\u011flant\u0131s\u0131nda Dikkat Edilmesi Gerekenler ve Optimizasyon<\/h3>\n<p>BLE, d\u00fc\u015f\u00fck g\u00fc\u00e7 t\u00fcketimi avantajlar\u0131 sunarken, geli\u015ftiricilerin dikkat etmesi gereken baz\u0131 \u00f6zel durumlar ve optimizasyon teknikleri de mevcuttur. Bu konulara hakim olmak, hem uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131racak hem de kullan\u0131c\u0131 deneyimini iyile\u015ftirecektir.<\/p>\n<p><strong>Tarama Filtreleri:<\/strong> BLE taramas\u0131, \u00e7evresel cihazlar\u0131 ke\u015ffetmek i\u00e7in enerji t\u00fcketen bir i\u015flemdir. Uygulaman\u0131z\u0131n sadece belirli cihazlar\u0131 veya servisleri aramas\u0131n\u0131 sa\u011flamak, pil \u00f6mr\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde uzatabilir. <code>ScanFilter<\/code> objelerini kullanarak belirli cihaz adlar\u0131na, MAC adreslerine veya servis UUID'lerine g\u00f6re filtreleme yapabilirsiniz:<\/p>\n<pre><code><pre><code>\nval scanFilter = ScanFilter.Builder()\n    .setDeviceName(\"MyBLEDevice\") \/\/ Belirli bir cihaz ad\u0131n\u0131 filtrele\n    \/\/ .setDeviceAddress(\"XX:XX:XX:XX:XX:XX\") \/\/ Belirli bir MAC adresini filtrele\n    \/\/ .setServiceUuid(ParcelUuid(MY_SERVICE_UUID)) \/\/ Belirli bir servis UUID'sini filtrele\n    .build()\n\nval filters: MutableList<ScanFilter> = mutableListOf()\nfilters.add(scanFilter)\n\nbluetoothLeScanner?.startScan(filters, scanSettings, leScanCallback)\n<\/code><\/pre>\n<p>Bu filtreler, sadece ilgilendi\u011finiz cihazlar\u0131n <code>onScanResult<\/code> metodunuza ula\u015fmas\u0131n\u0131 sa\u011flar, b\u00f6ylece gereksiz i\u015flem y\u00fck\u00fcn\u00fc azalt\u0131r.<\/p>\n<p><strong>Ba\u011flant\u0131 Parametreleri:<\/strong> BLE ba\u011flant\u0131s\u0131n\u0131n performans\u0131n\u0131 ve g\u00fc\u00e7 t\u00fcketimini etkileyen \u00f6nemli parametreler vard\u0131r: ba\u011flant\u0131 aral\u0131\u011f\u0131 (connection interval), gecikme (slave latency) ve denetim zaman a\u015f\u0131m\u0131 (supervision timeout). <code>BluetoothGatt.requestConnectionPriority()<\/code> metodunu kullanarak bu parametreler \u00fczerinde bir dereceye kadar kontrol sahibi olabilirsiniz. \u00d6rne\u011fin, h\u0131zl\u0131 veri aktar\u0131m\u0131 gerekti\u011finde <code>CONNECTION_PRIORITY_HIGH<\/code> kullanmak gecikmeyi azaltabilir, ancak daha fazla g\u00fc\u00e7 t\u00fcketir. Daha az s\u0131kl\u0131kta veri gereken durumlarda ise <code>CONNECTION_PRIORITY_LOW_POWER<\/code> tercih edilmelidir.<\/p>\n<pre><code><pre><code>\nbluetoothGatt?.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH)\n<\/code><\/pre>\n<p>Ancak unutulmamal\u0131d\u0131r ki, bu sadece bir istektir ve ba\u011fl\u0131 cihaz ile Android sistemi bu iste\u011fi reddedebilir veya kendi parametrelerini uygulayabilir.<\/p>\n<p><strong>MTU (Maximum Transmission Unit) Yap\u0131land\u0131rmas\u0131:<\/strong> BLE'de varsay\u0131lan MTU boyutu genellikle 23 baytt\u0131r, bu da her pakette ta\u015f\u0131nabilecek veri miktar\u0131n\u0131 s\u0131n\u0131rlar. Daha b\u00fcy\u00fck veri paketleri g\u00f6ndermeniz gerekti\u011finde, MTU boyutunu art\u0131rmak, daha az paketle daha fazla veri g\u00f6ndermenizi sa\u011flayarak verimlili\u011fi art\u0131r\u0131r. Bu, <code>BluetoothGatt.requestMtu()<\/code> metodu ile yap\u0131l\u0131r:<\/p>\n<pre><code><pre><code>\nbluetoothGatt?.requestMtu(512) \/\/ \u00d6rne\u011fin, MTU'yu 512 bayta ayarla\n<\/code><\/pre>\n<p>Bu iste\u011fin sonucunu <code>onMtuChanged()<\/code> callback metodunda al\u0131rs\u0131n\u0131z. Her iki taraf\u0131n da MTU de\u011fi\u015fikli\u011fini desteklemesi ve kabul etmesi gerekti\u011fini unutmay\u0131n.<\/p>\n<p><strong>Hata Y\u00f6netimi ve Ba\u011flant\u0131 Kesilmesi:<\/strong> BLE ba\u011flant\u0131lar\u0131, \u00f6zellikle mobil ortamlarda, \u00e7e\u015fitli nedenlerle kesilebilir (cihaz\u0131n menzil d\u0131\u015f\u0131na \u00e7\u0131kmas\u0131, pil bitmesi vb.). <code>onConnectionStateChange()<\/code> metodunda <code>STATE_DISCONNECTED<\/code> durumunu do\u011fru bir \u015fekilde y\u00f6netmek ve uygulaman\u0131z\u0131n ba\u011flant\u0131 kesildi\u011finde ne yapaca\u011f\u0131n\u0131 belirlemek \u00f6nemlidir. Otomatik tekrar ba\u011flanma (<code>connectGatt(..., true)<\/code>) se\u00e7ene\u011fi bu durumlar i\u00e7in faydal\u0131 olabilir, ancak pil t\u00fcketimini art\u0131rabilir. Uygulaman\u0131z\u0131n hata durumlar\u0131nda kullan\u0131c\u0131ya geri bildirim sa\u011flamas\u0131 ve uygun kurtarma mekanizmalar\u0131n\u0131 (\u00f6rne\u011fin, manuel tekrar ba\u011flanma se\u00e7ene\u011fi) sunmas\u0131 \u00f6nemlidir.<\/p>\n<p><strong>Arka Plan \u0130\u015flemleri:<\/strong> Uygulaman\u0131z\u0131n arka planda BLE i\u015flemleri yapmas\u0131 gerekti\u011finde (\u00f6rne\u011fin, sens\u00f6r verilerini s\u00fcrekli toplamak), Android'in arka plan i\u015flem k\u0131s\u0131tlamalar\u0131na dikkat etmelisiniz. Genellikle bir <code>Foreground Service<\/code> kullanmak, uygulaman\u0131z\u0131n arka planda Bluetooth tarama veya ba\u011flant\u0131 i\u015flemlerini g\u00fcvenilir bir \u015fekilde s\u00fcrd\u00fcrmesini sa\u011flar ve kullan\u0131c\u0131ya bir bildirim g\u00f6stererek uygulaman\u0131n aktif oldu\u011funu belirtir. Bu sayede, sistemin uygulaman\u0131z\u0131 \u00f6ld\u00fcrme olas\u0131l\u0131\u011f\u0131 azal\u0131r ve kesintisiz BLE ileti\u015fimi sa\u011flan\u0131r.<\/p>\n<p>Bu optimizasyonlar ve dikkat edilecek noktalar, BLE tabanl\u0131 Android uygulaman\u0131z\u0131n daha kararl\u0131, verimli ve kullan\u0131c\u0131 dostu olmas\u0131na yard\u0131mc\u0131 olacakt\u0131r. Do\u011fru stratejilerle, d\u00fc\u015f\u00fck enerji t\u00fcketimi ve y\u00fcksek performans aras\u0131nda bir denge kurabilirsiniz.<\/p>\n<h3 id=\"vaka-analizi-ak\u0131ll\u0131-sens\u00f6rden-veri-okuma\">Vaka Analizi: Ak\u0131ll\u0131 Sens\u00f6rden Veri Okuma<\/h3>\n<p>Bir ak\u0131ll\u0131 sens\u00f6rden (\u00f6rne\u011fin, bir s\u0131cakl\u0131k sens\u00f6r\u00fc) veri okuma, BLE'nin en yayg\u0131n ve etkili kullan\u0131m alanlar\u0131ndan biridir. Bu senaryoda, Android uygulamam\u0131z BLE \u00f6zellikli sens\u00f6re ba\u011flanacak ve periyodik olarak veya sens\u00f6r bir de\u011fi\u015fiklik alg\u0131lad\u0131\u011f\u0131nda s\u0131cakl\u0131k verisini alacakt\u0131r.<\/p>\n<p><strong>Senaryo Ak\u0131\u015f\u0131:<\/strong><\/p>\n<ol>\n<li><strong>Sens\u00f6r\u00fcn Taranmas\u0131:<\/strong> Android uygulamas\u0131, \u00f6ncelikle belirlenmi\u015f bir servis UUID'sine (\u00f6rne\u011fin, Ortam S\u0131cakl\u0131\u011f\u0131 Servisi'nin UUID'si) sahip BLE sens\u00f6rlerini tarar. Bu, tarama filtreleri kullan\u0131larak daha verimli hale getirilir.<\/li>\n<li><strong>Ba\u011flant\u0131 Kurulumu:<\/strong> Uygulama, alg\u0131lanan sens\u00f6rlerden birine <code>connectGatt()<\/code> metodu ile ba\u011flan\u0131r.<\/li>\n<li><strong>Servis ve Karakteristik Ke\u015ffi:<\/strong> Ba\u011flant\u0131 kurulduktan sonra, uygulama <code>discoverServices()<\/code> \u00e7a\u011fr\u0131s\u0131 yaparak sens\u00f6r\u00fcn sundu\u011fu t\u00fcm GATT servislerini ve karakteristiklerini ke\u015ffeder.<\/li>\n<li><strong>S\u0131cakl\u0131k Karakteristi\u011fini Bulma:<\/strong> Ke\u015ffedilen servisler aras\u0131nda, s\u0131cakl\u0131k verisini i\u00e7eren spesifik karakteristik (\u00f6rne\u011fin, S\u0131cakl\u0131k Karakteristi\u011fi) bulunur.<\/li>\n<li><strong>Veri Okuma veya Bildirimlere Abone Olma:<\/strong>\n<ul>\n<li><strong>Periyodik Okuma:<\/strong> Uygulama, <code>readCharacteristic()<\/code> metodunu kullanarak belirli aral\u0131klarla (\u00f6rne\u011fin, her 5 saniyede bir) s\u0131cakl\u0131k de\u011ferini okuyabilir. Bu, sens\u00f6r\u00fcn veri g\u00fcncelleme h\u0131z\u0131 d\u00fc\u015f\u00fck oldu\u011funda veya sadece anl\u0131k bir okuma gerekti\u011finde kullan\u0131l\u0131r.<\/li>\n<li><strong>Bildirimlere Abone Olma:<\/strong> Daha dinamik bir yakla\u015f\u0131m i\u00e7in, uygulama s\u0131cakl\u0131k karakteristi\u011fi i\u00e7in bildirimlere (notifications) abone olabilir. Sens\u00f6r, s\u0131cakl\u0131k de\u011feri de\u011fi\u015fti\u011finde veya belirli bir aral\u0131kta otomatik olarak uygulamaya veri g\u00f6nderecektir. Bu, <code>setCharacteristicNotification(characteristic, true)<\/code> ve ard\u0131ndan ilgili istemci karakteristik yap\u0131land\u0131rma a\u00e7\u0131klay\u0131c\u0131s\u0131na (Client Characteristic Configuration Descriptor - CCCD) yazma i\u015flemiyle yap\u0131l\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Verilerin \u0130\u015flenmesi ve G\u00f6sterimi:<\/strong> Al\u0131nan s\u0131cakl\u0131k verisi (genellikle bayt dizisi olarak gelir), uygulaman\u0131n ihtiyac\u0131na g\u00f6re d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr (\u00f6rne\u011fin, IEEE-11073 standard\u0131na g\u00f6re float de\u011ferine \u00e7evrilir) ve kullan\u0131c\u0131 aray\u00fcz\u00fcnde g\u00f6sterilir.<\/li>\n<li><strong>Hata Y\u00f6netimi ve Ba\u011flant\u0131 Kesilmesi:<\/strong> Ba\u011flant\u0131 kesilmesi veya veri okuma hatalar\u0131 gibi durumlar, uygulaman\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 art\u0131rmak i\u00e7in uygun \u015fekilde ele al\u0131n\u0131r.<\/li>\n<\/ol>\n<p>Bu vaka analizi, BLE'nin ak\u0131ll\u0131 sens\u00f6rlerden ger\u00e7ek zamanl\u0131 veri toplama yetene\u011fini ve modern IoT uygulamalar\u0131n\u0131n temelini nas\u0131l olu\u015fturdu\u011funu g\u00f6stermektedir. Uygulama, kullan\u0131c\u0131lara anl\u0131k s\u0131cakl\u0131k bilgisi sunarak veya uzun vadeli veri trendlerini takip ederek de\u011ferli bir deneyim sa\u011flayabilir. Ayr\u0131ca, bu veriler bulut tabanl\u0131 bir platforma g\u00f6nderilerek daha geni\u015f \u00e7apl\u0131 analizler veya otomasyon senaryolar\u0131 i\u00e7in de kullan\u0131labilir.<\/p>\n<h2 id=\"android-bluetooth-uygulamalar\u0131nda-kullan\u0131c\u0131-deneyimi-ve-mobil-uyumluluk\">Android Bluetooth Uygulamalar\u0131nda Kullan\u0131c\u0131 Deneyimi ve Mobil Uyumluluk<\/h2>\n<p>Bir Android uygulamas\u0131nda Bluetooth i\u015flevselli\u011fi sunmak, sadece teknik entegrasyonla s\u0131n\u0131rl\u0131 de\u011fildir; ayn\u0131 zamanda m\u00fckemmel bir kullan\u0131c\u0131 deneyimi (UX) ve farkl\u0131 cihazlarda sorunsuz mobil uyumluluk sa\u011flamak da b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Kullan\u0131c\u0131lar\u0131n Bluetooth ba\u011flant\u0131lar\u0131n\u0131 kolayca y\u00f6netebilmesi, veri ak\u0131\u015f\u0131n\u0131 anlayabilmesi ve uygulaman\u0131n \u00e7e\u015fitli ekran boyutlar\u0131na ve y\u00f6nelimlerine adaptasyonu, uygulaman\u0131n ba\u015far\u0131s\u0131n\u0131 do\u011frudan etkiler.<\/p>\n<h3 id=\"kullan\u0131c\u0131-dostu-aray\u00fcz-tasar\u0131m\u0131-ve-geri-bildirim\">Kullan\u0131c\u0131 Dostu Aray\u00fcz Tasar\u0131m\u0131 ve Geri Bildirim<\/h3>\n<p>Bluetooth i\u015flemleri genellikle arama, ba\u011flanma, veri g\u00f6nderme\/alma gibi birden fazla ad\u0131m\u0131 i\u00e7erir ve bu ad\u0131mlar zaman al\u0131c\u0131 veya karma\u015f\u0131k olabilir. Bu nedenle, uygulaman\u0131z\u0131n aray\u00fcz\u00fcn\u00fcn sezgisel ve bilgilendirici olmas\u0131 gerekir:<\/p>\n<ul>\n<li><strong>Net Durum G\u00f6stergeleri:<\/strong> Kullan\u0131c\u0131ya Bluetooth'un a\u00e7\u0131k m\u0131, kapal\u0131 m\u0131, tarama yap\u0131yor mu, ba\u011fl\u0131 m\u0131 gibi durumlar\u0131n\u0131 a\u00e7\u0131k\u00e7a g\u00f6sterin. Ba\u011flant\u0131 durumundaki de\u011fi\u015fiklikleri an\u0131nda yans\u0131t\u0131n (\u00f6rne\u011fin, bir durum metni, renk de\u011fi\u015fimi).<\/li>\n<li><strong>\u0130lerleme G\u00f6stergeleri:<\/strong> Cihaz taramas\u0131, ba\u011flant\u0131 kurma veya veri transferi gibi zaman al\u0131c\u0131 i\u015flemler s\u0131ras\u0131nda bir y\u00fckleme animasyonu (spinner) veya ilerleme \u00e7ubu\u011fu g\u00f6stererek kullan\u0131c\u0131ya geri bildirim sa\u011flay\u0131n. Bu, kullan\u0131c\u0131n\u0131n uygulaman\u0131n dondu\u011funu d\u00fc\u015f\u00fcnmesini engeller.<\/li>\n<li><strong>Eri\u015filebilir Hata Mesajlar\u0131:<\/strong> Ba\u011flant\u0131 hatalar\u0131, izin reddi veya cihaz bulunamamas\u0131 gibi durumlarda, kullan\u0131c\u0131ya ne oldu\u011funu a\u00e7\u0131klayan ve sorunu \u00e7\u00f6zmek i\u00e7in ad\u0131mlar \u00f6neren anla\u015f\u0131l\u0131r hata mesajlar\u0131 sunun. Toast mesajlar\u0131 veya AlertDialog'lar bu ama\u00e7la kullan\u0131labilir.<\/li>\n<li><strong>Basit Eylem D\u00fc\u011fmeleri:<\/strong> Bluetooth'u a\u00e7ma, taramay\u0131 ba\u015flatma veya bir cihaza ba\u011flanma gibi eylemler i\u00e7in belirgin ve anla\u015f\u0131l\u0131r d\u00fc\u011fmeler kullan\u0131n.<\/li>\n<li><strong>Cihaz Listesi Y\u00f6netimi:<\/strong> Ke\u015ffedilen cihazlar\u0131 kullan\u0131c\u0131 dostu bir liste (RecyclerView) i\u00e7inde g\u00f6sterin, cihaz adlar\u0131n\u0131 ve m\u00fcmk\u00fcnse sinyal g\u00fcc\u00fcn\u00fc (RSSI) de dahil edin. Kullan\u0131c\u0131lar\u0131n kolayca se\u00e7im yapmas\u0131n\u0131 sa\u011flay\u0131n.<\/li>\n<\/ul>\n<h3 id=\"arka-plan-\u0130\u015flemleri-ve-bildirimler\">Arka Plan \u0130\u015flemleri ve Bildirimler<\/h3>\n<p>Bluetooth uygulamalar\u0131 genellikle ekran kapal\u0131yken bile veri toplamaya veya ba\u011fl\u0131 kalmaya devam etmelidir. Android'in arka plan i\u015flem k\u0131s\u0131tlamalar\u0131 (\u00f6zellikle Doze modu ve App Standby) g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, bu t\u00fcr s\u00fcrekli i\u015flemler i\u00e7in <code>Foreground Service<\/code> kullanmak en iyi yakla\u015f\u0131md\u0131r. Bir <code>Foreground Service<\/code>:<\/p>\n<ul>\n<li>Sisteme uygulaman\u0131z\u0131n aktif ve \u00f6nemli bir g\u00f6rev y\u00fcr\u00fctt\u00fc\u011f\u00fcn\u00fc bildirir.<\/li>\n<li>Kullan\u0131c\u0131ya s\u00fcrekli bir bildirim g\u00f6sterir, bu da kullan\u0131c\u0131n\u0131n uygulaman\u0131n ne yapt\u0131\u011f\u0131n\u0131 bilmesini sa\u011flar ve sistemin uygulamay\u0131 daha az \u00f6ld\u00fcrmesine neden olur.<\/li>\n<li>Bluetooth taramas\u0131 ve ba\u011flant\u0131s\u0131 gibi i\u015flemleri daha g\u00fcvenilir bir \u015fekilde s\u00fcrd\u00fcrmeye olanak tan\u0131r.<\/li>\n<\/ul>\n<pre><code><pre><code>\n\/\/ \u00d6rnek bir Foreground Service ba\u015flatma\nval serviceIntent = Intent(this, MyBluetoothService::class.java)\nContextCompat.startForegroundService(this, serviceIntent)\n\n\/\/ MyBluetoothService i\u00e7inde:\noverride fun onCreate() {\n    super.onCreate()\n    val notification = createNotification() \/\/ Bir bildirim olu\u015ftur\n    startForeground(NOTIFICATION_ID, notification) \/\/ Servisi foreground yap\n}\n<\/code><\/pre>\n<p>Bildirimler ayn\u0131 zamanda, Bluetooth ba\u011flant\u0131s\u0131n\u0131n durumu (ba\u011fland\u0131\/ba\u011flant\u0131 kesildi) veya \u00f6nemli veri al\u0131m\u0131 gibi kullan\u0131c\u0131 i\u00e7in kritik bilgileri an\u0131nda iletmek i\u00e7in de kullan\u0131labilir.<\/p>\n<h3 id=\"mobil-uyumluluk-ve-duyarl\u0131-tasar\u0131m-media-queries\">Mobil Uyumluluk ve Duyarl\u0131 Tasar\u0131m (Media Queries)<\/h3>\n<p>Android cihazlar\u0131n \u00e7e\u015fitlili\u011fi g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, uygulaman\u0131z\u0131n farkl\u0131 ekran boyutlar\u0131, \u00e7\u00f6z\u00fcn\u00fcrl\u00fckler ve cihaz y\u00f6nelimlerinde iyi g\u00f6r\u00fcnmesi ve \u00e7al\u0131\u015fmas\u0131 esast\u0131r. Geli\u015ftirme ortam\u0131n\u0131zda XML layout dosyalar\u0131n\u0131 kullanarak duyarl\u0131 tasar\u0131mlar olu\u015fturmak temeldir. Ancak e\u011fer uygulaman\u0131z\u0131n web tabanl\u0131 bir aray\u00fcz\u00fc varsa veya WebView i\u00e7inde HTML\/CSS kullan\u0131yorsan\u0131z, <code>media queries<\/code> mobil uyumluluk i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<pre><code><pre><code>\n\/* styles.css i\u00e7inde bir \u00f6rnek media query *\/\n.bluetooth-device-list {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n    gap: 16px;\n    padding: 16px;\n}\n\n@media (max-width: 600px) {\n    \/* K\u00fc\u00e7\u00fck ekranlar (telefonlar) i\u00e7in *\/\n    .bluetooth-device-list {\n        grid-template-columns: 1fr; \/* Tek s\u00fctunlu liste *\/\n        padding: 8px;\n    }\n    .device-item {\n        flex-direction: column;\n        align-items: flex-start;\n    }\n}\n\n@media (min-width: 601px) and (max-width: 1024px) {\n    \/* Orta boyutlu ekranlar (tabletler dikey) i\u00e7in *\/\n    .bluetooth-device-list {\n        grid-template-columns: repeat(2, 1fr); \/* \u0130ki s\u00fctunlu liste *\/\n    }\n}\n\n@media (min-width: 1025px) {\n    \/* B\u00fcy\u00fck ekranlar (tabletler yatay, Chromebook'lar) i\u00e7in *\/\n    .bluetooth-device-list {\n        grid-template-columns: repeat(3, 1fr); \/* \u00dc\u00e7 s\u00fctunlu liste *\/\n    }\n}\n<\/code><\/pre>\n<p>Bu CSS media query \u00f6rnekleri, uygulaman\u0131z\u0131n listeleri, d\u00fc\u011fmeleri ve metin boyutlar\u0131n\u0131 farkl\u0131 ekran geni\u015fliklerine g\u00f6re otomatik olarak ayarlamas\u0131n\u0131 sa\u011flar. Android geli\u015ftirme ba\u011flam\u0131nda, bu t\u00fcr dinamik UI adaptasyonlar\u0131 genellikle <code>ConstraintLayout<\/code>, <code>LinearLayout<\/code> ve <code>RecyclerView<\/code> gibi yerel bile\u015fenler ve farkl\u0131 <code>res\/layout<\/code> dizinleri (\u00f6rne\u011fin <code>layout-w600dp<\/code> veya <code>layout-land<\/code>) kullan\u0131larak elde edilir. Ancak modern Android geli\u015ftirmenin baz\u0131 alanlar\u0131nda (\u00f6rne\u011fin, Compose WebView veya custom WebViews) hala HTML\/CSS tabanl\u0131 i\u00e7erikler i\u00e7in bu t\u00fcr yakla\u015f\u0131mlar gerekebilir.<\/p>\n<p>Sonu\u00e7 olarak, kullan\u0131c\u0131 deneyimi ve mobil uyumluluk, bir Bluetooth uygulamas\u0131n\u0131n benimsenmesi ve ba\u015far\u0131s\u0131 i\u00e7in teknik yetenekler kadar \u00f6nemlidir. Bu alanlara yat\u0131r\u0131m yapmak, uygulaman\u0131z\u0131n geni\u015f bir kullan\u0131c\u0131 kitlesi taraf\u0131ndan sevilmesini ve tercih edilmesini sa\u011flayacakt\u0131r.<\/p>\n<h2 id=\"sonu\u00e7-ve-s\u0131k\u00e7a-sorulan-sorular\">Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makalede, Android Bluetooth geli\u015ftirmenin temelden ileri d\u00fczeye kadar bir\u00e7ok y\u00f6n\u00fcn\u00fc detayl\u0131 bir \u015fekilde inceledik. Klasik Bluetooth'un g\u00fc\u00e7l\u00fc veri transferi yeteneklerinden, Bluetooth D\u00fc\u015f\u00fck Enerji (BLE) teknolojisinin enerji verimli IoT entegrasyonlar\u0131na kadar geni\u015f bir yelpazeyi kapsayan konulara de\u011findik. \u0130zin y\u00f6netimi, cihaz ke\u015ffi, g\u00fcvenli ba\u011flant\u0131 kurma ve veri transferi i\u00e7in ad\u0131m ad\u0131m kod \u00f6rnekleri sunarak, okuyucular\u0131n bu konularda sa\u011flam bir temel olu\u015fturmas\u0131na yard\u0131mc\u0131 olmay\u0131 ama\u00e7lad\u0131k. Ayr\u0131ca, dosya payla\u015f\u0131m\u0131 ve ak\u0131ll\u0131 sens\u00f6rden veri okuma gibi ger\u00e7ek d\u00fcnya senaryolar\u0131yla Klasik ve BLE Bluetooth'un pratik uygulamalar\u0131n\u0131 g\u00f6sterdik. Uygulaman\u0131z\u0131n ba\u015far\u0131s\u0131 i\u00e7in kullan\u0131c\u0131 deneyiminin (UX) ve mobil uyumlulu\u011fun ne denli kritik oldu\u011funu da vurgulad\u0131k. Umuyoruz ki bu kapsaml\u0131 rehber, Android Bluetooth geli\u015ftirme yolculu\u011funuzda size yol g\u00f6sterir ve projelerinizi bir \u00fcst seviyeye ta\u015f\u0131man\u0131z i\u00e7in ilham verir.<\/p>\n<h3 id=\"s\u0131k\u00e7a-sorulan-sorular\">S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li>\n        <strong>Soru: Android'de Bluetooth izinlerini neden \u00e7al\u0131\u015fma zaman\u0131nda istemem gerekiyor?<\/strong><\/p>\n<p><strong>Cevap:<\/strong> Android 6.0 (Marshmallow) ve sonraki s\u00fcr\u00fcmlerden itibaren, kullan\u0131c\u0131 gizlili\u011fini ve g\u00fcvenli\u011fini art\u0131rmak amac\u0131yla, uygulaman\u0131z belirli hassas izinleri (\u00f6rne\u011fin konum veya Bluetooth ile ilgili baz\u0131 izinler) \u00e7al\u0131\u015fma zaman\u0131nda kullan\u0131c\u0131dan onay alarak istemek zorundad\u0131r. Kullan\u0131c\u0131lar bu izinleri istedikleri zaman ayarlardan iptal edebilirler. Bu durum, uygulamalar\u0131n kullan\u0131c\u0131 onay\u0131n\u0131 a\u00e7\u0131k\u00e7a almas\u0131n\u0131 ve sadece ihtiya\u00e7 duyduklar\u0131 izinleri kullanmas\u0131n\u0131 sa\u011flar.<\/p>\n<\/li>\n<li>\n        <strong>Soru: Klasik Bluetooth ve BLE aras\u0131ndaki temel farklar nelerdir?<\/strong><\/p>\n<p><strong>Cevap:<\/strong> Temel farklar \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>G\u00fc\u00e7 T\u00fcketimi:<\/strong> BLE, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, Klasik Bluetooth'a g\u00f6re \u00e7ok daha az g\u00fc\u00e7 t\u00fcketir ve bu da onu pille \u00e7al\u0131\u015fan IoT cihazlar\u0131 i\u00e7in ideal k\u0131lar.<\/li>\n<li><strong>Veri H\u0131z\u0131:<\/strong> Klasik Bluetooth genellikle daha y\u00fcksek veri h\u0131zlar\u0131na ula\u015fabilir (\u00f6rne\u011fin ses ak\u0131\u015f\u0131 i\u00e7in), BLE ise daha k\u00fc\u00e7\u00fck veri paketleri i\u00e7in optimize edilmi\u015ftir.<\/li>\n<li><strong>Ba\u011flant\u0131 S\u00fcresi:<\/strong> BLE, genellikle daha h\u0131zl\u0131 ba\u011flant\u0131 kurar.<\/li>\n<li><strong>Uygulama Alanlar\u0131:<\/strong> Klasik Bluetooth daha \u00e7ok ses aktar\u0131m\u0131, dosya transferi gibi s\u00fcrekli ve y\u00fcksek bant geni\u015fli\u011fi gerektiren durumlar i\u00e7in kullan\u0131l\u0131rken, BLE giyilebilir cihazlar, sens\u00f6rler ve ak\u0131ll\u0131 ev aksesuarlar\u0131 gibi anl\u0131k veya periyodik d\u00fc\u015f\u00fck veri transferi gerektiren durumlar i\u00e7in tercih edilir.<\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong>Soru: Bir BLE cihaz\u0131na ba\u011flan\u0131rken 'autoConnect' parametresi ne i\u015fe yarar?<\/strong><\/p>\n<p><strong>Cevap:<\/strong> <code>BluetoothDevice.connectGatt()<\/code> metodundaki <code>autoConnect<\/code> parametresi, ba\u011flant\u0131 kesildi\u011finde Android sisteminin otomatik olarak tekrar ba\u011flanmay\u0131 denemesi gerekti\u011fini belirtir. E\u011fer <code>true<\/code> olarak ayarlan\u0131rsa, cihaz menzil d\u0131\u015f\u0131na \u00e7\u0131ksa bile sistem arka planda tekrar ba\u011flanmay\u0131 dener. Bu, kullan\u0131c\u0131n\u0131n manuel olarak tekrar ba\u011flant\u0131 kurma zahmetinden kurtar\u0131r ancak pil t\u00fcketimini art\u0131rabilir. E\u011fer <code>false<\/code> olarak ayarlan\u0131rsa, ba\u011flant\u0131 kesildi\u011finde uygulaman\u0131n manuel olarak tekrar ba\u011flanma mant\u0131\u011f\u0131n\u0131 tetiklemesi gerekir.<\/p>\n<\/li>\n<li>\n        <strong>Soru: Bluetooth taramas\u0131 neden konum izni gerektirir?<\/strong><\/p>\n<p><strong>Cevap:<\/strong> Android 10 (API 29) ve \u00f6ncesinde, Bluetooth taramas\u0131 (\u00f6zellikle BLE taramas\u0131), \u00e7evredeki Wi-Fi a\u011flar\u0131n\u0131 taramaya benzer \u015fekilde cihaz\u0131n yakla\u015f\u0131k konumunu belirlemek i\u00e7in kullan\u0131labilir. Bu nedenle, Google, kullan\u0131c\u0131 gizlili\u011fini korumak amac\u0131yla Bluetooth taramas\u0131 i\u00e7in konum iznini zorunlu k\u0131lm\u0131\u015ft\u0131r. Ancak Android 12 (API 31) ve sonraki s\u00fcr\u00fcmlerde, e\u011fer uygulaman\u0131z Bluetooth taramas\u0131ndan konum bilgisi \u00e7\u0131karmayaca\u011f\u0131n\u0131 beyan ederse (<code>neverForLocation<\/code> flag'i ile), <code>BLUETOOTH_SCAN<\/code> izniyle konum izni gereklili\u011fi ortadan kalkar.<\/p>\n<\/li>\n<li>\n        <strong>Soru: Bluetooth uygulamam\u0131n arka planda g\u00fcvenilir bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 nas\u0131l sa\u011flar\u0131m?<\/strong><\/p>\n<p><strong>Cevap:<\/strong> Uygulaman\u0131z\u0131n arka planda uzun s\u00fcreli veya kritik Bluetooth i\u015flemleri yapmas\u0131 gerekiyorsa, bir <code>Foreground Service<\/code> kullanman\u0131z \u00f6nerilir. <code>Foreground Service<\/code> ile sistem, uygulaman\u0131z\u0131n aktif ve \u00f6nemli bir g\u00f6rev y\u00fcr\u00fctt\u00fc\u011f\u00fcn\u00fc bilir, bu da uygulaman\u0131z\u0131n daha az kesintiye u\u011framas\u0131n\u0131 ve sistem taraf\u0131ndan sonland\u0131r\u0131lmamas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, kullan\u0131c\u0131ya s\u00fcrekli bir bildirim g\u00f6sterilir, bu da kullan\u0131c\u0131n\u0131n uygulaman\u0131n arka planda \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan haberdar olmas\u0131n\u0131 sa\u011flar.<\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Mobil d\u00fcnyada cihazlar aras\u0131 ileti\u015fimin temel ta\u015flar\u0131ndan Bluetooth, Android uygulamalar\u0131nda kritik bir rol oynar. Ak\u0131ll\u0131 cihazlar\u0131m\u0131z\u0131n vazge\u00e7ilmezi haline&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-34291","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Android Bluetooth Geli\u015ftirme: Kapsaml\u0131 Rehber ve Uygulamalar<\/title>\n<meta name=\"description\" content=\"Mobil d\u00fcnyada cihazlar aras\u0131 ileti\u015fimin temel ta\u015flar\u0131ndan Bluetooth, Android uygulamalar\u0131nda kritik bir rol oynar. Ak\u0131ll\u0131 cihazlar\u0131m\u0131z\u0131n vazge\u00e7ilmezi haline gelen bu teknolojiyle neler yapabilece\u011fimizi, s\u0131f\u0131rdan ba\u015flayarak ad\u0131m ad\u0131m ke\u015ffedelim.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Android Bluetooth Geli\u015ftirme: Kapsaml\u0131 Rehber ve Uygulamalar\" \/>\n<meta property=\"og:description\" content=\"Mobil d\u00fcnyada cihazlar aras\u0131 ileti\u015fimin temel ta\u015flar\u0131ndan Bluetooth, Android uygulamalar\u0131nda kritik bir rol oynar. Ak\u0131ll\u0131 cihazlar\u0131m\u0131z\u0131n vazge\u00e7ilmezi haline gelen bu teknolojiyle neler yapabilece\u011fimizi, s\u0131f\u0131rdan ba\u015flayarak ad\u0131m ad\u0131m ke\u015ffedelim.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-14T06:31:19+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"32 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Android Bluetooth Geli\u015ftirme: Kapsaml\u0131 Rehber ve Uygulamalar\",\"datePublished\":\"2025-11-14T06:31:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/\"},\"wordCount\":4577,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/\",\"name\":\"Android Bluetooth Geli\u015ftirme: Kapsaml\u0131 Rehber ve Uygulamalar\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-14T06:31:19+00:00\",\"description\":\"Mobil d\u00fcnyada cihazlar aras\u0131 ileti\u015fimin temel ta\u015flar\u0131ndan Bluetooth, Android uygulamalar\u0131nda kritik bir rol oynar. Ak\u0131ll\u0131 cihazlar\u0131m\u0131z\u0131n vazge\u00e7ilmezi haline gelen bu teknolojiyle neler yapabilece\u011fimizi, s\u0131f\u0131rdan ba\u015flayarak ad\u0131m ad\u0131m ke\u015ffedelim.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android Bluetooth Geli\u015ftirme: Kapsaml\u0131 Rehber ve Uygulamalar\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Android Bluetooth Geli\u015ftirme: Kapsaml\u0131 Rehber ve Uygulamalar","description":"Mobil d\u00fcnyada cihazlar aras\u0131 ileti\u015fimin temel ta\u015flar\u0131ndan Bluetooth, Android uygulamalar\u0131nda kritik bir rol oynar. Ak\u0131ll\u0131 cihazlar\u0131m\u0131z\u0131n vazge\u00e7ilmezi haline gelen bu teknolojiyle neler yapabilece\u011fimizi, s\u0131f\u0131rdan ba\u015flayarak ad\u0131m ad\u0131m ke\u015ffedelim.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/","og_locale":"tr_TR","og_type":"article","og_title":"Android Bluetooth Geli\u015ftirme: Kapsaml\u0131 Rehber ve Uygulamalar","og_description":"Mobil d\u00fcnyada cihazlar aras\u0131 ileti\u015fimin temel ta\u015flar\u0131ndan Bluetooth, Android uygulamalar\u0131nda kritik bir rol oynar. Ak\u0131ll\u0131 cihazlar\u0131m\u0131z\u0131n vazge\u00e7ilmezi haline gelen bu teknolojiyle neler yapabilece\u011fimizi, s\u0131f\u0131rdan ba\u015flayarak ad\u0131m ad\u0131m ke\u015ffedelim.","og_url":"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-14T06:31:19+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"32 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Android Bluetooth Geli\u015ftirme: Kapsaml\u0131 Rehber ve Uygulamalar","datePublished":"2025-11-14T06:31:19+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/"},"wordCount":4577,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/","url":"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/","name":"Android Bluetooth Geli\u015ftirme: Kapsaml\u0131 Rehber ve Uygulamalar","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-14T06:31:19+00:00","description":"Mobil d\u00fcnyada cihazlar aras\u0131 ileti\u015fimin temel ta\u015flar\u0131ndan Bluetooth, Android uygulamalar\u0131nda kritik bir rol oynar. Ak\u0131ll\u0131 cihazlar\u0131m\u0131z\u0131n vazge\u00e7ilmezi haline gelen bu teknolojiyle neler yapabilece\u011fimizi, s\u0131f\u0131rdan ba\u015flayarak ad\u0131m ad\u0131m ke\u015ffedelim.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/android-bluetooth-gelistirme-kapsamli-rehber-ve-uygulamalar\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Android Bluetooth Geli\u015ftirme: Kapsaml\u0131 Rehber ve Uygulamalar"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34291"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34291\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}