三星远程开发测试平台

反馈 注册 登录

三星S Pen Remote SDK

三星S Pen悬空操作适配指导中我们介绍了S Pen悬空操作的Air Actions空中动作适配方法,通过S Pen Framework可以轻松识别向上,向下,向左,向右,顺时针和逆时针响应方向动作。如果应用需要获得S Pen运动的原始数据 ,设计自定义的手势轨迹,或者利用相对位置实现更多的功能,就需要使用S Pen Remote SDK。本文将介绍S Pen Remote SDK使用方法。S Pen Remote SDK可以帮助应用获取到S Pen按键和运动轨迹变化的事件,应用可利用这些信息实现自己独有的或者更强大的功能。

 

image.png

1. S Pen Remote SDK概述

1.1 支持的平台

目前仅三星 Galaxy Note系列支持S Pen Remote SDK。S Pen Remote SDK依赖于内部Android framework的静态Java库,所以此程序仅在支持这些模块的设备上运行。

 

1.2 支持的功能

S Pen Remote SDK为应用提供了识别运动坐标和识别点击按钮的功能。

·         检查是否按下或释放了侧面按钮。

·         识别运动坐标

- 设备二维运动

- 当前位置与之前位置的相对值

- x坐标的正值表示向右移动

- y坐标的正值表示向上移动

- 值范围:-1.0~1.0

image.png

1.3 组件

·         组件

- spenremote-v1.0.0.jar

- sdk-v1.0.0.jar

 

·         导入package:

- com.samsung.android.sdk.penremote

1.4 Android Studio中如何安装Remote SDK

·         将spenremote-v1.0.0.jar和sdk-v1.0.0.jar文件添加到Android Studio中的libs文件夹中。

image.png

·         在build.gradle中添加SDK库文件夹依赖项

dependencies{

    compile fileTree(include: '*.jar', dir: 'libs')

    …

}

2. SpenRemote使用方法

SpenRemote是一个类,提供以下方法:

·         getInstance()获取SpenRemote的对象。

·         getVersionCode()获取S Pen Remote版本号,为整数。

·         getVersionName()获取S Pen Remote版本名称,为字符串。

·         isFeatureEnabled(int type)检查设备是否有S Pen Remote功能。

·         connect()用于连接S Pen Framework。需要连接到S Pen Framework才能使用S Pen Remote Features。

·         disconnect()用于断开S Pen Framework的连接。

 

2.1 检查SpenRemote功能的可用性

可以使用isFeatureEnabled()方法检查设备是否支持SpenRemote功能。功能类型在SpenRemote类中定义。调用isFeatureEnabled()方法时,功能类型作为参数传递。该方法返回一个布尔值来表示是否支持该功能。

public boolean isFeatureEnabled(int type)

 

以下类型在SpenRemote类中定义为常量:

·         FEATURE_TYPE_BUTTON

·         FEATURE_TYPE_AIR_MOTION

 

2.2 连接到S Pen Framework

需要连接到S Pen Framework来使用SpenRemote中支持的功能。要连接到S Pen Framework,需要创建ConnectResultCallback并调用connect()方法。如果已建立连接,则connect()方法将不响应。因此,在尝试连接之前,使用isConnected()方法检查连接状态。

 

SpenUnitManager mSpenUnitManager = null;

...

SpenRemote spenRemote = SpenRemote.getInstance();

if (!spenRemote.isConnected()) {

    spenRemote.connect(getContext(),

        new SpenRemote.ConnectionResultCallback() {

        @Override

        public void onSuccess(SpenUnitManager manager) {

            mSpenUnitManager = manager;

            ...

        }

               

        @Override

        public void onFailure(int error) {

               

        }

    });

}

如果连接成功,则调用ConnectResultCallback.onSucces(),并传递SpenUnitManager实例。SpenUnitManager提供了设置事件监听器的方法,来监视S Pen中嵌入式单元的事件。

 

如果连接失败,则会将错误代码传递给ConnectResultCallback.onFailure()。

 

传递的错误代码如下:

