{"id":13744160,"url":"https://github.com/myflashlab/bluetooth-ANE","last_synced_at":"2025-05-09T02:32:45.439Z","repository":{"id":146413449,"uuid":"48876552","full_name":"myflashlab/bluetooth-ANE","owner":"myflashlab","description":"With Bluetooth air native extension, you'll have access to the Bluetooth hardware. It enable you to scan for other devices, connect to and pair with them and finally transfer data between them.","archived":true,"fork":false,"pushed_at":"2016-05-17T06:02:23.000Z","size":1596,"stargazers_count":8,"open_issues_count":11,"forks_count":11,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-11-15T15:42:15.926Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"ActionScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/myflashlab.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog.txt","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-01-01T11:37:04.000Z","updated_at":"2023-01-28T00:43:45.000Z","dependencies_parsed_at":null,"dependency_job_id":"37c987af-5042-4968-8173-497c7aef0c26","html_url":"https://github.com/myflashlab/bluetooth-ANE","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/myflashlab%2Fbluetooth-ANE","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/myflashlab%2Fbluetooth-ANE/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/myflashlab%2Fbluetooth-ANE/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/myflashlab%2Fbluetooth-ANE/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/myflashlab","download_url":"https://codeload.github.com/myflashlab/bluetooth-ANE/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253177845,"owners_count":21866406,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T05:01:04.172Z","updated_at":"2025-05-09T02:32:45.050Z","avatar_url":"https://github.com/myflashlab.png","language":"ActionScript","readme":"# Bluetooth ANE V2.0 (Android)\nWith Bluetooth ANE, you'll have access to the Bluetooth hardware. It enable you to scan for other devices, connect to and pair with them and finally transfer data between them. This ANE has been built with consideration of connecting to Android devices to each other. if you need it for other purposes, feel free to contact us here: http://www.myflashlabs.com/contact/ (This is NOT a Bluetooth LE API)\n\n# asdoc\n[find the latest asdoc for this ANE here.](http://myflashlab.github.io/asdoc/com/myflashlab/air/extensions/bluetooth/package-detail.html)\n\n# Demo .apk\nyou may like to see the ANE in action? [Download demo .apk](https://github.com/myflashlab/bluetooth-ANE/tree/master/FD/dist)\n\n**NOTICE**: the demo ANE works only after you hit the \"OK\" button in the dialog which opens. in your tests make sure that you are NOT calling other ANE methods prior to hitting the \"OK\" button.\n[Download the ANE](https://github.com/myflashlab/bluetooth-ANE/tree/master/FD/lib)\n\n# Air Usage:\n```actionscript\npackage \n{\n\timport com.myflashlab.air.extensions.bluetooth.Bluetooth;\n\timport com.myflashlab.air.extensions.bluetooth.BluetoothEvent;\n\timport com.doitflash.consts.Direction;\n\timport com.doitflash.consts.Orientation;\n\timport com.doitflash.mobileProject.commonCpuSrc.DeviceInfo;\n\timport com.doitflash.starling.utils.list.List;\n\timport com.doitflash.text.modules.MySprite;\n\timport com.greensock.TweenMax;\n\timport flash.desktop.NativeApplication;\n\timport flash.desktop.SystemIdleMode;\n\timport flash.display.Sprite;\n\timport flash.display.StageAlign;\n\timport flash.display.StageScaleMode;\n\timport flash.events.Event;\n\timport flash.events.InvokeEvent;\n\timport flash.events.KeyboardEvent;\n\timport flash.events.MouseEvent;\n\timport flash.text.AntiAliasType;\n\timport flash.text.TextField;\n\timport flash.text.TextFieldAutoSize;\n\timport flash.text.TextFieldType;\n\timport flash.text.TextFormat;\n\timport flash.text.TextFormatAlign;\n\timport flash.ui.Keyboard;\n\timport flash.ui.Multitouch;\n\timport flash.ui.MultitouchInputMode;\n\t\n\t/**\n\t * ...\n\t * @author Hadi Tavakoli - 2/24/2014 5:30 PM\n\t */\n\tpublic class Demo2 extends Sprite \n\t{\n\t\tprivate var _ex:Bluetooth;\n\t\tprivate var _buttonsHolder:Sprite;\n\t\tprivate var _devicesHolder:Sprite;\n\t\tprivate var _list:List;\n\t\t\n\t\tprivate var _txt:TextField;\n\t\t\n\t\tprivate var _ball:MySprite;\n\t\t\n\t\tprivate const BTN_WIDTH:Number = 150;\n\t\tprivate const BTN_HEIGHT:Number = 100;\n\t\t\n\t\tpublic function Demo2():void \n\t\t{\n\t\t\tMultitouch.inputMode = MultitouchInputMode.GESTURE;\n\t\t\tNativeApplication.nativeApplication.addEventListener(Event.ACTIVATE, handleActivate, false, 0, true);\n\t\t\tNativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true);\n\t\t\tNativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke, false, 0, true);\n\t\t\tNativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, handleKeys, false, 0, true);\n\t\t\t\n\t\t\tstage.addEventListener(Event.RESIZE, onResize);\n\t\t\tstage.scaleMode = StageScaleMode.NO_SCALE;\n\t\t\tstage.align = StageAlign.TOP_LEFT;\n\t\t\t\n\t\t\t_buttonsHolder = new Sprite();\n\t\t\t_buttonsHolder.visible = false;\n\t\t\tthis.addChild(_buttonsHolder);\n\t\t\t\n\t\t\t_devicesHolder = new Sprite();\n\t\t\t_devicesHolder.visible = false;\n\t\t\tthis.addChild(_devicesHolder);\n\t\t\t\n\t\t\t_list = new List();\n\t\t\t_list.holder = _devicesHolder;\n\t\t\t_list.itemsHolder = new Sprite();\n\t\t\t_list.orientation = Orientation.VERTICAL;\n\t\t\t_list.hDirection = Direction.LEFT_TO_RIGHT;\n\t\t\t_list.vDirection = Direction.TOP_TO_BOTTOM;\n\t\t\t_list.space = 2;\n\t\t\t\n\t\t\tinit();\n\t\t\tonResize();\n\t\t}\n\t\t\n\t\tprivate function onInvoke(e:InvokeEvent):void\n\t\t{\n\t\t\tNativeApplication.nativeApplication.removeEventListener(InvokeEvent.INVOKE, onInvoke);\n\t\t}\n\t\t\n\t\tprivate function handleActivate(e:Event):void\n\t\t{\n\t\t\tNativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.KEEP_AWAKE;\n\t\t}\n\t\t\n\t\tprivate function handleDeactivate(e:Event):void\n\t\t{\n\t\t\t\n\t\t}\n\t\t\n\t\tprivate function handleKeys(e:KeyboardEvent):void\n\t\t{\n\t\t\tif(e.keyCode == Keyboard.BACK)\n            {\n\t\t\t\tif (_ex) \n\t\t\t\t{\n\t\t\t\t\t_ex.dispose(); // ALWAYS dispose the bluetooth extension before closing your app\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\t\t\t\tNativeApplication.nativeApplication.exit();\n            }\n\t\t}\n\t\t\n\t\tprivate function onResize(e:*=null):void\n\t\t{\t\t\t\n\t\t\tif (_devicesHolder)\n\t\t\t{\n\t\t\t\t_devicesHolder.y = _buttonsHolder.y + _buttonsHolder.height + 5;\n\t\t\t}\n\t\t\t\n\t\t\tif (_txt)\n\t\t\t{\n\t\t\t\t_txt.width = stage.stageWidth;\n\t\t\t\t_txt.height = 100;\n\t\t\t\t_txt.y = stage.stageHeight - _txt.height;\n\t\t\t\t_txt.x = stage.stageWidth / 2 - _txt.width / 2;\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate function init():void\n\t\t{\n\t\t\t_txt = new TextField();\n\t\t\t_txt.mouseEnabled = false;\n\t\t\t_txt.selectable = false;\n\t\t\t//_txt.autoSize = TextFieldAutoSize.LEFT;\n\t\t\t_txt.defaultTextFormat = new TextFormat(null, 22, null, null, null, null, null, null, \"center\");\n\t\t\t_txt.text = \"Scan to find a device\";\n\t\t\t_txt.scaleX = _txt.scaleY = DeviceInfo.dpiScaleMultiplier;\n\t\t\tthis.addChild(_txt);\n\t\t\t\n\t\t\t// initialize the extension\n\t\t\t_ex = new Bluetooth();\n\t\t\t_ex.addEventListener(BluetoothEvent.BLUETOOTH_STATE , bluetoothState);\n\t\t\t_ex.addEventListener(BluetoothEvent.COMMUNICATION_STATUS , communication);\n\t\t\t_ex.addEventListener(BluetoothEvent.CONNECTION , connection);\n\t\t\t_ex.addEventListener(BluetoothEvent.DIALOG_STATUS , dialog);\n\t\t\t_ex.addEventListener(BluetoothEvent.DISCOVERING_STATUS , discovering);\n\t\t\t_ex.addEventListener(BluetoothEvent.NEW_DISCOVERD , newDiscoverd);\n\t\t\t_ex.addEventListener(BluetoothEvent.READ_MESSAGE , readMessage);\n\t\t\t_ex.addEventListener(BluetoothEvent.SCAN_MODE , scanMode);\n\t\t\t_ex.addEventListener(BluetoothEvent.SEND_MESSAGE , sendMessage);\n\t\t\t\n\t\t\tvar btn1:MySprite = createBtn(\"start scan\");\n\t\t\tbtn1.addEventListener(MouseEvent.CLICK, startScan);\n\t\t\t_buttonsHolder.addChild(btn1);\n\t\t\t\n\t\t\tfunction startScan(e:MouseEvent):void\n\t\t\t{\n\t\t\t\t_ex.startDiscovery();\n\t\t\t}\n\t\t\t\n\t\t\t// check if bluetooth is on\n\t\t\tif (_ex.isEnable)\n\t\t\t{\n\t\t\t\t_buttonsHolder.visible = true;\n\t\t\t\t_devicesHolder.visible = true;\n\t\t\t\t_ex.visible(0);\n\t\t\t\t_ex.initCommunicationService();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_ex.enable();\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate function initBall():void\n\t\t{\n\t\t\tif (_ball) removeBall();\n\t\t\t\n\t\t\t_list.removeAll();\n\t\t\t\n\t\t\t_ball = new MySprite();\n\t\t\t_ball.addEventListener(MouseEvent.MOUSE_DOWN, onDown);\n\t\t\t_ball.bgColor = 0xdf4c47;\n\t\t\t_ball.bgAlpha = 1;\n\t\t\t_ball.bgBottomLeftRadius = 20;\n\t\t\t_ball.bgBottomRightRadius = 20;\n\t\t\t_ball.bgTopLeftRadius = 20;\n\t\t\t_ball.bgTopRightRadius = 20;\n\t\t\t_ball.width = 200;\n\t\t\t_ball.height = 200;\n\t\t\t_ball.drawBg();\n\t\t\t_ball.x = stage.stageWidth / 2 - _ball.width / 2;\n\t\t\t_ball.y = stage.stageHeight / 2 - _ball.height / 2;\n\t\t\tthis.addChild(_ball);\n\t\t\tTweenMax.from(_ball, 0.5, {alpha:0} );\n\t\t\t\n\t\t\tvar txt:TextField = new TextField();\n\t\t\ttxt.mouseEnabled = false;\n\t\t\ttxt.selectable = false;\n\t\t\ttxt.autoSize = TextFieldAutoSize.LEFT;\n\t\t\ttxt.multiline = true;\n\t\t\ttxt.defaultTextFormat = new TextFormat(null, 30, 0xFFFFFF, null, null, null, null, null, \"center\");\n\t\t\ttxt.htmlText = \"DRAG\u003cbr\u003eME\";\n\t\t\ttxt.scaleX = _txt.scaleY = DeviceInfo.dpiScaleMultiplier;\n\t\t\ttxt.x = _ball.width / 2 - txt.width / 2;\n\t\t\ttxt.y = _ball.height / 2 - txt.height / 2;\n\t\t\t_ball.addChild(txt);\n\t\t}\n\t\t\n\t\tprivate function removeBall():void\n\t\t{\n\t\t\tthis.removeChild(_ball);\n\t\t\t_ball = null\n\t\t}\n\t\t\n\t\tprivate function onDown(e:MouseEvent):void\n\t\t{\n\t\t\t_ball.startDrag(false);\n\t\t\t_ball.addEventListener(MouseEvent.MOUSE_MOVE, onMove);\n\t\t\t_ball.addEventListener(MouseEvent.MOUSE_UP, onUp);\n\t\t}\n\t\t\n\t\tprivate function onMove(e:MouseEvent):void\n\t\t{\n\t\t\t//trace(_ball.x, _ball.y)\n\t\t\t_ex.sendMessage(String(Number(_ball.x / stage.stageWidth).toFixed(2)) + \"|\" + String(Number(_ball.y / stage.stageHeight).toFixed(2)));\n\t\t}\n\t\t\n\t\tprivate function onUp(e:MouseEvent):void\n\t\t{\n\t\t\t_ball.stopDrag();\n\t\t\t_ball.removeEventListener(MouseEvent.MOUSE_MOVE, onMove);\n\t\t\t_ball.removeEventListener(MouseEvent.MOUSE_UP, onUp);\n\t\t}\n\t\t\n\t\tprivate function bluetoothState(e:BluetoothEvent):void\n\t\t{\n\t\t\ttrace(\"state \u003e\u003e \" + e.param);\n\t\t\t\n\t\t\tif (e.param == \"bluetoothOn\")\n\t\t\t{\n\t\t\t\t_buttonsHolder.visible = true;\n\t\t\t\t_devicesHolder.visible = true;\n\t\t\t\t_ex.visible(0);\n\t\t\t\t_ex.initCommunicationService();\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate function communication(e:BluetoothEvent):void\n\t\t{\n\t\t\ttrace(\"communication \u003e\u003e \" + e.param);\n\t\t\t\n\t\t\tif (e.param == \"connecting\")\n\t\t\t{\n\t\t\t\t_txt.text = \"connecting to the device...\";\n\t\t\t}\n\t\t\telse if (e.param == \"connected\")\n\t\t\t{\n\t\t\t\t_txt.text = \"CONNECTED\";\n\t\t\t\tinitBall();\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate function connection(e:BluetoothEvent):void\n\t\t{\n\t\t\ttrace(\"connection \u003e\u003e \" + e.param);\n\t\t\t\n\t\t\tif (e.param == \"connectionLost\")\n\t\t\t{\n\t\t\t\t_txt.text = \"connection lost!\";\n\t\t\t\tremoveBall();\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate function dialog(e:BluetoothEvent):void\n\t\t{\n\t\t\ttrace(\"dialogStatus \u003e\u003e \" + e.param);\n\t\t}\n\t\t\n\t\tprivate function discovering(e:BluetoothEvent):void\n\t\t{\n\t\t\ttrace(\"discovering \u003e\u003e \" + e.param);\n\t\t\t\n\t\t\tif (e.param == \"discoveringStarted\")\n\t\t\t{\n\t\t\t\t_txt.text = \"Scaning...\";\n\t\t\t\t\n\t\t\t\t// remove everything inside _devicesHolder\n\t\t\t\t_list.removeAll()\n\t\t\t\t\n\t\t\t\t_devicesHolder.alpha = 0.5;\n\t\t\t\t_devicesHolder.mouseEnabled = false;\n\t\t\t\t_devicesHolder.mouseChildren = false;\n\t\t\t}\n\t\t\telse if (e.param == \"discoveringFinished\")\n\t\t\t{\n\t\t\t\t_txt.text = \"Scan finished\";\n\t\t\t\t\n\t\t\t\t_devicesHolder.alpha = 1;\n\t\t\t\t_devicesHolder.mouseEnabled = true;\n\t\t\t\t_devicesHolder.mouseChildren = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate function newDiscoverd(e:BluetoothEvent):void\n\t\t{\n\t\t\tvar obj:Object = e.param;\n\t\t\t\n\t\t\ttrace(\"newDiscoverd \u003e\u003e \" + \"device = \" + obj.device + \" mac :\" + obj.mac);\n\t\t\t\n\t\t\tvar btn1:MySprite = createBtn(\"Device: \" + obj.device);\n\t\t\tbtn1.data = obj;\n\t\t\tbtn1.addEventListener(MouseEvent.CLICK, toConnect);\n\t\t\t_list.add(btn1);\n\t\t\t_list.itemArrange();\n\t\t\t\n\t\t\tfunction toConnect(e:MouseEvent):void\n\t\t\t{\n\t\t\t\tvar mac:String = e.target[\"data\"].mac;\n\t\t\t\t\n\t\t\t\t// check if we are paired?\n\t\t\t\tvar pairList:Array = _ex.pairedList;\n\t\t\t\tvar currDevice:Object;\n\t\t\t\tfor (var i:int = 0; i \u003c pairList.length; i++) \n\t\t\t\t{\n\t\t\t\t\tcurrDevice = pairList[i];\n\t\t\t\t\t/*for (var name:String in currDevice) \n\t\t\t\t\t{\n\t\t\t\t\t\ttrace(name + \" = \" + currDevice[name])\n\t\t\t\t\t}\n\t\t\t\t\ttrace(\"-----------\")*/\n\t\t\t\t\tif (currDevice.mac == mac)\n\t\t\t\t\t{\n\t\t\t\t\t\t_ex.connectTo(mac);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// if we are here, it means that the devices are not paired. let's pair them now!\n\t\t\t\t_ex.pairWith(mac);\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate function readMessage(e:BluetoothEvent):void\n\t\t{\n\t\t\ttrace(\"readMessage \u003e\u003e \" + e.param);\n\t\t\tvar arr:Array = e.param.split(\"|\");\n\t\t\t\n\t\t\t// bluetooth speed is so high sometimes that it sends two pair of ball points!\n\t\t\tif (arr.length \u003e 2) return; // validate the incoming value to make sure we have one X and one Y value\n\t\t\t\n\t\t\tTweenMax.to(_ball, 0.3, {x:stage.stageWidth * Number(arr[0]), y:stage.stageHeight * Number(arr[1])} );\n\t\t\t//_ball.x = stage.stageWidth * Number(arr[0]);\n\t\t\t//_ball.y = stage.stageHeight * Number(arr[1]);\n\t\t}\n\t\t\n\t\tprivate function scanMode(e:BluetoothEvent):void\n\t\t{\n\t\t\ttrace(\"scanMode \u003e\u003e \" + e.param);\n\t\t}\n\t\t\n\t\tprivate function sendMessage(e:BluetoothEvent):void\n\t\t{\n\t\t\ttrace(\"sendMessage \u003e\u003e \" + e.param);\n\t\t}\n\t\t\n\t\tprivate function createBtn($str:String, $txtColor:uint=0x666666, $editable:Boolean=false):MySprite\n\t\t{\n\t\t\tvar sp:MySprite = new MySprite();\n\t\t\tsp.addEventListener(MouseEvent.MOUSE_OVER,  onOver);\n\t\t\tsp.addEventListener(MouseEvent.MOUSE_OUT,  onOut);\n\t\t\tsp.addEventListener(MouseEvent.CLICK,  onOut);\n\t\t\tsp.bgAlpha = 1;\n\t\t\tsp.bgColor = 0xDFE4FF;\n\t\t\tsp.drawBg();\n\t\t\tsp.width = BTN_WIDTH * DeviceInfo.dpiScaleMultiplier;\n\t\t\tsp.height = BTN_HEIGHT * DeviceInfo.dpiScaleMultiplier;\n\t\t\t\n\t\t\tfunction onOver(e:MouseEvent):void\n\t\t\t{\n\t\t\t\tsp.bgAlpha = 1;\n\t\t\t\tsp.bgColor = 0xFFDB48;\n\t\t\t\tsp.drawBg();\n\t\t\t}\n\t\t\t\n\t\t\tfunction onOut(e:MouseEvent):void\n\t\t\t{\n\t\t\t\tsp.bgAlpha = 1;\n\t\t\t\tsp.bgColor = 0xDFE4FF;\n\t\t\t\tsp.drawBg();\n\t\t\t}\n\t\t\t\n\t\t\tvar format:TextFormat = new TextFormat(\"Arimo\", 18, $txtColor, null, null, null, null, null, TextFormatAlign.CENTER);\n\t\t\t\n\t\t\tvar txt:TextField = new TextField();\n\t\t\ttxt.autoSize = TextFieldAutoSize.LEFT;\n\t\t\ttxt.antiAliasType = AntiAliasType.ADVANCED;\n\t\t\ttxt.mouseEnabled = $editable;\n\t\t\ttxt.multiline = true;\n\t\t\ttxt.wordWrap = true;\n\t\t\ttxt.border = $editable;\n\t\t\tif ($editable) txt.type = TextFieldType.INPUT;\n\t\t\ttxt.scaleX = txt.scaleY = DeviceInfo.dpiScaleMultiplier;\n\t\t\ttxt.width = sp.width * (1 / (DeviceInfo.dpiScaleMultiplier));\n\t\t\ttxt.defaultTextFormat = format;\n\t\t\ttxt.htmlText = $str;\n\t\t\t\n\t\t\ttxt.y = sp.height - txt.height \u003e\u003e 1;\n\t\t\tsp.addChild(txt);\n\t\t\tsp.data.txt = txt;\n\t\t\t\n\t\t\treturn sp;\n\t\t}\n\t}\n\t\n}\n```\n\n# Air .xml manifest\n```xml\n\u003cuses-permission android:name=\"android.permission.BLUETOOTH\" /\u003e\n\u003cuses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" /\u003e\n\n\u003c!-- \t\n\tRequired for Bluetooth to work properly from Android 6.0 or higher. More info here: \n\thttp://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id \n--\u003e\n\u003cuses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/\u003e\n\u003cuses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/\u003e\n```\n\n# Requirements:\n* Android SDK 10 or higher\n* Air SDK 19 or higher\n\n# Commercial Version\nhttp://www.myflashlabs.com/product/bluetooth-ane-adobe-air-native-extension/\n\n![Bluetooth ANE](http://www.myflashlabs.com/wp-content/uploads/2015/11/product_adobe-air-ane-extension-bluetooth-595x738.jpg)\n\n# Tutorials\n[How to embed ANEs into **FlashBuilder**, **FlashCC** and **FlashDevelop**](https://www.youtube.com/watch?v=Oubsb_3F3ec\u0026list=PL_mmSjScdnxnSDTMYb1iDX4LemhIJrt1O)  \n[Step by step tutorial showing you how to use this ANE to make a multiplayr-game](http://www.myflashlabs.com/build-multiplayer-games-in-adobe-air-using-bluetooth-ane/)  \n\n# Changelog\n*Jan 01, 2016 - V2.0*\n* upgraded to Android Studio\n\n\n*Nov 02, 2015 - V1.9*\n* removed android-support-v4.jar dependency\n* doitflash devs merged into MyFLashLab Team\n\n\n*Feb 14, 2015 - V1.5*\n* added Android 64 support\n\n\n*Feb 25, 2014 - V1.0*\n* beginning of the journey!","funding_links":[],"categories":["Native Extension","AIR Native Extensions"],"sub_categories":["Hardware ANE"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmyflashlab%2Fbluetooth-ANE","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmyflashlab%2Fbluetooth-ANE","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmyflashlab%2Fbluetooth-ANE/lists"}