【问题标题】:Getting URL of the media to play from media server with Cling使用 Cling 从媒体服务器获取要播放的媒体 URL
【发布时间】:2012-10-24 17:48:11
【问题描述】:

我正在研究 android 上 Cling upnp 堆栈的示例 upnpBrowser,我浏览了 merdia 服务器的内容,我可以显示每个文件夹中的媒体列表,现在我想提取要播放的视频的 URL它在播放器上,但我被阻止如何提取该 URL !!!

UDN serverUdn = ((UpnpControlApplication)getApplicationContext()).server_udn;
//Device server = ((UpnpControlApplication)getApplicationContext()).server;
Device server = upnpService.getRegistry().getDevice(serverUdn, true);
listAdapter.clear();
if(server == null)
{
    Toast.makeText(this, "pbm", Toast.LENGTH_LONG).show();
}
else
{
    if(server.findService(new UDAServiceType("ContentDirectory")) == null)
        Toast.makeText(this, "pbm", Toast.LENGTH_LONG).show();
    upnpService.getControlPoint().execute(new Browse(server.findService(new UDAServiceType("ContentDirectory")),id, BrowseFlag.DIRECT_CHILDREN)
    {
        @Override
        public void received(ActionInvocation actionInvocation, DIDLContent didl) {
            final List<Item> items = didl.getItems();
            String st=didl.getItems().get(0).getFirstResource().getValue();

【问题讨论】:

  • 我想你的String st 没有给你网址。您作为Browse() 操作的参数提供的id 是什么?该容器 ID 中是否真的有媒体 URL?每个容器都不需要直接容纳媒体!
  • 是的,它没有给出任何东西,但奇怪的是,如果我删除这一行: String st=didl.getItems().get(0).getFirstResource().getValue();代码执行并显示文件和媒体服务器,当我放置它时,什么也不显示!
  • 在删除String st 行时显示“执行并显示文件”的代码。确保提供给 Browse() 的对象 ID id 确实包含媒体项。
  • 这是浏览服务器类,它显示媒体服务器中的文件夹和文件

标签: android upnp


【解决方案1】:
public void browseServer(final String id)
{

    if(((UpnpControlApplication)getApplicationContext()).server_udn == null)
    {
        new AlertDialog.Builder(this)
        .setTitle("Bad")
        .setMessage("pas de serveur sélectionné, allez à la section LAN et cliquez sur Parcourir pour sélectionner le serveur!")
        .setPositiveButton("OK", new OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                // Some stuff to do when ok got clicked
            }
        })
        .setNegativeButton("Annuler", new OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                // Some stuff to do when cancel got clicked
            }
        })
        .show();
    }
    else
    {
        UDN serverUdn = ((UpnpControlApplication)getApplicationContext()).server_udn;
        //Device server = ((UpnpControlApplication)getApplicationContext()).server;
        Device server = upnpService.getRegistry().getDevice(serverUdn, true);
        listAdapter.clear();
        if(server == null)
        {
            Toast.makeText(this, "désolé", Toast.LENGTH_LONG).show();
        }
        else
        {
            if(server.findService(new UDAServiceType("ContentDirectory")) == null)
                Toast.makeText(this, "pbm", Toast.LENGTH_LONG).show();
            upnpService.getControlPoint().execute(new Browse(server.findService(new UDAServiceType("ContentDirectory")),id, BrowseFlag.DIRECT_CHILDREN)
            {

                @Override
                public void received(ActionInvocation actionInvocation, DIDLContent didl) {

                    final List<Item> items = didl.getItems();

                    //String st = items.getImportUri();
                    //String st=didl.getItems().get(0).getFirstResource().getValue(); 
                    //Log.d("URL IS",st); 
                    //Item item = didl.getItems().get(0);
                    //Item item = didl.getItems().get(0); 
                    //String url = item.getFirstResource().getValue();

                     //System.out.println(" this is the url of item" +item.getTitle()); 
                    // System.out.println(" this is the url of the media");

                     //System.out.println(url);

                    /*final DIDLContent b = didl;
                    String str1 = "bieda";
                    try
                    {
                        str1 = parser.generate(b);
                    }
                    catch(Exception e)
                    {
                        str1 = "smuta";
                    }
                    final String str=str1;
                    runOnUiThread(new Runnable()
                    {
                        public void run()
                        {

                            adb.setTitle("XML").setMessage(str).setPositiveButton("OK", new OnClickListener() {
                                public void onClick(DialogInterface arg0, int arg1) {
                                    // Some stuff to do when ok got clicked
                                }
                            }).show();

                        }
                    });*/

                    runOnUiThread(new Runnable(){
                        public void run()
                        {
                            listAdapter.insert(new ServerContentContainer(s.peek()), 0);
                        }
                    });

                    final List<Container> containers = didl.getContainers();

                    for(final Container c: containers)
                    {

                        runOnUiThread(new Runnable(){
                            public void run()
                            {
                                int pos = listAdapter.getPosition(new ServerContentContainer(c));
                                if(pos >= 0)
                                {
                                    listAdapter.remove(new ServerContentContainer(c));
                                    listAdapter.insert(new ServerContentContainer(c), pos);
                                    System.out.println("eulooooooooo");
                                }
                                else
                                    listAdapter.add(new ServerContentContainer(c));
                            }
                        });
                    }
                    for(final Item i: items)
                    {
                        runOnUiThread(new Runnable(){
                            public void run()
                            {
                                int pos = listAdapter.getPosition(new ServerContentItem(i));
                                if(pos >= 0)
                                {
                                    listAdapter.remove(new ServerContentItem(i));
                                    listAdapter.insert(new ServerContentItem(i), pos);
                                }
                                else
                                    listAdapter.add(new ServerContentItem(i));
                            }
                        });

                    }

                }

                @Override
                public void updateStatus(Status arg0) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void failure(ActionInvocation arg0, UpnpResponse arg1,
                        String arg2) {
                    // TODO Auto-generated method stub

                }

            });
        }
    }
}