·         UNSUPPORTED_DEVICE设备不是Samsung设备或不支持S Pen Remote。

·         CONNECTION_FAILED S Pen Framework拒绝连接。

·         UNKOWN未知错误。

 

2.3 断开连接

如果您的应用程序已停止或无法再处理S Pen事件,请调用disconnect()来终止已建立的连接。

 

3. 使用SpenUnitManager

SpenUnitManager提供了设置事件监听器的方法来监听S Pen中嵌入单元的事件。

 

3.1 相关的类和接口

·         SpenUnit

此类管理特定S Pen嵌入式单元的实例。

·         SpenEvent

 S Pen Framework将发送该类到您的应用程序,来传递S Pen事件信息。

·         SpenEventListener

您可以使用此接口创建一个Callback方法

 

3.2 监控S Pen事件

要监听S Pen事件,需要执行以下步骤:

1)        获取SpenUnitManager的实例

如前所述,当成功连接到S Pen Framework时,可以获得SpenUnitManager实例。

 

2)        请求要监视的嵌入式单元(SpenUnit)的实例

使用getUnit方法获取特定嵌入式单元的实例。

getUnit方法接受常量,TYPE_BUTTONTYPE_AIR_MOTION。如果尝试在设备中获取不受支持的单元实例,则返回null

 

// get Instance of Button Unit

SpenUnit button = mSpenUnitManager.getUnit(SpenUnit.TYPE_BUTTON);

       

// get Instance of AirMotion Unit

SpenUnit airMotion = mSpenUnitManager.getUnit(SpenUnit.TYPE_AIR_MOTION);

 

3)        注册事件监听器

使用SPenUnitManager实例的registerSpenEventListener方法注册SpenUnit的事件监听器。

传递给SpenEventListener的SpenEvent数据是隐藏的,您可以将其转换为ButtonEvent或AirMotionEvent类来进行处理。

 

·         按钮事件:

SpenUnit button = mSpenUnitManager.getUnit(SpenUnit.TYPE_BUTTON);

mSpenUnitManager.registerSpenEventListener(mButtonEventListener, button);

...

//EventListener for Button Unit

private SpenEventListener mButtonEventListener = new SpenEventListener() {

    @Override

    public void onEventChanged(SpenEvent ev) {

        ButtonEvent buttonEvent = new ButtonEvent(ev)

       

        switch (buttonEvent.getAction()) {

            case ButtonEvent.ACTION_DOWN:

                Log.d(TAG, "Spen Button Pressed");

                break;

            case ButtonEvent.ACTION_UP:

                Log.d(TAG, "Spen Button Released");

                break;

        }

    }

};

 

·         AirMotion事件:

SpenUnit airMotion = mSpenUnitManager.getUnit(SpenUnit.TYPE_AIR_MOTION);

mSpenUnitManager.registerSpenEventListener(mAirMotionEventListener, airMotion);

...

//EventListener for AirMotion Unit

private SpenEventListener mAirMotionEventListener = new SpenEventListener() {

    @Override

    public void onEventChanged(SpenEvent ev) {

        AirMotionEvent airMotionEvent = new AirMotionEvent(ev)

                   

        float deltaX = airMotion.getDeltaX();

        float deltaY = airMotion.getDeltaY();

           

        Log.d(TAG, "Air Motion = " + deltaX + ", " + deltaY);

    }

};

           

4)        取消注册事件监听器

如果您的应用程序已终止或不再处理S Pen事件,请使用SPenUnitManager实例的unregisterSpenEventListener方法取消事件监听器。特别是,AirMotion消耗大量的S Pen电池电量,因此在不处理Air Motion事件时应取消事件监听器。

 

SpenUnit airMotion = mSpenUnitManager.getUnit(SpenUnit.TYPE_AIR_MOTION);

mSpenUnitManager.unregisterSpenEventListener(airMotion);

 

4. 联系我们

如果您对S Pen Remote SDK有任何问题,可以发邮件到下面的邮箱与我们联系。

邮箱地址:rdtpservice@samsung.com

邮件主题:三星S Pen+APP名