3

我正在使用来自samsung-gear网站的 Tizen SDK for Wearable,以便与 Samsung Gear 2 设备通信提供者 android 应用程序。我能够向 gear 发送通知,一旦我在 gear 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 示例(例如他们在其网站上提供的消费者/提供者应用程序)已经假定设备已配对,因此它们展示了如何在手机和齿轮手表之间传输数据。然而,我正在寻找一些简单的东西,比如询问手机是否与齿轮设备配对,这应该是传输数据的先决条件,我相信这是由三星齿轮管理器自动完成的。

注意:对于示例提供者/消费者应用程序,可以使用其中的代码检查是否有任何连接可用。但是只有当我从齿轮设备手动启动消费者应用程序时才启用数据传输连接,否则它就像齿轮设备没有配对,即使它是。

4

1 回答 1

4

我相信这不是这些天最流行的话题,所以我会发布我想出的答案作为答案,尽管我怀疑有人会需要它,但并不完美,这是我使用可用文档实现目标的最接近的方式。

我还应该提到这张幻灯片也帮助我保持在正轨上。

在我的解决方案中,齿轮小部件(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对象处理提供者/消费者通信。

SAAgent 工作流程

请注意,必须在两端初始化此通信,在我的情况下,我必须在 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 也已配对,这不足以满足我的需求,而且我觉得它不合逻辑。这是真的,但一旦你的设备重新打开。

我对上述解决方案感到满意,因为它足以满足我的需求,因此我会接受我自己的答案。

于 2014-11-04T00:58:16.600 回答