Android_SmartDeviceLink_Mobile Navigation

我的博客

Mobile Navigation手机导航和视频流

移动导航允许地图合作伙伴将他们的应用程序带到汽车中,并显示他们的地图,然后方便地转向用户。这个特性在head单元上的行为与普通应用程序不同。主要的差异是
导航应用程序不使用基本的屏幕模板。他们的主要视图是来自设备的视频流。
导航应用程序可以通过二进制流发送音频。这将减弱当前音频源,并且应该用于导航命令。
导航应用程序可以接收来自视频流的触摸事件。
注意:为了使用SDL的移动导航功能,应用程序必须具备Android 4.4 (SDK 19)的最低要求。这是由于使用了Android提供的视频编码器。
和俪安的车机版本号是4.2.2(SDK 17),低于要求的19.

Connecting an app

导航应用程序的第一个不同之处在于,必须在SdlProxyALM的创建中设置导航应用程序的appHMIType。导航应用也是非媒体应用。第二个区别是需要在SdlProxyBuilder中设置的名为securitymanager的属性。如果连接到需要安全视频的核心版本。此属性需要一系列安全管理器类,它们将继承自SdlSecurityBase类。这些安全库由OEMs自己提供,只适用于OEM。这里没有一个通用的安全库。

SdlProxyBuilder.Builder builder = new SdlProxyBuilder.Builder(this,APP_ID, APP_NAME, false, getApplicationContext());
 
Vector<AppHMIType> hmiTypes = new Vector<AppHMIType>();
hmiTypes.add(AppHMIType.NAVIGATION);
builder.setVrAppHMITypes(hmiTypes);
 
List<? extends SdlSecurityBase> securityManagers = new ArrayList();
securityManagers.add(OEMSecurityManager1.class);
securityManagers.add(OEMSecurityManager1.class);
builder.setSdlSecurity(securityManagers);
 
proxy = builder.build();

注意:在编译时,您必须确保包含您希望支持的所有可能的OEM安全管理器。
注册后,应用程序将开始接收回调。一个重要的回调是onOnHMIStatus,它通知应用程序在head单元上当前可见的应用程序。在注册后,hmiLevel将为NONE或BACKGROUND。一旦hmiLevel被head单元设置为FULL,就应该开始流通。

视频输出流

为了从SDL应用程序获取流视频,我们只需要管理一些事情。但是在大多数情况下,库将处理执行视频流的大部分逻辑。

SDLProxyALM

重要的是,我们要创建SDLProxyALM实例,并使用正确的设置来流视频。这已经涵盖了移动导航>的介绍。

SDL Remote Display

SdlRemoteDisplay基类提供了使用SDL开始流的最简单方法。SdlRemoteDisplay由Android的presentation类扩展,并与SDL Android库的其他方面进行了修改。

注意:建议您将其扩展为在服务中使用SDLProxyALM实例的本地类。

扩展这个类给开发人员提供了一个熟悉的、本地的经验来处理屏幕上的布局和事件。

public static class MyDisplay extends SdlRemoteDisplay{
    public MyDisplay(Context context, Display display) {
        super(context, display);
    }
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.sdl);
 
        final Button button1 = (Button) findViewById(R.id.button_1);
 
        button1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d(TAG, "Received motion event for button1");
            }
        });
    }
}

Managing the Stream

要启动流的惟一方法是将SDLProxyALM实例与SdlRemoteDisplay的扩展结合起来。当应用程序在onOnHMIStatus(OnHMIStatus通知)回调中收到它的第一个HMI_FULL状态时,就会发生这种情况。需要调用的方法是startRemoteDisplayStream

@Override
public void onOnHMIStatus(OnHMIStatus notification) {
    if(notification.getHmiLevel().equals(HMILevel.HMI_FULL)){
        if (notification.getFirstRun()) {
            proxy.startRemoteDisplayStream(getApplicationContext(), MyDisplay.class, null, false);
        }
    }
 
}

Ending the Stream

当HMIStatus返回到HM_NONE时,是时候停止流了。这是通过SDLProxyALM中的方法stopRemoteDisplayStream()实现的。

    原文作者:勇敢写信
    原文地址: https://www.jianshu.com/p/8ced0635cc48
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