用于Android应用程序的UPnP Seek和seekbar

时间:2012-08-10 11:01:43

标签: android seekbar upnp dlna

我一直在尝试用我的UPnP Android应用程序实现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");
            }
        });
    }

当我拖动到搜索栏上的新位置时,它会触发失败方法。

任何想法???

我使用BubbleUPnP作为渲染器。设备XML如下所示。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
    <major>1</major>
    <minor>0</minor>
</specVersion>
<device>
    <deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
    <UDN>uuid:2797d98f-173f-fe46-0000-00002d731080</UDN>
    <friendlyName>BubbleUPnP (Nexus One)</friendlyName>
    <manufacturer>Bubblesoft</manufacturer>
    <manufacturerURL>http://forum.xda-developers.com/showthread.php?t=1118891
    </manufacturerURL>
    <modelDescription>BubbleUPnP Media Renderer</modelDescription>
    <modelName>BubbleUPnP Media Renderer</modelName>
    <modelNumber>1.4.3.1</modelNumber>
    <modelURL />
    <iconList>
        <icon>
            <mimetype>image/png</mimetype>
            <width>72</width>
            <height>72</height>
            <depth>32</depth>
            <url>/dev/2797d98f-173f-fe46-0000-00002d731080/icon.png</url>
        </icon>
    </iconList>
    <serviceList>
        <service>
            <serviceType>urn:schemas-upnp-org:service:AVTransport:1
            </serviceType>
            <serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>
            <controlURL>/dev/2797d98f-173f-fe46-0000-00002d731080/svc/upnp-org/AVTransport/action
            </controlURL>
            <eventSubURL>/dev/2797d98f-173f-fe46-0000-00002d731080/svc/upnp-org/AVTransport/event
            </eventSubURL>
            <SCPDURL>/dev/2797d98f-173f-fe46-0000-00002d731080/svc/upnp-org/AVTransport/desc.xml
            </SCPDURL>
        </service>
        <service>
            <serviceType>urn:schemas-upnp-org:service:RenderingControl:1
            </serviceType>
            <serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>
            <controlURL>/dev/2797d98f-173f-fe46-0000-00002d731080/svc/upnp-org/RenderingControl/action
            </controlURL>
            <eventSubURL>/dev/2797d98f-173f-fe46-0000-00002d731080/svc/upnp-org/RenderingControl/event
            </eventSubURL>
            <SCPDURL>/dev/2797d98f-173f-fe46-0000-00002d731080/svc/upnp-org/RenderingControl/desc.xml
            </SCPDURL>
        </service>
        <service>
            <serviceType>urn:schemas-upnp-org:service:ConnectionManager:1
            </serviceType>
            <serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
            <controlURL>/dev/2797d98f-173f-fe46-0000-00002d731080/svc/upnp-org/ConnectionManager/action
            </controlURL>
            <eventSubURL>/dev/2797d98f-173f-fe46-0000-00002d731080/svc/upnp-org/ConnectionManager/event
            </eventSubURL>
            <SCPDURL>/dev/2797d98f-173f-fe46-0000-00002d731080/svc/upnp-org/ConnectionManager/desc.xml
            </SCPDURL>
        </service>
    </serviceList>
</device>

1 个答案:

答案 0 :(得分:0)

我知道答案已经很长时间了,但我通过与DLNA和UPNP合作来解决这个问题。我决定回答这个问题,以便它对其他 STACKERS (:P)有用。如果您可以使用DLNA,here是您可以用来满足您的要求的代码。它还支持UPNP。

使用搜索栏显示当前正在运行的媒体的进度。希望你能找到你的要求。

基本上,您需要使用upnp服务的getPositionInfo()回调。您可以在每个特定的持续时间内请求此回调,例如500毫升。这是回调:

   try {
        Service localService = this.executeDeviceItem.getDevice()
                .findService(new UDAServiceType("AVTransport"));
        if (localService != null) {
            this.upnpService.getControlPoint().execute(
                    new GetPositionInfoCallback(localService, mHandle,
                            this.activity));
        } else {
        }
    } catch (Exception localException) {
        localException.printStackTrace();
    }

您可以根据回调返回的数据更新搜索栏。像这样:

Bundle localBundle = paramIntent.getExtras();
String str1 = localBundle.getString("TrackDuration");
String str2 = localBundle.getString("RelTime");
int i = com.techd.tvapp.util.Utils.getRealTime(str1);
int j = Utils.getRealTime(str2);
mSeekBar.setMax(i);
mSeekBar.setProgress(j);
mTotalTime.setText(str1);
mCurrentTime.setText(str2);

要使用搜索栏更新播放器,请将seekbarchange侦听器设置为:

class PlaySeekBarListener implements SeekBar.OnSeekBarChangeListener {
        PlaySeekBarListener() {
        }

        public void onProgressChanged(SeekBar paramSeekBar, int paramInt,
                                      boolean paramBoolean) {
        }

        public void onStartTrackingTouch(SeekBar paramSeekBar) {
            // isUpdatePlaySeek = false;
        }

        public void onStopTrackingTouch(SeekBar paramSeekBar) {
            if (null != dmcControl) {
                String str = com.techd.tvapp.util.Utils.secToTime(paramSeekBar.getProgress());
                Log.i("DMC", "SeekBar time:" + str);
                dmcControl.seekBarPosition(str);
            }
        }
    }

mSeekBar = (SeekBar) findViewById(R.id.media_seekBar);
mSeekBar.setOnSeekBarChangeListener(new PlaySeekBarListener());

就是这样!