2015-08-07 2 views
2

Я хочу служить файлу, например, изображению для Chromecast. Я использовал nanoHTTPD так что я могу достичь контента через URL и вот код я использую, чтобы получить URL:Как отправить изображение в Chromecast с помощью NanoHTTPD

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); 
    } 

    } 

Таким образом я могу получить URL, как «192.168.X.XX: 8080/Image.gif ». Затем я создаю очередную MediaInfo для этого URL:

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 без необходимости копировать и вставлять URL-адрес из веб-браузера?

Скажите, нужен ли еще какой-то код.

журнала ошибок:

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 

Когда я выбираю изображение из моего веб-браузер все, что я могу увидеть:

uri: /sdcard/logo_etsiit.gif files {} parameters {} header 

EDIT: Я решил проблему с классом WebServer, теперь я могу увидеть изображение или PDF, выбранный в веб-браузере

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:

//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."); 
    } 
+0

Если на вашем, скажем, ноутбуке вы указываете свой браузер на http://192.168.1.38:8080/sdcard/logo_etsiit.gif, вы видите загрузку изображения с вашего телефона в своем браузере? Кроме того, вам нужно предоставить больше информации, чем «ничего не происходит»; Я уверен, что все происходит, но не так, как вы их ожидаете, но полезно видеть журналы как от отправителя, так и от получателя; например Получатель видит ваш запрос? Он видит правильный URL для вашего изображения? .... –

+0

Это то, что я вижу в своем браузере, когда я выбираю изображение: 'uri: /sdcard/logo_etsiit.gif files {} parameters {} header', поэтому я думаю, это одна из моих ошибок. Я добавил результаты журнала к вопросу. –

+0

Итак, сначала вам нужно исправить вашу проблему с правильной подачей изображения; при доступе к одной и той же ссылке в браузере для ноутбука он должен открыть изображение, а если нет, то нужно проверить ваш сервер или его конфигурацию. Из вышеприведенного исключения похоже, что адрес, который вы пытаетесь связать, уже используется, так же работает ли еще один сервер? –

ответ

0

Я нашел решение моей проблемы: я должен был изменить MediaInfo mediaInfo = new MediaInfo.Builder(getString(R.string.video_url)) к MediaInfo mediaInfo = new MediaInfo.Builder(ipdevice) где ipdevice мой телефон IP-адрес (например, http://192.168.1.40:8080).

 Смежные вопросы

  • Нет связанных вопросов^_^