공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
Android Beacon Library 사용방법에 대해서 알아보겠습니다.
https://altbeacon.github.io/android-beacon-library/index.html
위 사이트에서 기본적이 사용법이나 최적화 방법에 대해 알 수 있습니다.
.aar 파일도 다운로드 받을 수 있구요 ㅎㅎ
기본적인 사용방법입니다.
1. 안드로이드 프로젝트 생성.
안드로이드 프로젝트를 새롭게 만들어 주세요.
2. Permission 추가
저는 아래 4가지 퍼미션을 주었는데요.
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Location 퍼미션은 둘 중 하나만 줘도 된다고 합니다 ^^
그리고 API 23버전 이상에서는 LOCATION 퍼미션을 사용자에게 승인을 받아야 하는데요.
자바 코드로 구현해야 합니다.
가장 간단한 코드 :
1 2 3 | ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSIONS); | cs |
위처럼 주시면 되는데요.
PERMISSIONS 은 상수입니다. 1이상의 아무 정수 값이나 주면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | public class MainActivity extends BaseActivity implements BeaconConsumer {} // 블루투스 권한을 얻는 코드입니다. mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } else { mBeaconManager = BeaconManager.getInstanceForApplication(this); mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BEACON_PARSER)); // BEACON_PARSER 는 문자열인데요. iBeacon 이냐 EddyStone 이냐에 따라 다른 문자열을 필요로합니다. //BeaconManager.setRssiFilterImplClass(ArmaRssiFilter.class); } @Override public void onBeaconServiceConnect() { mBeaconManager.addRangeNotifier(new RangeNotifier() { @Override public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { if (beacons.size() > 0) { Iterator<Beacon> iterator = beacons.iterator(); items = new Vector<>(); while (iterator.hasNext()) { Beacon beacon = iterator.next(); String address = beacon.getBluetoothAddress(); if(address.equals(ble1) || address.equals(ble2)) { double rssi = beacon.getRssi(); int txPower = beacon.getTxPower(); double distance = Double.parseDouble(decimalFormat.format(beacon.getDistance())); int major = beacon.getId2().toInt(); int minor = beacon.getId3().toInt(); items.add(new Item(address, rssi, txPower, distance, major, minor)); /*Log.d("major ", beacon.getId2().toString()); Log.d("minor ", beacon.getId3().toString());*/ } } runOnUiThread(new Runnable() { @Override public void run() { beaconAdapter = new BeaconAdapter(items, MainActivity.this); binding.beaconListView.setAdapter(beaconAdapter); beaconAdapter.notifyDataSetChanged(); } }); } } }); try { mBeaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null)); } catch (RemoteException e) { e.printStackTrace(); } mBeaconManager.addMonitorNotifier(new MonitorNotifier() { @Override public void didEnterRegion(Region region) { Log.i(TAG, "I just saw an beacon for the first time!"); } @Override public void didExitRegion(Region region) { Log.i(TAG, "I no longer see an beacon"); } @Override public void didDetermineStateForRegion(int state, Region region) { Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state); } }); try { mBeaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId", null, null, null)); } catch (RemoteException e) { e.printStackTrace(); } } | cs |
BEACON_PARSER 에 들어갈 수 있는 문자열 목록
public static final String ALTBEACON_LAYOUT = "m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25";
public static final String EDDYSTONE_TLM_LAYOUT = "x,s:0-1=feaa,m:2-2=20,d:3-3,d:4-5,d:6-7,d:8-11,d:12-15";
public static final String EDDYSTONE_UID_LAYOUT = "s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19";
public static final String EDDYSTONE_URL_LAYOUT = "s:0-1=feaa,m:2-2=10,p:3-3:-41,i:4-21v";
public static final String URI_BEACON_LAYOUT = "s:0-1=fed8,m:2-2=00,p:3-3:-41,i:4-21v";
iBeacon 은 "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25" 이에요.
위 5가지 중에 골라서 사용하면 됩니다.
iBeacon을 스캔할 경우 ALTBEACON_LAYOUT 에 있는 문자열을 쓰시면 됩니다.
기본적인 사용법은 위와 같구요.
깃허브에 프로젝트 공유해 놓았습니다.
https://github.com/Parksunggyun/BS
감사합니다.
'안드로이드' 카테고리의 다른 글
안드로이드 ConstrainLayout이란? 제약조건 유형 및 RelativePositioning (상대 위치 지정) 제약 조건 (0) | 2017.11.08 |
---|---|
안드로이드 블루투스 묻지 않고 On/Off 하는 방법 (0) | 2017.11.07 |
안드로이드 ClickableSpan, SpannableString => String - 문자열 중 특정 문자열에 클릭 이벤트 onClickListener 적용하기! (0) | 2017.10.26 |
안드로이드 RecylerView에 SnapHelper를 사용해서 스냅(snap)적용시키기! (2) | 2017.10.25 |
안드로이드 TextView, EditText 에 java 코드로 Bold 속성 주기! (0) | 2017.10.23 |