2016-02-13 52 views
0

在我的musicplayer应用中,我尝试添加Google Cast功能。由于接收者无法访问本地存储在发件人设备上的文件,因此我必须在该设备上创建一个本地网络服务器,并在其中包含该文件。我试图用NanoHTTPD来做到这一点。我面临的问题是服务的文件(在我的情况下,在这种情况下,在端口2006的http://192.168.178.96,因此http://192.168.178.96:2006)只是空的。 0KB。我不知道为什么会发生这种情况,我没有任何错误等。 想法?NanoHTTPD投放文件为空

CODE:

的 “音频/ FLAC”,只是出于测试目的,将改为 “音频/ *”

服务器:

package de.julianostarek.musicplayer.Server; 


import android.util.Log; 
import android.widget.Toast; 

import java.io.FileInputStream; 
import java.util.Map; 

import fi.iki.elonen.NanoHTTPD; 


/** 
* Created by Julian Os on 13.02.2016. 
*/ 
public class LocalServer extends NanoHTTPD { 
    public static final String TAG = "LocalServer.class"; 

    public LocalServer(int port) { 
     super(port); 
    } 

    public LocalServer(String hostname, int port) { 
     super(hostname, port); 
     Log.e(TAG, hostname + ":" + port); 
    } 

    @Override 
    public Response serve(IHTTPSession session) { 
     try { 
      return new Response(Response.Status.OK, "audio/flac", session.getInputStream()); 
     }catch (Exception e) { 
      Log.e(TAG, "Serving failed: " + e.toString()); return null; } 
    } 

} 

对象实施IHTTPSession:

package de.julianostarek.musicplayer.Data; 

import android.content.ContentUris; 
import android.content.Context; 
import android.database.Cursor; 
import android.net.Uri; 
import android.provider.MediaStore; 
import android.support.annotation.Nullable; 
import android.support.v4.media.MediaDescriptionCompat; 
import android.support.v4.media.session.MediaSessionCompat.QueueItem; 
import android.util.Log; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Map; 

import de.julianostarek.android.radiostations.ExtendedRadioStation; 
import de.julianostarek.android.radiostations.RadioStations; 
import de.julianostarek.musicplayer.Helpers.PlaybackMode; 
import de.julianostarek.musicplayer.Services.PlaybackService; 
import de.julianostarek.musicplayer.Services.Playlist; 
import fi.iki.elonen.NanoHTTPD; 

public class StyleSong implements NanoHTTPD.IHTTPSession{ 
    private Integer trackNumber; 
    private String songTitle, songArtist, songGenre; 
    private long songID, songDuration; 
    private Uri songURI; 
    private boolean repeating; 
    private StyleAlbum songStyleAlbum; 
    private long albumID; 
    private String songDurString = ""; 
    private PlaybackMode mode; 
    private int secondsRemaining; 
    private String artwork; 
    private String path; 

    public StyleSong() { 
    } 

    // This is Network stuff so it cannot be performed on the UI Thread 
    public static StyleSong parseStationMetadata(@Nullable StyleSong ss, StyleRadioStation station) { 
     ExtendedRadioStation mStation = RadioStations.requestExtendedRadioStation(station, 20000); 
     if (ss == null) { 
      StyleSong s = new StyleSong(); 
      s.setSongTitle(station.getTitle()); 
      s.setSongArtist(station.getGenre()); 
      s.setArtwork(station.getArtwork()); 
      s.setPath(mStation.getStreamUrl()); 
      s.setMode(PlaybackMode.PLAYBACK_MODE_RADIO); 
      s.setSongDuration(0); 
      s.setSongDurString("--:--"); 
      return s; 
     } else { 
      ss.setSongTitle(station.getTitle()); 
      ss.setSongArtist(station.getGenre()); 
      ss.setArtwork(station.getArtwork()); 
      ss.setPath(mStation.getStreamUrl()); 
      ss.setMode(PlaybackMode.PLAYBACK_MODE_RADIO); 
      ss.setSongDuration(0); 
      ss.setSongDurString("--:--"); 
      return ss; 
     } 
    } 

    public Uri getSongURI() { 
     return ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, songID); 
    } 

    public void setSongURI(Uri songURI) { 
     this.songURI = songURI; 
    } 

    public String getPath() { 
     return path; 
    } 

    public void setPath(String path) { 
     this.path = path; 
    } 

    public long getSongDuration() { 
     return songDuration; 
    } 

    public void setSongDuration(long songDuration) { 
     this.songDuration = songDuration; 
    } 

    public String getTrackNumberString() { 
     return trackNumber != 0 ? String.valueOf(trackNumber) : "-"; 
    } 

    public Integer getTrackNumber() { 
     return trackNumber; 
    } 

    public void setTrackNumber(Integer trackNumber) { 
     this.trackNumber = trackNumber; 
    } 

    public String getSongArtist() { 
     return songArtist; 
    } 

    public void setSongArtist(String songArtist) { 
     this.songArtist = songArtist; 
    } 

    public long getSongID() { 
     return songID; 
    } 

    public void setSongID(long songID) { 
     this.songID = songID; 
    } 

    public String getSongGenre() { 
     return songGenre; 
    } 

    public void setSongGenre(String songGenre) { 
     this.songGenre = songGenre; 
    } 

    public String getSongTitle() { 
     return songTitle; 
    } 

    public void setSongTitle(String songTitle) { 
     this.songTitle = songTitle; 
    } 

    public StyleAlbum getSongAlbum() { 
     return songStyleAlbum; 
    } 

    public void setAlbum(StyleAlbum songStyleAlbum) { 
     this.songStyleAlbum = songStyleAlbum; 
    } 

    public String getSongDurString() { 
     if (!songDurString.equals("")) { 
      return songDurString; 
     } else { 
      songDurString = stringForTime(getSongDuration()); 
      return songDurString; 
     } 
    } 

    public void setSongDurString(String songDurString) { 
     this.songDurString = songDurString; 
    } 

    private String stringForTime(long timeMs) { 
     int totalSeconds = (int) timeMs/1000; 
     int seconds = totalSeconds % 60; 
     int minutes = (totalSeconds/60) % 60; 
     int hours = totalSeconds/3600; 
     if (hours > 0) { 
      return String.format("%d:%02d:%02d", hours, minutes, seconds); 
     } else { 
      return String.format("%02d:%02d", minutes, seconds); 
     } 
    } 

    public QueueItem toQueueItem() { 
     MediaDescriptionCompat description = new MediaDescriptionCompat.Builder() 
       .setTitle(getSongTitle()) 
       .setDescription(getSongArtist()) 
       .setIconBitmap(null) 
       .setMediaId(String.valueOf(getSongID())) 
       .build(); 
     return new QueueItem(description, 1); 
    } 

    public long getAlbumID() { 
     return albumID; 
    } 

    public void setAlbumID(long albumID) { 
     this.albumID = albumID; 
    } 

    public int getSecondsRemaining() { 
     return secondsRemaining; 
    } 

    public void setSecondsRemaining(int secondsRemaining) { 
     this.secondsRemaining = secondsRemaining; 
    } 

    public boolean isRepeating() { 
     return repeating; 
    } 

    public void setRepeating(boolean repeating) { 
     this.repeating = repeating; 
    } 

    public PlaybackMode getMode() { 
     return mode; 
    } 

    public void setMode(PlaybackMode mode) { 
     this.mode = mode; 
    } 

    public String getArtwork() { 
     return artwork == null ? songStyleAlbum.getAlbumArtPath() : artwork; 
    } 

    public void setArtwork(String artwork) { 
     this.artwork = artwork; 
    } 

    @Override 
    public void execute() throws IOException { 

    } 

    @Override 
    public NanoHTTPD.CookieHandler getCookies() { 
     return null; 
    } 

    @Override 
    public Map<String, String> getHeaders() { 
     return null; 
    } 

    @Override 
    public InputStream getInputStream() { 
     Log.e("InputStream access", getFileUri(songStyleAlbum.getContext())); 
     try { 
      return new FileInputStream(getFileUri(songStyleAlbum.getContext())); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    @Override 
    public NanoHTTPD.Method getMethod() { 
     return null; 
    } 

    @Override 
    public Map<String, String> getParms() { 
     return null; 
    } 

    @Override 
    public String getQueryParameterString() { 
     return null; 
    } 

    public String getFileUri(Context context){ 
     Uri mUri = Playlist.getCurr().getSongURI(); 
     Log.d("", "URI = " + mUri); 
     if (mUri != null && "content".equals(mUri.getScheme())) { 
      Cursor cursor = context.getContentResolver().query(mUri, new String[]{android.provider.MediaStore.Audio.Media.DATA}, null, null, null); 
      try { 
       cursor.moveToFirst(); 
       return cursor.getString(0); 
      } finally { 
       cursor.close(); 
      } 

     } else { 
      return mUri.getPath(); 
     } 
    } 

    @Override 
    public String getUri() { 
     Log.e("Uri access", getFileUri(songStyleAlbum.getContext()).toString()); 
     return Uri.parse(getFileUri(songStyleAlbum.getContext())).getPath(); 
    } 

    @Override 
    public void parseBody(Map<String, String> map) throws IOException, NanoHTTPD.ResponseException { 

    } 
} 

在我的服务,我创建并启动服务器onCreate()和执行服务(H当Cast客户端连接时,ERE一个StyleSong对象)。

+0

请显示您使用的完整网址。 – greenapps

+0

@greenapps the Log.e();输出例如/存储/模拟/ 0 /音乐/ Kodaline - 在一个完美的世界(豪华)/ 14丢失你的Mind.m4a在getInputStream() –

+0

这不是一个网址。而不是我问的。 – greenapps

回答

0

您是如何尝试访问NanoHTTPD启动的服务器的?要跨越所有T并点所有我的确保:

NanoHTTPD在服务线程上。

服务一个简单的helloworld.html来测试它。

最好使用WebView来查看它,而不是专用的应用程序。

请求访问网络的权限。

超越WebView,使用另一个实际的设备(如果可用的话)来访问这个可抛弃的服务器。

+0

我要从桌面的chrome中访问该文件,并且它是在一个服务中启动的 –