Comment servir un fichier sur la carte sd à l'aide de NanoHTTPD (à l'intérieur Android)
J'ai écrit un petit Android server à l'aide de NanoHTTPD. Il peut servir d'un fichier HTML (page web qui se trouve à sdcard/www/index.html). Quelqu'un peut-il svp m'aider à trouver comment puis-je servir un fichier audio ou vidéo au lieu d'une page html à l'aide de NanoHTTPD? Pardonnez-moi si la question semble stupide, je suis nouveau sur HTTP! Voici mon code côté serveur (je l'ai remplacé la page web de chemin d'accès d'un fichier audio):
package com.example.zserver;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
public class MainActivity extends Activity {
private WebServer server;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
server = new WebServer();
try {
server.start();
} catch(IOException ioe) {
Log.w("Httpd", "The server could not start.");
}
Log.w("Httpd", "Web server initialized.");
}
@Override
public void onDestroy()
{
super.onDestroy();
if (server != null)
server.stop();
}
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) {
String answer = "";
try {
//Opening file from SD Card
File root = Environment.getExternalStorageDirectory();
FileReader index = new FileReader(root.getAbsolutePath() +
"/www/music.mp3");
BufferedReader reader = new BufferedReader(index);
String line = "";
while ((line = reader.readLine()) != null) {
answer += line;
}
} catch(IOException ioe) {
Log.w("Httpd", ioe.toString());
}
return new NanoHTTPD.Response(answer);
}
}
}
J'ai inclus nécessaire d'utiliser des autorisations dans mon code:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Toute aide serait appréciée. Merci à l'avance!
EDIT, Ajout de l'autorisation:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
EDIT1: manière Canonique de la lecture et de l'écriture à des tampons:
int read;
int n=1;
while((read = dis.read(mybytearray)) != -1){
dos.write(mybytearray, 0, read);}
OriginalL'auteur Vinit Shandilya | 2013-10-14
Vous devez vous connecter pour publier un commentaire.
D'abord, vous devez assurez-vous de définir le type mime correctement au moment de servir, des fichiers multimédias.
Deuxièmement, vous n'irez pas très loin de la lecture d'un fichier MP3, ligne par ligne à l'aide de
FileReader
, au lieu de cela vous devez fournir NanoHTTPD avec unInputStream
.Ci-dessous est une version modifiée de votre code, qui sert un fichier MP3. En définissant le type mime pour
audio/mpeg
vous laisser le navigateur de décider quoi faire avec ce contenu. Dans google Chrome, par exemple, le lecteur de musique est lancée et joue le fichier.EDIT: beaucoup de gens ont demandé comment faire pour rendre le fichier audio adressable en utilisant les demandes de plage, je vais le démontrer ci-dessous
Pour rendre le fichier audio adressable, de demandes de plage sont utilisés qui permettent aux clients HTTP pour récupérer les parties du fichier audio en morceaux. Assurez-vous que vous êtes desservant le fichier avec l'PARTIAL_CONTENT le statut de la réponse HTTP (206). Un exemple de mise en œuvre peuvent être trouvés dans le code d'exemple de NanoHTTPD: SimpleWebserver.java
Dans ma mise en œuvre, au lieu de retourner un NanoHTTPD Réponse directement dans le service méthode, j'ai créer une autre méthode appelée "servefile" que j'utilise comme réponse pour le traitement des demandes de plage, comme vous pouvez le voir ci-dessous. Ce code est une modification de la mise en œuvre de la SimpleWebServer.java j'ai lié ci-dessus.
Statut.OK ne permet pas que le mp3 à chercher dans le lecteur html5, s'il vous plaît dites-moi ce que sont les en-têtes j'ai besoin de l'utilisateur pour le rendre cherché dans le lecteur
J'ai utilisé ce code pour diffuser un mp3 à partir de mon téléphone à mon navigateur. Je suis d'erreur
403 Forbidden (/)
. Comment résoudre ce problème?Prend-il en charge Plage de la demande? l'essayer, mais il n'a pas de travail, pas sûr que nous avons besoin de changer le code pour le soutenir.
Pour être en mesure de servir de la vidéo de gros fichiers à l'aide de NanoHTTPD, vous devez vous assurer que les en-têtes sont correctement initialisées. Ajoutez la ligne suivante à la "decodeHeader" méthode et qui devrait résoudre le problème: les en-têtes.put("plage","octets=0-");
OriginalL'auteur Zebaz
Ne pas vous devez également ajouter la permission android.la permission.READ_EXTERNAL_STORAGE
Parce que vous êtes en train de lire un fichier.
OriginalL'auteur Bolke
c'est le code pour servir tout type de fichier
dans Manfiest fichier ajouter le cette autorisation
OriginalL'auteur sanjay