首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用NanoHTTPD将图像发送到Chromecast

如何使用NanoHTTPD将图像发送到Chromecast
EN

Stack Overflow用户
提问于 2015-08-07 17:41:10
回答 1查看 1.5K关注 0票数 2

我想提供一个文件,一个图像,例如,Chromecast。我使用了nanoHTTPD,这样我就可以通过url访问内容,下面是我用来获取url的代码:

代码语言:javascript
运行
复制
private class WebServer extends NanoHTTPD {

    public WebServer() {
        super(8080);
    }


    @Override
    public Response serve(String uri, Method method,
                          Map<String, String> header, Map<String, String> parameters,
                          Map<String, String> files) {
        File rootDir = Environment.getExternalStorageDirectory();
        File[] filesList = null;
        String filepath = "";
        if (uri.trim().isEmpty()) {
            filesList = rootDir.listFiles();
        } else {
            filepath = uri.trim();
        }
        filesList = new File(filepath).listFiles();
        String answer = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><title>sdcard0 - TECNO P5 - WiFi File Transfer Pro</title>";
        if (new File(filepath).isDirectory()) {
            for (File detailsOfFiles : filesList) {
                answer += "<a href=\"" + detailsOfFiles.getAbsolutePath()
                        + "\" alt = \"\">"
                        + detailsOfFiles.getAbsolutePath() + "</a><br>";
            }
        } else {
        }
        answer += "</head></html>" + "uri: " + uri + " \nfiles " + files
                + " \nparameters " + parameters + " \nheader ";
        return new NanoHTTPD.Response(answer);
    }

    }

这样我就可以得到"192.168.X.XX:8080/image.gif“这样的url。然后为这个url创建一个常规的MediaInfo:

代码语言:javascript
运行
复制
private void startVideo() {
    MediaMetadata mediaMetadata = new MediaMetadata(     MediaMetadata.MEDIA_TYPE_PHOTO );
    mediaMetadata.putString( MediaMetadata.KEY_TITLE, getString( R.string.titulo_video ) );

    MediaInfo mediaInfo = new MediaInfo.Builder( getString( R.string.video_url ) )
            .setContentType( getString( R.string.content_type_gif ) )
            .setStreamType( MediaInfo.STREAM_TYPE_BUFFERED )
            .setMetadata( mediaMetadata )
            .build();
    try {
        mRemoteMediaPlayer.load( apiClient, mediaInfo, true )
                .setResultCallback( new ResultCallback<RemoteMediaPlayer.MediaChannelResult>() {
                    @Override
                    public void onResult( RemoteMediaPlayer.MediaChannelResult mediaChannelResult ) {
                        if( mediaChannelResult.getStatus().isSuccess() ) {
                            mVideoIsLoaded = true;
                            mButton.setText( getString( R.string.pause_video ) );
                        }
                    }
                } );
    } catch( Exception e ) {
    }
}

其中<string name="video_url">http://192.168.1.38:8080/sdcard/logo_etsiit.gif</string>是我以前得到的url,但是当我试图转换图像时,什么都不会发生。

是否可以直接将文件提供给MediaInfo,而不必从web浏览器复制和粘贴url?

告诉我是否需要更多的代码。

日志错误:

代码语言:javascript
运行
复制
08-07 20:30:35.568  14669-14669/com.example.httpserver W/Httpd﹕ Web server initialized.
08-07 20:30:35.601  14669-14669/com.example.httpserver I/MediaRouter﹕ Found default route: MediaRouter.RouteInfo{ uniqueId=android/.support.v7.media.SystemMediaRouteProvider:DEFAULT_ROUTE, name=Teléfono, description=null, enabled=true, connecting=false, playbackType=0, playbackStream=3, volumeHandling=1, volume=3, volumeMax=15, presentationDisplayId=-1, extras=null, providerPackageName=android }
08-07 20:30:35.610  14669-14669/com.example.httpserver W/System.err﹕ java.net.BindException: bind failed: EADDRINUSE (Address already in use)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at libcore.io.IoBridge.bind(IoBridge.java:99)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:132)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at java.net.ServerSocket.bind(ServerSocket.java:335)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at java.net.ServerSocket.bind(ServerSocket.java:295)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at com.example.httpserver.NanoHTTPD.start(NanoHTTPD.java:142)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at com.example.httpserver.MainActivity.onResume(MainActivity.java:128)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1257)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at android.app.Activity.performResume(Activity.java:6076)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2975)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3017)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2392)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at android.app.ActivityThread.access$800(ActivityThread.java:151)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at android.os.Looper.loop(Looper.java:135)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5254)
08-07 20:30:35.611  14669-14669/com.example.httpserver W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
08-07 20:30:35.612  14669-14669/com.example.httpserver W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
08-07 20:30:35.612  14669-14669/com.example.httpserver W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
08-07 20:30:35.612  14669-14669/com.example.httpserver W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
08-07 20:30:35.612  14669-14669/com.example.httpserver W/System.err﹕ Caused by: android.system.ErrnoException: bind failed: EADDRINUSE (Address already in use)
08-07 20:30:35.612  14669-14669/com.example.httpserver W/System.err﹕ at libcore.io.Posix.bind(Native Method)
08-07 20:30:35.612  14669-14669/com.example.httpserver W/System.err﹕ at libcore.io.ForwardingOs.bind(ForwardingOs.java:56)
08-07 20:30:35.612  14669-14669/com.example.httpserver W/System.err﹕ at libcore.io.IoBridge.bind(IoBridge.java:97)
08-07 20:30:35.612  14669-14669/com.example.httpserver W/System.err﹕ ... 19 more

当我从web浏览器中选择图像时,我所能看到的只有:

代码语言:javascript
运行
复制
uri: /sdcard/logo_etsiit.gif files {} parameters {} header

编辑:我解决了WebServer类的问题,现在我可以在我的web浏览器中看到选定的图像或PDF。

代码语言:javascript
运行
复制
  public class webserver extends NanoHTTPD {
    FileInputStream fileInputStream;

    public webserver(){
        super(8080);
    }
    @Override
    public Response serve(String uri, Method method, Map<String, String> header,Map<String, String> parameters, Map<String, String> files) {
        String mediasend=getExtension(chosenFile);

        FileInputStream fis = null;
        try {
            fis = new FileInputStream(Environment.getExternalStorageDirectory()
                    + "/" + chosenFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }



        return new NanoHTTPD.Response(etsiit.etsiitcast_def.NanoHTTPD.Response.Status.OK,mediasend,fis);
    }
}

我还将此代码添加到onCreate中:

代码语言:javascript
运行
复制
  //Get the ip of the device running NanoHTTPD server
    WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    int ipAddress = wifiInfo.getIpAddress();
    ipdevice=String.format("http://%d.%d.%d.%d:8080",(ipAddress & 0xff),(ipAddress >> 8 & 0xff),(ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff));

    // start the webserver
    mediaserver = new webserver();
    try {
        mediaserver.start();
    } catch(IOException ioe) {
        Log.d("Httpd", "The server could not start.");
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-09 11:35:28

我找到了解决问题的方法:我只需将MediaInfo mediaInfo = new MediaInfo.Builder( getString( R.string.video_url ) )更改为MediaInfo mediaInfo = new MediaInfo.Builder(ipdevice),其中ipdevice是我的电话ip地址(例如http://192.168.1.40:8080)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31883674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档