美文网首页Android开发Android进阶之路
Android_SmartDeviceLink_Mobile N

Android_SmartDeviceLink_Mobile N

作者: 勇敢写信 | 来源:发表于2018-03-23 16:20 被阅读0次

    我的博客

    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()实现的。

    相关文章

      网友评论

        本文标题:Android_SmartDeviceLink_Mobile N

        本文链接:https://www.haomeiwen.com/subject/qryxcftx.html