UPNP/DLNA控制点

Dar*_*ing 2 java android upnp dlna

我正在开发一个Android UPnP/DLNA应用程序.我有一个控制点工作,我可以将文件从媒体服务器流式传输到渲染器.我可以在播放期间暂停/播放和停止文件,但我似乎无法弄清楚如何将搜索栏集成到控制点以显示播放文件的进度并能够与搜索栏进行交互.我正在使用Cling Java库来创建应用程序.如果有人有任何可以帮助我的例子,我会非常感激.

谢谢

我试图实现SubscriptionCallback示例并订阅LastChange

SubscriptionCallback callback = new SubscriptionCallback(service, 600) { // Timeout in seconds

                 public void established(GENASubscription sub) {
                     System.out.println("Established: " + sub.getSubscriptionId());


                 }
                 @Override
                 public void failed(GENASubscription sub, UpnpResponse response, Exception ex) {
                     System.err.println(
                         createDefaultFailureMessage(response, ex)
                     );
                 }
                 @Override
                 public void ended(GENASubscription sub, CancelReason reason, UpnpResponse response) {
                     // Reason should be null, or it didn't end regularly
                 }

                 public void eventReceived(GENASubscription sub) {
                     System.out.println("Event: " + sub.getCurrentSequence().getValue());


                               try {
                                   lastChange = new LastChange(
                                           new AVTransportLastChangeParser(),
                                           sub.getCurrentValues().get("LastChange").toString()
                                   );


                               } catch (Exception ex) {
                                   log.warning("Error parsing LastChange event content: " + ex);
                                   return;
                               }

                     Map<String, StateVariableValue> values = sub.getCurrentValues();
                     StateVariableValue status = values.get("Status");
                     System.out.println("Status is: " + status.toString());
                 }

                 public void eventsMissed(GENASubscription sub, int numberOfMissedEvents) {
                     System.out.println("Missed events: " + numberOfMissedEvents);
                 }
                @Override
                protected void failed(GENASubscription arg0,
                        UpnpResponse arg1, Exception arg2, String arg3) {

                }
            };

            upnpService.getControlPoint().execute(callback);
Run Code Online (Sandbox Code Playgroud)

然后我尝试获取当前播放曲目的持续时间:

System.out.println("Duration: "+lastChange.getEventedValue(0, AVTransportVariable.CurrentTrackDuration.class).getValue());
Run Code Online (Sandbox Code Playgroud)

但是这会返回NullPointerException.

有任何想法吗???????

************更新***********

我一直试图实现Seek()但没有成功.

我有我的搜索栏和监听器,但是当我将搜索栏拖到新位置时它仍然失败.

seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() 
{
        @Override
        public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) 
        {
            Log.i("SEEKTIME", "time:" + arg1);
            upnpService.getControlPoint().execute(new Seek(service, SeekMode.REL_TIME, arg0.toString())
            {
                @Override
                public void success(ActionInvocation invocation)
                {
                    //super.success(invocation);
                    Log.i("SEEKSUCCESS", "success seek");
                }
                @Override
                public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2)
                {
                    Log.i("SEEKFAIL", "fail seek");
                }
            });
        }
Run Code Online (Sandbox Code Playgroud)

任何建议为什么会失败

Pav*_*nek 6

您必须轮询渲染器以获取此类信息(请参阅AVTransport规范第2.3.1章).该规范鼓励每秒进行一次轮询,但你可以很容易地堵塞一个真正的硬件渲染器(对于这种渲染器来说,DLNA仍然是一个时髦的痛苦,而不是设计的重要部分).我们的惯例是GetPositionInfo()每2-3秒发送一次请求,并将返回RelativeTimePosition值仅视为对本地运行的计时器的调整.对于搜索条大小调整,您还需要当前媒体的总长度.理想情况下,渲染器会在您订阅时自动告诉您AVTransport.LastChange.我不知道具体的Cling,但快速看一下有希望的例子controlpoint.SubscriptionCallback.不幸的是,对于真实的设备,LastChange通常不会告诉你任何东西.这些值根本不存在或具有恒定的惰性值.因此,您需要GetMediaInfo()再次轮询并使用MediaDuration值.

至于互动,Seek()是你的朋友,理想情况下参数Unit = REL_TIMETarget=你想要的时间偏移.请注意,真实世界的渲染器可能不支持此单元(模式)的搜索.也许它只支持TRACK_NR,在这种情况下,搜索栏对您来说是必读的.Cling应该能够告诉您A_ARG_TYPE_SeekMode特定渲染器的允许值.