var monsterinsights_frontend = {"js_events_tracking":"true","download_extensions":"doc,pdf,ppt,zip,xls,docx,pptx,xlsx","inbound_paths":"[{\"path\":\"\\\/go\\\/\",\"label\":\"affiliate\"},{\"path\":\"\\\/recommend\\\/\",\"label\":\"affiliate\"}]","home_url":"https:\/\/accent-systems.com","hash_tracking":"false","v4_id":"G-069LN2YPE1"};
After downloading de “iBKS Hello World” project, you only have to open it on Android studio and compile it. All the needed libraries are included as dependencies and downloaded automatically. The project is structured to show three important functionalities, each one on a different class:
ScanActivity: scans and lists the beacons that are advertising around and allows the discovery of services and characteristics.
NotificationDemo: Shows a notification dialog on the App triggered by a specific beacon packet detected.
BackgroundScan: Starts background scan that allows to detect beacons and does some actions (send notification, open the app, …) even when the app is stopped. The first activity started on foreground is “MainActivity” that shows the different options of the app and also checks the app permissions.
3. App permissions
In order to manage Bluetooth in Android it’s necessary to request the user’s permission.
3.1. Location
If the Android version is 6.0 or higher, it’s necessary to request location permission. To do this it’s necessary to add permission in AndroidManifest.xml
The method which checks the location permissions is checkLocBT() in MainActivity.
3.2. Bluetooth
In order to use Bluetooth in Android devices, the first thing to do is check if the device that runs the app has Bluetooth Low Energy (beacons work with this type of protocol) and if it is enabled. In order to enable Bluetooth it’s necessary to add permission in AndroidManifest.xml
The method which checks the location permissions is inicializeBluetooth() in MainActivity.
4. Scan Bluetooth devices
All the needed functions used to scan Bluetooth devices are in ScanActivity. The steps to achieve that are:
Initialize Bluetooth Adapter and set scan settings: initBT()
Start the BLE Scan with the defined settings and the corresponding ScanCallback: startLeScan()
Wait for Bluetooth packets on ScanCallback callback (onScanResult) and do some action depending on the RSSI, advertsing, etc.
Optionally, connect to the device. In the project, the connection is made when a device of the list is clicked: onItemClick1.
Once the connection is made, a BluetoothGattCallback callback is received (onConnectionStateChange) and it’s possible to discover services, read and write the characteristics and enable notifications (all these actions generate a BluetoothGattCallback callback). At the end of the ScanActivity class there are some examples of these actions.
1 Note: On Samsung devices, the connection must be done on the main thread
The app shows a list of all Bluetooth devices detected with its own RSSI and MAC.
5. Notifications
In some cases, it’s useful to show a notification to the user when a specific beacon is detected in a particular distance range. This example is shown in the NotificationDemo.
The most common way to detect a specific beacon is by checking the identifier advertised on the Bluetooth packet, either an iBeacon or Eddystone-UID packet. The steps to achieve that are:
Start scanning as seen on ScanActivity.
Wait for Bluetooth packets on ScanCallback callback.
Check if advertising data contains the desired identifier. In this project, the identifier introduced in the settings dialog is used.
Optionally, check the RSSI in order to trigger the action only for a particular distance range between the beacon and the user. In this project we defined three different ranges (Immediate, Near, Far)
If all the conditions are true, show the dialog with the desired information: showDialog()
6. Background Scan
Another interesting function is the background scan. This one allows us to scan advertisings when the app is in background and also start some actions when the beacon is detected. The example of a background scan is in BackgroundScan class. In order to execute the background process, it is necessary to add it to AndroidManifest.xml (already added in the project):
The background scan uses an external open source library. In order to use this library it’s necessary to add to the app build.gradle the following dependency (already added in the project):
compile 'org.altbeacon:android-beacon-library:2+'
The steps to configure the background scan are:
Set Beacon Layouts. In the project there’s an example of iBeacon and Eddystone-UID layouts, but in the open source library you can find more frame types.
Set the scan period in foreground and background. Please be careful in choosing the period because if it’s too short the Android device will have high battery consumption due to the fact that Bluetooth is scanning very often.
Create the regions. It is the same as creating a list of identifiers that will be checked in every scan period.
Binds the BackgroundScan Activity to the BeaconService (mBeaconManager.bind(this)). When the onBeaconServiceConnection callback is received, enable the regions and start the scan (enableRegions()).
Wait for the callback called on every scan period, through the function didRangeBeaconsInRange, and check if the beacons have been found.
Optionally, a notification can be send to the user when a beacon is detected. There’s an example code to create a notification in the project.
(function() {
var data = {"agents":[{"name":"Eli","phone":"+34653105809","time_start":"08:00","time_end":"17:00","days":[1,2,3,4,5]},{"name":"Albert","phone":"+34662925746","time_start":"08:00","time_end":"17:00","days":[1,2,3,4,5]}],"distribution":"random","message":"Hello! I would like to ask for more info."};
var button = document.getElementById('accent-whatsapp-button');
var agentsPanel = document.getElementById('accent-whatsapp-agents');
if (!button) return;
button.addEventListener('click', function(e) {
e.preventDefault();
if (data.distribution === 'all' && data.agents.length > 1 && agentsPanel) {
// Mostrar panel d'agents
agentsPanel.classList.toggle('active');
} else {
// Obrir WhatsApp directament amb un agent
var agent = data.distribution === 'random'
? data.agents[Math.floor(Math.random() * data.agents.length)]
: data.agents[0];
var phone = agent.phone.replace(/[^0-9]/g, '');
var message = encodeURIComponent(data.message);
var url = 'https://wa.me/' + phone + '?text=' + message;
window.open(url, '_blank');
}
});
// Tancar panel si es fa clic fora
document.addEventListener('click', function(e) {
if (agentsPanel && !e.target.closest('#accent-whatsapp')) {
agentsPanel.classList.remove('active');
}
});
})();
var yith_wcwl_l10n = {"ajax_url":"/wp-admin/admin-ajax.php","redirect_to_cart":"no","yith_wcwl_button_position":"after_add_to_cart","multi_wishlist":"","hide_add_button":"1","enable_ajax_loading":"","ajax_loader_url":"https://accent-systems.com/wp-content/plugins/yith-woocommerce-wishlist/assets/images/ajax-loader-alt.svg","remove_from_wishlist_after_add_to_cart":"1","is_wishlist_responsive":"1","time_to_close_prettyphoto":"3000","fragments_index_glue":".","reload_on_found_variation":"1","mobile_media_query":"768","labels":{"cookie_disabled":"We are sorry, but this feature is available only if cookies on your browser are enabled.","added_to_cart_message":"\u003Cdiv class=\"woocommerce-notices-wrapper\"\u003E\u003Cdiv class=\"woocommerce-message\" role=\"alert\"\u003EProduct added to cart successfully\u003C/div\u003E\u003C/div\u003E"},"actions":{"add_to_wishlist_action":"add_to_wishlist","remove_from_wishlist_action":"remove_from_wishlist","reload_wishlist_and_adding_elem_action":"reload_wishlist_and_adding_elem","load_mobile_action":"load_mobile","delete_item_action":"delete_item","save_title_action":"save_title","save_privacy_action":"save_privacy","load_fragments":"load_fragments"},"nonce":{"add_to_wishlist_nonce":"7ba1a2a9f8","remove_from_wishlist_nonce":"19d18a882f","reload_wishlist_and_adding_elem_nonce":"86a7832a2a","load_mobile_nonce":"ec05872196","delete_item_nonce":"74b7410ba2","save_title_nonce":"f638aac7a9","save_privacy_nonce":"519d76fa22","load_fragments_nonce":"9fe401de99"},"redirect_after_ask_estimate":"","ask_estimate_redirect_url":"https://accent-systems.com","enable_notices":""};
//# sourceURL=jquery-yith-wcwl-js-extra
var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Share on Facebook","shareOnTwitter":"Share on Twitter","pinIt":"Pin it","download":"Download","downloadImage":"Download image","fullscreen":"Fullscreen","zoom":"Zoom","share":"Share","playVideo":"Play Video","previous":"Previous","next":"Next","close":"Close","a11yCarouselPrevSlideMessage":"Previous slide","a11yCarouselNextSlideMessage":"Next slide","a11yCarouselFirstSlideMessage":"This is the first slide","a11yCarouselLastSlideMessage":"This is the last slide","a11yCarouselPaginationBulletMessage":"Go to slide"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":991,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet Portrait","value":991,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":false}},"hasCustomBreakpoints":true},"version":"3.35.8","is_static":false,"experimentalFeatures":{"e_font_icon_svg":true,"additional_custom_breakpoints":true,"container":true,"e_optimized_markup":true,"e_pro_free_trial_popup":true,"nested-elements":true,"home_screen":true,"global_classes_should_enforce_capabilities":true,"e_variables":true,"cloud-library":true,"e_opt_in_v4_page":true,"e_components":true,"e_interactions":true,"e_editor_one":true,"import-export-customization":true},"urls":{"assets":"https:\/\/accent-systems.com\/wp-content\/plugins\/elementor\/assets\/","ajaxurl":"https:\/\/accent-systems.com\/wp-admin\/admin-ajax.php","uploadUrl":"https:\/\/accent-systems.com\/wp-content\/uploads"},"nonces":{"floatingButtonsClickTracking":"3b300235ba"},"swiperClass":"swiper","settings":{"page":[],"editorPreferences":[]},"kit":{"viewport_tablet":"991","active_breakpoints":["viewport_mobile","viewport_tablet"],"global_image_lightbox":"yes","lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description"},"post":{"id":221068,"title":"iBKS%20Hello%20World%20for%20Android%20-%20Accent%20Systems","excerpt":"","featuredImage":false}};
//# sourceURL=elementor-frontend-js-before
var js_porto_vars = {"rtl":"","theme_url":"https://accent-systems.com/wp-content/themes/porto-child","ajax_url":"https://accent-systems.com/wp-admin/admin-ajax.php?lang=en","cart_url":"https://accent-systems.com/cart/","change_logo":"","container_width":"1140","grid_gutter_width":"30","show_sticky_header":"1","show_sticky_header_tablet":"1","show_sticky_header_mobile":"","ajax_loader_url":"//accent-systems.com/wp-content/themes/porto/images/ajax-loader@2x.gif","category_ajax":"","compare_popup":"1","compare_popup_title":"","prdctfltr_ajax":"","slider_loop":"1","slider_autoplay":"","slider_autoheight":"","slider_speed":"5000","slider_nav":"","slider_nav_hover":"1","slider_margin":"","slider_dots":"1","slider_animatein":"","slider_animateout":"","product_thumbs_count":"4","product_zoom":"1","product_zoom_mobile":"1","product_image_popup":"1","zoom_type":"inner","zoom_scroll":"1","zoom_lens_size":"200","zoom_lens_shape":"square","zoom_contain_lens":"1","zoom_lens_border":"1","zoom_border_color":"#888888","zoom_border":"0","screen_xl":"1170","screen_xxl":"1420","mfp_counter":"%curr% of %total%","mfp_img_error":"\u003Ca href=\"%url%\"\u003EThe image\u003C/a\u003E could not be loaded.","mfp_ajax_error":"\u003Ca href=\"%url%\"\u003EThe content\u003C/a\u003E could not be loaded.","popup_close":"Close","popup_prev":"Previous","popup_next":"Next","request_error":"The requested content cannot be loaded.\u003Cbr/\u003EPlease try again later.","loader_text":"Loading...","submenu_back":"Back","porto_nonce":"c0a6534a6f","use_skeleton_screen":[],"user_edit_pages":"","quick_access":"Click to edit this element.","goto_type":"Go To the Type Builder.","legacy_mode":"","home_url":"https://accent-systems.com/","is_multisite":"","current_blog_id":"1","texts":{"search_history_title":"Search History","search_history_clear_all":"Clear"},"add_to_label":"Add to cart","login_popup_waiting_msg":"Please wait...","wc_placeholder_img":"https://accent-systems.com/wp-content/uploads/woocommerce-placeholder-300x300.png","shop_filter_layout":null,"func_url":"https://accent-systems.com/wp-content/plugins/porto-functionality/","active_lang":"en"};
//# sourceURL=porto-theme-js-extra