这是 ServerContentItem 类:

protected class ServerContentItem extends ServerContent
    {
        private Item i;

        public Item getItem()
        {
            return i;
        }

        ServerContentItem(Item i)
        {
            this.i = i;
        }

        public void select()
        {
            if(((UpnpControlApplication)getApplicationContext()).renderer_udn != null)
            {
                Device renderer = upnpService.getRegistry().getDevice(((UpnpControlApplication)getApplicationContext()).renderer_udn, false);
                final Service service = renderer.findService(new UDAServiceType("AVTransport"));
                upnpService.getControlPoint().execute(new SetAVTransportURI(service, i.getFirstResource().getValue()){
                    @Override
                    public void failure(ActionInvocation invocation, UpnpResponse operation, String defaultMsg) {
                        adb.setTitle("Bad").setMessage("No!")
                        .setPositiveButton("OK",new OnClickListener() {
                            public void onClick(DialogInterface arg0, int arg1) {
                                // Some stuff to do when ok got clicked
                            }
                        }).show();
                    }

                    @Override
                    public void success(ActionInvocation invocation)
                    {
                        upnpService.getControlPoint().execute(new Play(service){
                            @Override
                            public void failure(ActionInvocation invocation, UpnpResponse operation, String defaultMsg) {
                                adb.setTitle("Bad").setMessage("Non réussi!")
                                .setPositiveButton("OK",new OnClickListener() {
                                    public void onClick(DialogInterface arg0, int arg1) {
                                        // Some stuff to do when ok got clicked
                                    }
                                }).show();
                            }
                        });
                    }
                });

            }
            else
            {
                adb.setTitle("Bad")
                .setMessage("selection ! need a media player ")
                .setPositiveButton("OK",new OnClickListener() {
                    public void onClick(DialogInterface arg0, int arg1) {
                        // Some stuff to do when ok got clicked         
                        Log.e("bla","blablaa");


                        Intent intent = new Intent().setClass(BrowseServerActivity.this, Newactivity.class);
                        startActivity(intent);

                    }
                }).show();
            }
        }

        @Override
        public String toString()
        {
            return i.getTitle();
        }

        @Override 
        public boolean equals(Object o)
        {
            if(this == o)
                return true;
            if(getClass() != o.getClass())
                return false;
            return i.equals(((ServerContentItem)o).i);
        }
    }

我希望代码清晰。谢谢

【讨论】:

  • 好的,所以你真的在使用Item.getFirstResource().getValue()。那应该行得通。但在原始代码中,您正在迭代 all 项。在您的新代码中,您尝试仅使用 firstdidl.getItems().get(0)。并非所有项目都必须具有资源。它也可能是一个容器。
  • 我刚刚测试了第一个值,但是当我尝试从所有项目中获取第一个项目时,这是同样的问题,所以我不知道问题出在哪里。当我按照我说的那样尝试时提取项目的值,应用程序停止并显示没有视图,我不知道你是否理解我的问题。谢谢
  • 恐怕我已经听不懂了。问题可能是您正在创建另一个 runOnMainThread,它可能正在做不正确的事情。我不太喜欢Android。我建议在您的代码中放置大量 Log-ing 并查看 URL 丢失的位置。您的代码大致是 UPnP 正确的,与您声称工作正常的原始 ServerContentItem 执行相同的操作。
  • 如果设备中没有可用的 AVtransport 服务会怎样?再次澄清一下,您是否在服务器中查找 AVTransport 对吗?当您调用 play() 方法时,当前设备开始播放媒体,对吗?
【解决方案2】:

Cling Ressource 类包含一个 URI 字段,获取并尝试。
Res CLING Support 1.0.5 API

【讨论】:

  • 这反映了res@importUri - 非常专业且与上传相关,而不是从服务器下载媒体,这是 OP 所要求的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多