แอปของคุณสามารถสมัครรับไฟล์แนบบีคอนบลูทูธพลังงานต่ำ (BLE) โดยใช้กลไกเดียวกันกับที่ใช้ในการสมัครรับข้อมูลข้อความที่อุปกรณ์ใกล้เคียงอื่นๆ เผยแพร่ เมื่อสมัครใช้บริการ แอปจะได้รับข้อความ จากทั้งบีคอนและอุปกรณ์ที่อยู่ใกล้เคียงโดยอัตโนมัติ
สมัครรับข้อความบีคอน BLE
แอปของคุณสามารถสมัครรับข้อความบีคอน BLE ได้ 2 วิธีดังนี้
- ในเบื้องหน้าเพื่อตอบสนองต่อการดําเนินการหรือเหตุการณ์ของผู้ใช้
- ในเบื้องหลัง เมื่อแอปไม่ได้ทํางานอยู่
สมัครใช้บริการเบื้องหน้า
เมื่อแอปติดตามข้อความบีคอนในเบื้องหน้า การสแกนจะทํางานอย่างต่อเนื่องจนกว่าแอปจะยกเลิกการสมัคร เริ่มการสมัครใช้บริการเบื้องหน้าเฉพาะเมื่อแอปทํางานอยู่ ซึ่งโดยปกติแล้วจะตอบสนองต่อการดําเนินการของผู้ใช้
แอปของคุณเริ่มการสมัครใช้บริการเบื้องหน้าได้ด้วยการโทรNearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions)
และตั้งค่าตัวเลือก Strategy
เป็น BLE_ONLY
ข้อมูลโค้ดต่อไปนี้สาธิตการเริ่มการสมัครใช้บริการเบื้องหน้า
Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions)
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mMessageListener = new MessageListener() {
@Override
public void onFound(Message message) {
Log.d(TAG, "Found message: " + new String(message.getContent()));
}
@Override
public void onLost(Message message) {
Log.d(TAG, "Lost sight of message: " + new String(message.getContent()));
}
}
}
// Subscribe to receive messages.
private void subscribe() {
Log.i(TAG, "Subscribing.");
SubscribeOptions options = new SubscribeOptions.Builder()
.setStrategy(Strategy.BLE_ONLY)
.build();
Nearby.getMessagesClient(this).subscribe(mMessageListener, options);
}
เมื่อไม่จําเป็นต้องสมัครใช้บริการอีกต่อไป แอปควรยกเลิกการสมัครใช้บริการด้วยการโทร
Nearby.getMessagesClient(Activity).unsubscribe(MessageListener)
ติดตามในเบื้องหลัง
เมื่อแอปสมัครรับข้อมูลจากข้อความบีคอนในเบื้องหลัง การสแกนพลังงานต่ําจะทํางานที่เหตุการณ์บนหน้าจอ แม้ว่าแอปจะไม่ได้ใช้งานอยู่ในปัจจุบัน คุณใช้การแจ้งเตือนการสแกนเหล่านี้เพื่อ "ปลุก" แอปให้ตอบสนองต่อข้อความเฉพาะได้ การสมัครใช้บริการที่ทํางานอยู่เบื้องหลังจะใช้พลังงานน้อยกว่าการสมัครใช้บริการเบื้องหน้า แต่มีเวลาในการตอบสนองสูงกว่าและความเสถียรต่ํากว่า
แอปสามารถเริ่มการสมัครใช้บริการในเบื้องหลังได้ด้วยการโทร
Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions)
และตั้งค่าตัวเลือก Strategy
เป็น BLE_ONLY
ข้อมูลโค้ดต่อไปนี้สาธิตการเริ่มการสมัครใช้บริการในเบื้องหลังโดยเรียก Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions)
// Subscribe to messages in the background.
private void backgroundSubscribe() {
Log.i(TAG, "Subscribing for background updates.");
SubscribeOptions options = new SubscribeOptions.Builder()
.setStrategy(Strategy.BLE_ONLY)
.build();
Nearby.getMessagesClient(this).subscribe(getPendingIntent(), options);
}
private PendingIntent getPendingIntent() {
return PendingIntent.getBroadcast(this, 0, new Intent(this, BeaconMessageReceiver.class),
PendingIntent.FLAG_UPDATE_CURRENT);
}
ข้อมูลโค้ดต่อไปนี้สาธิตการจัดการ Intent ในคลาส BeaconMessageReceiver
@Override
public void onReceive(Context context, Intent intent) {
Nearby.getMessagesClient(context).handleIntent(intent, new MessageListener() {
@Override
public void onFound(Message message) {
Log.i(TAG, "Found message via PendingIntent: " + message);
}
@Override
public void onLost(Message message) {
Log.i(TAG, "Lost message via PendingIntent: " + message);
}
});
}
เมื่อไม่จําเป็นต้องสมัครใช้บริการอีกต่อไป แอปควรยกเลิกการสมัครใช้บริการด้วยการโทร
Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent)
แยกวิเคราะห์ข้อความบีคอน
ไฟล์แนบบีคอนคือกลุ่มข้อมูลที่กําหนดเองซึ่งคุณเพิ่มลงในบีคอนได้ ไฟล์แนบแต่ละรายการประกอบด้วยส่วนต่างๆ ต่อไปนี้
- Namespace: ตัวระบุเนมสเปซ
- ประเภท: ประเภทข้อมูล
- ข้อมูล: ค่าของข้อมูลสําหรับไฟล์แนบ
ข้อมูลโค้ดต่อไปนี้สาธิตโดยใช้ Listener ข้อความเพื่อแยกวิเคราะห์ข้อความที่ได้รับจากบีคอน BLE
mMessageListener = new MessageListener() {
@Override
public void onFound(Message message) {
// Do something with the message here.
Log.i(TAG, "Message found: " + message);
Log.i(TAG, "Message string: " + new String(message.getContent()));
Log.i(TAG, "Message namespaced type: " + message.getNamespace() +
"/" + message.getType());
}
...
};
การแยกวิเคราะห์เนื้อหาจะขึ้นอยู่กับรูปแบบไบต์ ตัวอย่างนี้ถือว่าไบต์ของเนื้อหาเข้ารหัสสตริง UTF-8 แต่ข้อความบีคอนสามารถเข้ารหัสรูปแบบอื่นๆ แบบไบต์ได้ (เช่น บัฟเฟอร์โปรโตคอลแบบอนุกรม) โปรดดูข้อมูลเพิ่มเติมที่หัวข้อเพิ่มไฟล์แนบลงในบีคอน
หากต้องการดูว่าเนมสเปซใดเชื่อมโยงกับโปรเจ็กต์ ให้เรียกใช้ namespaces.list
หมายเหตุ
-
หากต้องการยืดอายุการใช้งานแบตเตอรี่ ให้เรียกใช้
Nearby.getMessagesClient(Activity).unsubscribe()
ในฟังก์ชันonStop()
ของกิจกรรม โปรดทราบว่าการดำเนินการนี้จะมีผลต่อเมื่อมีการสมัครใช้บริการในเบื้องหน้าเท่านั้น -
หากต้องการลดเวลาในการตอบสนอง ให้ใช้ตัวเลือก
Strategy.BLE_ONLY
เมื่อโทรหาNearby.getMessagesClient(Activity).subscribe()
เมื่อตั้งค่าตัวเลือกนี้แล้ว Nearby Messages API จะไม่เรียกใช้การสแกนบลูทูธแบบคลาสสิก ซึ่งจะช่วยปรับปรุงเวลาในการตอบสนองของการตรวจจับบีคอน เนื่องจากระบบไม่ได้หมุนเวียนผ่านการสแกนทุกประเภทที่เป็นไปได้ - หากต้องการแนบเพย์โหลดข้อความกับบีคอน ให้ใช้ Proximity Beacon API