我相信这不是这些天最流行的话题,所以我会发布我想出的答案作为答案,尽管我怀疑有人会需要它,但并不完美,这是我使用可用文档实现目标的最接近的方式。
我还应该提到这张幻灯片也帮助我保持在正轨上。
在我的解决方案中,齿轮小部件(consumer/.wgt)和主机端应用程序(provider/.apk)之间必须始终存在活动的 2 路连接,就像三星(Hello Accessory)提供的示例应用程序一样,至少在我想检查配对条件的时候。该文档将其称为:
Hello Gear 是一个简单的应用程序,包括:
- 主机端应用程序(提供者):HelloAccessoryProvider.apk
- 可穿戴应用程序(消费者):HelloAccessoryConsumer.wgt(Web 应用程序)
看到双方都有一些 xml 配置,Android 需要特定的权限,在Hello Gear文档中有详细说明。
这 2 路通信由三星附件框架在网络层(通过三星附件协议,SAP)提供,因为双方都实现了相同的附件服务配置文件,同样,通过两端的 xml 文件配置(服务名称,通道 ID ETC。)。
Android端将协议实现为服务,扩展了SAAgent抽象类。然后,齿轮端应用程序(.wgt)上的小部件可以调用 SAAgent 回调,并通过在 xml 配置文件中的预定义通道上两端声明的SASocket对象处理提供者/消费者通信。
请注意,必须在两端初始化此通信,在我的情况下,我必须在 Gear 上打开一次小部件应用程序(我相信应该有一种方法可以通过意图或通知以某种方式启动齿轮小部件,但我可以not find yet) 在 Android 应用程序启动后,此处已启动意味着 SAAgent 服务已启动并绑定到一个 Activity,有资格接收回调并通过广播将状态消息发送到应用程序的其余部分。比如活动连接的数量,或者 Gear socket 和 Android 应用程序之间的任何数据传输都可以通过这种方式完成。
请注意,如果您不必在齿轮小部件和 Android 应用程序之间传输数据,您可能会接受通知。从 Android 应用程序向 Gear 发送通知的唯一要求似乎是 Gear 与您的手机配对并通过蓝牙连接。然后,您可以发送一个意图,如第 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 是否已配对,我尝试使用Android 的 BluetoothAdapter 的getBondedDevices()方法列出配对的蓝牙设备,但它显示即使您的 Gear 已关闭,您的 Gear 也已配对,这不足以满足我的需求,而且我觉得它不合逻辑。这是真的,但一旦你的设备重新打开。
我对上述解决方案感到满意,因为它足以满足我的需求,因此我会接受我自己的答案。