Как проверить, что Samsung Gear 2 программно связан с устройством Android?
Я использую Tizen SDK для Wearable с сайта Samsung, чтобы связать приложение Android-провайдера с устройством Samsung Gear 2. Я могу отправлять уведомления на устройство, и как только я запускаю приложение для потребителей на устройстве 2, я могу также передавать данные между часами и моим телефоном на Android.
Я пытаюсь проверить в приложении Android, соединен ли телефон с Gear 2. Что-то простое: создать объект связи с помощью вспомогательной службы и вызвать метод, подобный isPaired()?:
CommunicationObject commObject = new CommunicationObject(Communication parameters);
// I am assuming some connection call like commObject.connect() should be invoked first
// where I can check for it's result afterwards such as
if(commObject.isPaired())
{
// do something
}
Я думаю, что примеры SDK, такие как приложение потребитель / поставщик, которое они предоставляют на своем сайте, уже предполагают, что устройство сопряжено, следовательно, они показывают, как передавать данные между телефоном и механизмом наблюдения. Тем не менее, я ищу что-то такое же простое, как и запрос телефона, если он соединен с устройством передачи, что должно быть обязательным условием для передачи данных, что выполняется автоматически с помощью Samsung Gear Manager, я считаю, прямо сейчас.
Примечание. Для примера приложений поставщика / потребителя можно просто проверить, доступно ли какое-либо соединение, используя код в них. Но соединение для передачи данных включается только тогда, когда я вручную запускаю потребительское приложение с устройства передачи, в противном случае оно действует так, что устройство передачи не сопряжено, хотя оно и есть.
1 ответ
Я считаю, что это не самая популярная тема в наши дни, поэтому я опубликую то, что я придумала в качестве ответа, хотя я сомневаюсь, что кому-то это понадобится, не будучи идеальным, это самый близкий способ, которым я могу достичь своей цели, используя доступную документацию.
Я должен также упомянуть, что этот слайд помог мне остаться на верном пути.
В моем решении должно быть активное двустороннее соединение между виджетом шестеренки (consumer/.wgt) и приложением на стороне хоста (provider/.apk), как в примере приложения, предоставляемого Samsung(Hello Accessory), всегда, по крайней мере, в то время, когда я хотел проверить состояние сопряжения. Документация ссылается на это как:
Hello Gear - это простое приложение, которое состоит из:
- Приложение на стороне хоста (провайдер): HelloAccessoryProvider.apk
- Приложение для носимой стороны (потребитель): HelloAccessoryConsumer.wgt (веб-приложение)
Обратите внимание, что обе стороны имеют некоторую конфигурацию xml, а Android требует определенных разрешений, которые подробно описаны в документации Hello Gear.
Эта двусторонняя связь обеспечивается Samsung Accessory Framework на сетевом уровне (через Samsung Accessory Protocol, SAP), учитывая, что обе стороны реализуют один и тот же профиль службы аксессуаров, снова настроенный с помощью файлов xml на обоих концах (имя службы, идентификатор канала так далее.).
Android-сторона реализует протокол как сервис, расширяя абстрактный класс SAAgent. Затем виджет приложения на стороне шестеренки (.wgt) может вызывать обратные вызовы SAAgent, и связь между поставщиком и потребителем обрабатывается через объекты SASocket, заявленные на обоих концах, по заранее определенному каналу в файлах конфигурации xml.
Обратите внимание, что это сообщение должно быть инициализировано с обоих концов, в моем случае мне пришлось один раз открыть приложение для виджетов на Gear (я считаю, что должен быть способ запустить виджет Gear с помощью намерения или уведомления, так или иначе, но я мог бы пока не найдено) после запуска приложения Android здесь запущено означает, что служба SAAgent включена и привязана к Activity, имея право принимать обратные вызовы и отправлять сообщения о состоянии остальной части приложения через широковещательные рассылки. Например, количество активных соединений или любая передача данных между гнездом шестерни и приложением Android может быть выполнена таким образом.
Обратите внимание, что если вам не нужно передавать данные между виджетом шестеренки и приложением Android, вы можете просто согласиться с уведомлениями. Единственное требование для отправки уведомлений в Gear из приложений Android, по-видимому, заключается в том, что Gear связан с вашим телефоном и подключен через Bluetooth. Затем вы можете просто отправить намерение, как описано более подробно здесь, в разделе 6. Все, что вам нужно, это разрешение:
com.samsung.wmanager.ENABLE_NOTIFICATION
и некоторые определения метаданных в файле ApplicationManifest.xml, описанные в том же разделе.
<meta-data
android:name="master_app_packagename"
android:value="com.example.gearMasterApp"/>
<meta-data
android:name="app_notification_maxbyte"
android:value="300 "/>
Вот пример кода для намерения, чтобы отправлять уведомления в Gear:
public static final String ALERT_NOTIFICATION =
“com.samsung.accessory.intent.action.ALERT_NOTIFICATION_ITEM”;
public static final int NOTIFICATION_SOURCE_API_SECOND = 3;
Bitmap bitmapImg;
// Put data to Intent
Intent myIntent = new Intent(ALERT_NOTIFICATION);
myIntent.putExtra("NOTIFICATION_PACKAGE_NAME", “com.example.gearApp”);
myIntent.putExtra("NOTIFICATION_VERSION", NOTIFICATION_SOURCE_API_SECOND);
myIntent.putExtra("NOTIFICATION_TIME", System.currentTimeMillis(););
myIntent.putExtra("NOTIFICATION_MAIN_TEXT", “Title Text”);
myIntent.putExtra("NOTIFICATION_TEXT_MESSAGE", ”Body text);
byte [] byteArray = convertResizeBitmapToByte(bitmapImg);
myIntent.putExtra("NOTIFICATION_APP_ICON", byteArray);
myIntent.putExtra("NOTIFICATION_LAUNCH_INTENT", “com.example.gearMasterApp”);
myIntent.putExtra("NOTIFICATION_LAUNCH_TOACC_INTENT", “com.example.gearSideApp”);
sendBroadcast(myIntent);
public byte[] convertResizeBitmapToByte(Bitmap bitmap){
Bitmap scBitmap = Bitmap.createScaledBitmap(bitmap, 75, 75, false);
ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
scBitmap.compress(Bitmap.CompressFormat.PNG, 50, byteArrayStream);
return byteArrayStream.toByteArray();
}
После прочтения уведомления на стороне шестерни вы можете получить намеренное действие вместе с некоторыми необязательными параметрами:
Намеренное действие: "com.samsung.accessory.intent.action.UPDATE_NOTIFICATION_ITEM"
Это может быть другой подход для проверки активного соединения с Gear и вашим телефоном, но нет гарантии, что уведомление будет прочитано, и в моем случае требовалось оставить связь Gear необязательной, чтобы приложение Android продолжало выполнять свои задачи, даже если нет активной связи с Gear.
Что касается исходного вопроса, в котором я попросил указать способ сопряжения Gear, я попытался перечислить сопряженные устройства Bluetooth с помощью метода getBondedDevices() в BluetoothAdapter Android, но он показывает, что устройство Gear сопряжено, даже если устройство Gear выключено. Это было недостаточно для моих нужд, и я не нашел это логичным. Это правда, хотя, как только ваше устройство снова включено.
Я доволен приведенным выше решением, так как его было достаточно для моих нужд, поэтому я приму свой ответ.