在我的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对象)。
请显示您使用的完整网址。 – greenapps
@greenapps the Log.e();输出例如/存储/模拟/ 0 /音乐/ Kodaline - 在一个完美的世界(豪华)/ 14丢失你的Mind.m4a在getInputStream() –
这不是一个网址。而不是我问的。 – greenapps