package Ġcom . mas oud . ble scanner Ċ Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . bluetooth . Bluetooth Manager Ċ import Ġandroid . bluetooth . le . Scan Callback Ċ import Ġandroid . bluetooth . le . Scan Filter Ċ import Ġandroid . bluetooth . le . Scan Result Ċ import Ġandroid . bluetooth . le . Scan Settings Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Handler Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠMas oud ĠDar zi , ĠEmail Ġ: Ġmas ou dd ar zi @ gmail . com Ċ Ġ* Ġmake Ġsure Ġto Ġpass Ġcontext Ġand Ġmake Ġthe ĠUUID Ġand Ġalso Ġthe Ġtime Ġto Ġstop Ġscanning Ġoptional Ċ Ġ*/ Ċ Ċ // TODO : Ġcreate Ġsingle Tone Ġ Ġpattern Ġfor Ġinitializing Ċ // TODO : Ġcreate Ġbuilder Ġpattern Ġfor Ġpassing ĠUUID Ġfor Ġfiltering Ġfor Ġexample ĠSensor o Ġor ĠKont akt Ċ Ċ private Ġconst Ġval ĠSC AN _ PERIOD : ĠLong Ġ= Ġ 1 0 0 0 0 Ċ Ċ private Ġvar Ġis Sc anning : ĠBoolean Ġ= Ġfalse Ċ Ċ class ĠBLE Scanner ( private Ġvar Ġapplication Context : ĠContext ) Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠBLE Scanner :: class . java . simple Name ĊĊĊĠĠĠ Ġprivate Ġval Ġbluetooth Adapter : ĠBluetooth Adapter ? Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getSystem Service ( Context . BL U ETO OTH _ SERVICE ) Ġas ĠBluetooth Manager ĊĠĠĠĠĠĠĠ Ġbluetooth Manager . adapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhandler : ĠHandler Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠHandler () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠBluetooth Adapter . is Disabled : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ! isEnabled ĊĊĠĠĠ Ġfun Ġstart Scan () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Adapter ?. is Disabled !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Throws ĠException Ġor Ġreturn Ġa Ġcall Ġback Ġfor Ġenabling Ġthe Ġbluetooth ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" make Ġsure Ġyou Ġhave Ġthe Ġblue to ot Ġpermission Ġand Ġit 's Ġturned Ġon ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" star ing Ġthe ĠBLE Ġscanning ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan B le Version Above L ol lip op () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan B le Version Below L ol lip op () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġprivate Ġfun Ġscan B le Version Above L ol lip op () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfilters : ĠList < Scan Filter > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġscan Settings Ġ= ĠScan Settings . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Scan Mode ( Scan Settings . SCAN _ MODE _ LOW _ LAT ENCY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġle Scanner Ġ= Ġbluetooth Adapter ?. bluetooth Le Scanner ĊĊĠĠĠĠĠĠĠ Ġval Ġle Scan Call B acl Above L ol lip op Ġ= Ġobject Ġ: ĠScan Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Result ( callback Type : ĠInt , Ġresult : ĠScan Result ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġstop Ġafter Ġfinding Ġthe Ġdesired Ġdevice ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getDevice ( result ?. device )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle Scanner ?. stop Scan ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" device Ġis Ġ: Ġ${ result ?. device ?. address }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Failed ( errorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" failed Ġto Ġscan : Ġmake Ġsure Ġyou Ġgrant Ġthe Ġlocation Ġpermission ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġle Scanner ?. start Scan ( filters , Ġscan Settings , Ġle Scan Call B acl Above L ol lip op ) ĊĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġhandler . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle Scanner ?. stop Scan ( le Scan Call B acl Above L ol lip op ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĠSC AN _ PERIOD ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscan B le Version Below L ol lip op () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġle Scan Callback Below L ol lip op Ġ= Ġobject Ġ: ĠBluetooth Adapter . Le Scan Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Le Scan ( device : ĠBluetooth Device ?, Ġr ssi : ĠInt , Ġscan Record : ĠByteArray ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġstop Ġafter Ġfinding Ġthe Ġdesired Ġdevice ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getDevice ( device )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Adapter ?. stop Le Scan ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" device Ġis Ġ: Ġ${ device ?. address } Ġand Ġr ssi Ġis Ġ: Ġ$ rssi ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbluetooth Adapter ?. start Le Scan ( le Scan Callback Below L ol lip op ) ĊĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġhandler . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Adapter ?. stop Le Scan ( le Scan Callback Below L ol lip op ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĠSC AN _ PERIOD ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget Device ( device : ĠBluetooth Device ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// if Ġfound Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ }