336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Android Beacon 연동하기
비콘을 연동해보기 위해서 Android Studio 프로젝트를 하나 생성한다
우선은 Gradle Scripts에서 build.gradle에서 2가지를 추가해준다
* Beacon SDK 추가
1
2
3
4
5
6
7
8
9
10
11
|
// 추가 할 부분
repositories {
jcenter()
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.estimote:sdk:0.10.4@aar'
}
|
cs |
그런 후 Class를 하나 생성해서 다음의 소스를 붙여넣는다
Class 명은 MyApplication으로 생성해준다
* MyApplication - Class
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
77
78
|
import android.app.Application;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import com.estimote.sdk.Beacon;
import com.estimote.sdk.BeaconManager;
import com.estimote.sdk.Region;
import java.util.List;
import java.util.UUID;
/**
* Created by MinChang Jang on 2016-06-23.
*/
public class MyApplication extends Application {
private BeaconManager beaconManager;
/**
* Application을 설치할 때 실행됨.
*/
@Override
public void onCreate() {
super.onCreate();
beaconManager = new BeaconManager(getApplicationContext());
// Application 설치가 끝나면 Beacon Monitoring Service를 시작한다.
// Application을 종료하더라도 Service가 계속 실행된다.
beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
@Override
public void onServiceReady() {
beaconManager.startMonitoring(new Region(
"monitored region",
UUID.fromString("74278BDA-B644-4520-8F0C-720EAF059935"), // 본인이 연결할 Beacon의 ID와 Major / Minor Code를 알아야 한다.
0, 0));
}
});
// Android 단말이 Beacon 의 송신 범위에 들어가거나, 나왔을 때를 체크한다.
beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener() {
@Override
public void onEnteredRegion(Region region, List<Beacon> list) {
showNotification("들어옴", "비콘 연결됨" + list.get(0).getRssi());
// getApplicationContext().startActivity(new Intent(getApplicationContext(), PopupActivity.class).putExtra("uuid", String.valueOf(list.get(0).getProximityUUID()) ).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
@Override
public void onExitedRegion(Region region) {
showNotification("나감", "비콘 연결끊김");
}
});
}
/**
* Notification으로 Beacon 의 신호가 연결되거나 끊겼음을 알림.
* @param title
* @param message
*/
public void showNotification(String title, String message) {
Intent notifyIntent = new Intent(this, MainActivity.class);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivities(this, 0,
new Intent[] { notifyIntent }, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(this)
.setSmallIcon(android.R.drawable.ic_dialog_info)
.setContentTitle(title)
.setContentText(message)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.build();
notification.defaults |= Notification.DEFAULT_SOUND;
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, notification);
}
}
|
cs |
위 클래스는 Application의 설치가 끝나고 최초로 실행될 때 수행되는 코드를 의미한다
주석을 보면 각각의 기능이 되어 있으므로 읽고 언제 수행되는지를 대충 파악하면 된다
소스 중간에 보면 UUID.fromString해서 문자값이 들어가 있는데 저것은 Beacon의 ID값이다
사용을 할 Beacon 마다 다르므로 Beacon의 아이디를 넣어주면 된다
이제는 Manifest를 등록을 해본다
우선 application에서 name을 추가해서 MyApplication을 추가해준다
추가하고 나서 이제 MainActivity를 작성해준다
* MainActivity
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
|
public class MainActivity extends AppCompatActivity {
// private BeaconManager beaconManager;
// private Region region;
// private TextView tvId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// tvId = (TextView) findViewById(R.id.tvId);
// beaconManager = new BeaconManager(this);
//
// // add this below:
// beaconManager.setRangingListener(new BeaconManager.RangingListener() {
// @Override
// public void onBeaconsDiscovered(Region region, List<Beacon> list) {
// if (!list.isEmpty()) {
// Beacon nearestBeacon = list.get(0);
// Log.d("Airport", "Nearest places: " + nearestBeacon.getRssi());
// tvId.setText(nearestBeacon.getRssi() + "");
// }
// }
// });
//
// region = new Region("ranged region",
// UUID.fromString("74278BDA-B644-4520-8F0C-720EAF059935"), null, null); // 본인이 연결할 Beacon의 ID와 Major / Minor Code를 알아야 한다.
}
@Override
protected void onResume() {
super.onResume();
// 블루투스 권한 승낙 및 블루투스 활성화
SystemRequirementsChecker.checkWithDefaultDialogs(this);
// beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
// @Override
// public void onServiceReady() {
// beaconManager.startRanging(region);
// }
// });
}
@Override
protected void onPause() {
//beaconManager.stopRanging(region);
super.onPause();
}
}
|
cs |
주석이 되어 있는 것은 비콘을 통해서 거리를 측정하고 싶을 때 주석을 삭제하면된다
우선은 이대로 실행을 해보자
그러나 에뮬레이터로는 지원이 되지 않기 때문에 핸드폰으로 연결을 해보자
실행 결과는 다음과 같다
이제 주석처리를 지우고 비콘을 연결하고 거리를 측정해본다
* MainActivity - Beacon 거리 측정
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.estimote.sdk.Beacon;
import com.estimote.sdk.BeaconManager;
import com.estimote.sdk.Region;
import com.estimote.sdk.SystemRequirementsChecker;
import java.util.List;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
private BeaconManager beaconManager;
private Region region;
private TextView tvId;
private boolean isConnected;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvId = (TextView) findViewById(R.id.tvId);
beaconManager = new BeaconManager(this);
// 비콘의 수신 범위를 갱신 받음
beaconManager.setRangingListener(new BeaconManager.RangingListener() {
@Override
public void onBeaconsDiscovered(Region region, List<Beacon> list) {
if (!list.isEmpty()) {
Beacon nearestBeacon = list.get(0);
Log.d("Airport", "Nearest places: " + nearestBeacon.getRssi());
// nearestBeacon.getRssi() : 비콘의 수신 강도
tvId.setText(nearestBeacon.getRssi() + "");
if ( !isConnected && nearestBeacon.getRssi() > -70 ) {
isConnected = true;
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog .setTitle("알림")
.setMessage("비콘 연결")
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create().show();
}
else {
Toast.makeText(MainActivity.this, "연결 종료", Toast.LENGTH_SHORT).show();
}
}
}
});
region = new Region("ranged region",
UUID.fromString("74278BDA-B644-4520-8F0C-720EAF059935"), null, null); // 본인이 연결할 Beacon의 ID와 Major / Minor Code를 알아야 한다.
}
@Override
protected void onResume() {
super.onResume();
// 블루투스 권한 승낙 및 블루투스 활성화
SystemRequirementsChecker.checkWithDefaultDialogs(this);
beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
@Override
public void onServiceReady() {
beaconManager.startRanging(region);
}
});
}
@Override
protected void onPause() {
//beaconManager.stopRanging(region);
super.onPause();
}
}
|
cs |
비콘을 받아오는 소스는 이 부분이다
* 비콘 수신 범위 측정
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
|
// 비콘의 수신 범위를 갱신 받음
beaconManager.setRangingListener(new BeaconManager.RangingListener() {
@Override
public void onBeaconsDiscovered(Region region, List<Beacon> list) {
if (!list.isEmpty()) {
Beacon nearestBeacon = list.get(0);
Log.d("Airport", "Nearest places: " + nearestBeacon.getRssi());
// nearestBeacon.getRssi() : 비콘의 수신 강도
tvId.setText(nearestBeacon.getRssi() + "");
if ( !isConnected && nearestBeacon.getRssi() > -70 ) {
isConnected = true;
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog .setTitle("알림")
.setMessage("비콘 연결")
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create().show();
}
else if ( nearestBeacon.getRssi() < -70 ){
Toast.makeText(MainActivity.this, "연결 종료", Toast.LENGTH_SHORT).show();
isConnected = false;
}
}
}
});
|
cs |
위의 구문을 이용해서 비콘의 수신 범위를 갱신받고 수신 강도를 출력한다
또한 70이상 가까워지면 Dialog가 뜨고 범위를 나가게 되면 연결 종료라는 Toast가 뜬다
'[ Developer ] > Android' 카테고리의 다른 글
[Android] 안드로이드 Jsoup 이용한 HTML 파싱 (1) | 2016.08.13 |
---|---|
[Android] 안드로이드 서비스 이용한 타이머 Service (0) | 2016.08.07 |
[Android] 안드로이드 리시버 Receiver (0) | 2016.08.05 |
[Android] 안드로이드 앱 첫 화면 생성하기 (0) | 2016.08.04 |
[Android] 안드로이드 가로모드 Landscape (4) | 2016.08.03 |