2011-12-26 19 views
5

Voglio inviare un file audio .mp3 dal client Android per servlet server e salvarlo in una posizione. Se riproduco il file .mp3 salvato in quella posizione, dovrebbe essere riprodotto. La mia domanda è c'è un modo per inviare un file .mp3 direttamente dal client al server e recuperare il file mp3 in servlet.come inviare file audio dal client al server Android servlet

Il mio cliente codice lato è il seguente:

package com.android.audiorecord; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import org.apache.commons.io.FileUtils; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import com.android.audiofileplayer.StreamingMp3Player; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Base64; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.LinearLayout; 

public class AudioRecordActivity extends Activity 
{ 
    private static final String LOG_TAG = "AudioRecordTest"; 
    private static String mFileName = null; 
    private String url = "QRFileSaveServlet"; 
    String result; 
    byte[] value; 
    String s; 
    byte[] filebyte,clientbyte; 
    String readString; 
    private RecordButton mRecordButton = null; 
    private MediaRecorder mRecorder = null; 
    private SubmitButton mSubmitButton = null; 
    private PlayButton mPlayButton = null; 
    private MediaPlayer mPlayer = null; 
    String fileresult = ""; 
    HttpResponse response; 
    private void onRecord(boolean start) { 
     if (start) { 
      startRecording(); 
     } else { 
      stopRecording(); 
     } 
    } 

    private void onPlay(boolean start) { 
     if (start) { 
      startPlaying(); 
     } else { 
      stopPlaying(); 
     } 
    } 

    private void startPlaying() { 
     mPlayer = new MediaPlayer(); 
     try { 
      mPlayer.setDataSource(mFileName); 
      mPlayer.prepare(); 
      mPlayer.start(); 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "prepare() failed"); 
     } 
    } 

    private void stopPlaying() { 
     mPlayer.release(); 
     mPlayer = null; 
    } 

    private void startRecording() { 
     mRecorder = new MediaRecorder(); 
     mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 
     mRecorder.setOutputFile(mFileName); 
     mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

     try { 
      mRecorder.prepare(); 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "prepare() failed"); 
     } 

     mRecorder.start(); 
    } 
    /* public boolean saveas(int ressound){ 
      byte[] buffer=null; 
      InputStream fIn = getBaseContext().getResources().openRawResource(ressound); 
      int size=0; 

      try { 
       size = fIn.available(); 
       buffer = new byte[size]; 
       fIn.read(buffer); 
      fIn.close(); 
      } catch (IOException e) { 
      // TODO Auto-generated catch block 
      return false; 
      } 

      String path="/sdcard/media/audio/ringtones/"; 
      String filename="examplefile"+".ogg"; 

      boolean exists = (new File(path)).exists(); 
      if (!exists){new File(path).mkdirs();} 

      FileOutputStream save; 
      try { 
      save = new FileOutputStream(path+filename); 
      save.write(buffer); 
      save.flush(); 
      save.close(); 
      } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      return false; 
      } catch (IOException e) { 
      // TODO Auto-generated catch block 
      return false; 
      }  

      sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+path+filename))); 

      File k = new File(path, filename); 

      ContentValues values = new ContentValues(); 
      values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
      values.put(MediaStore.MediaColumns.TITLE, "exampletitle"); 
      values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg"); 
      values.put(MediaStore.Audio.Media.ARTIST, "cssounds "); 
      values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
      values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true); 
      values.put(MediaStore.Audio.Media.IS_ALARM, true); 
      values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

      //Insert it into the database 
      this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values); 


      return true; 
      } */ 
    private void stopRecording() { 
     mRecorder.stop(); 
     mRecorder.release(); 
     // mRecorder.reset(); 
     mRecorder = null; 
    } 

    class RecordButton extends Button { 
     boolean mStartRecording = true; 

     OnClickListener clicker = new OnClickListener() { 
      public void onClick(View v) { 
       onRecord(mStartRecording); 
       if (mStartRecording) { 
        setText("Stop recording"); 
       } else { 
        setText("Start recording"); 
       } 
       mStartRecording = !mStartRecording; 
      } 
     }; 

     public RecordButton(Context ctx) { 
      super(ctx); 
      setText("Start recording"); 
      setOnClickListener(clicker); 
     } 
    } 

    class PlayButton extends Button { 
     boolean mStartPlaying = true; 

     OnClickListener clicker = new OnClickListener() { 
      public void onClick(View v) { 
       onPlay(mStartPlaying); 
       if (mStartPlaying) { 
        setText("Stop playing"); 
       } else { 
        setText("Start playing"); 
       } 
       mStartPlaying = !mStartPlaying; 
      } 
     }; 

     public PlayButton(Context ctx) { 
      super(ctx); 
      setText("Start playing"); 
      setOnClickListener(clicker); 
     } 

    } 
    class SubmitButton extends Button { 

     OnClickListener clicker = new OnClickListener() { 

      public void onClick(View v) { 



         File f = new File(Environment.getExternalStorageDirectory()+"/audiorecordtest.mp3"); 



//      
       //byte[] file = fileresult.getBytes(); 

       try { 
        filebyte = FileUtils.readFileToByteArray(f); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       System.out.println("$$$$$$$$$$$" + filebyte); 
       clientbyte = Base64.encode(filebyte, MODE_APPEND);//(filebyte, MODE_APPEND); 
       s= new String(clientbyte); 
       System.out.println("**************" + s); 

       ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       nameValuePairs.add(new BasicNameValuePair("Audiofile", s)); 
       result = AudioServer.executePost(url, nameValuePairs); 
       result = result.trim(); 
       System.out.println("response recieved " + result); 
       if(result!=null){ 
        Bundle bundle = new Bundle(); 
        Intent explicitIntent = new Intent(AudioRecordActivity.this, 
          StreamingMp3Player.class); 
        bundle.putString("result", result); 
        explicitIntent.putExtras(bundle); 
        startActivity(explicitIntent); 
       } 

      } 

     }; 
     public SubmitButton(Context ctx) { 
      super(ctx); 
      setText("Save"); 
      setOnClickListener(clicker); 
     } 
      } 

    public AudioRecordActivity() { 
     mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     mFileName += "/audiorecordtest.mp3"; 
    } 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     LinearLayout ll = new LinearLayout(this); 
     mRecordButton = new RecordButton(this); 
     ll.addView(mRecordButton, 
      new LinearLayout.LayoutParams(
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       0)); 
     mPlayButton = new PlayButton(this); 
     ll.addView(mPlayButton, 
      new LinearLayout.LayoutParams(
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       0)); 
    mSubmitButton = new SubmitButton(this); 
     ll.addView(mSubmitButton, new LinearLayout.LayoutParams(
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT, 0)); 

     setContentView(ll); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if (mRecorder != null) { 
      mRecorder.release(); 
      mRecorder = null; 
     } 

     if (mPlayer != null) { 
      mPlayer.release(); 
      mPlayer = null; 
     } 
    } 
} 

in questo posso inviare il file audiorecordtest.mp3 direcly al server senza la codifica a byte [] e inviarla in coppia NameValue.

Il mio codice lato server è la seguente:

package com.gsr.qrbarcode; 
import java.io.BufferedInputStream; 
import java.io.ByteArrayInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.PrintWriter; 
import java.net.MalformedURLException; 
import java.net.URL; 
import com.android.gsr.utils.AudioSampleReader; 
import com.android.gsr.utils.AudioSampleWriter; 
import com.android.gsr.utils.Base64; 
import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream; 
//import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.sound.sampled.AudioFileFormat; 
import javax.sound.sampled.AudioFileFormat.Type; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.SourceDataLine; 
import javax.sound.sampled.UnsupportedAudioFileException; 
import org.apache.commons.io.FileUtils; 

/** 
* Servlet implementation class QRFileSaveServlet 
*/ 
//@WebServlet("/QRFileSaveServlet") 
public class QRFileSaveServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    AudioInputStream ais; 
    /** 
    * Default constructor. 
    */ 
    public QRFileSaveServlet() { 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 


     String qrfile= request.getParameter("Audiofile"); 
     System.out.println("String Parameter \"" +qrfile); 
     byte[] audiofile=Base64.decode(qrfile); 
     String newStr = new String(audiofile); 


      // Display the contents of the byte array. 
      System.out.println("The new String equals \"" +newStr + "\""); 
      String filePath = this.getServletContext().getRealPath("/")+""; 
      System.out.println("Path of the file " + filePath); 
      String fileupload="AudioFileStorage"; 
      //PrintWriter out = response.getWriter(); 


      File f; 

       f= new File(filePath); 

       //int status = 0; 
       if(f.exists()) { 
        filePath += fileupload; 

        f = new File(filePath); 
        if(!f.exists()){ 
         f.mkdir(); 
        } 



        f = new File(filePath,"test.mp3"); 
        if(!f.exists()) { 
         FileOutputStream fos = new FileOutputStream(f); 

         fos.write(audiofile); 
         fos.flush(); 
         fos.close(); 
        } else { 
         //out.println("failure"); 
         ServletOutputStream stream = null; 
          BufferedInputStream buf = null; 
          try{ 

          stream = response.getOutputStream(); 
         // File mp3 = new File(mp3Dir + "/" + fileName); 

          response.setContentType("audio/mpeg"); 

          response.addHeader("Content-Disposition","attachment; filename="+f); 

          response.setContentLength((int) f.length()); 

          FileInputStream input = new FileInputStream(f); 
          buf = new BufferedInputStream(input); 
          int readBytes = 0; 

          while((readBytes = buf.read()) != -1) 
          stream.write(readBytes); 
          System.out.println("Response Stream"+stream); 

         } catch (IOException ioe){ 

          throw new ServletException(ioe.getMessage()); 

         } finally { 
         if(stream != null) 
          stream.close(); 
          if(buf != null) 
           buf.close(); 
           } 
     } 

       } 
       if (filePath == null || filePath.equals("")) 
         throw new ServletException(
         "Invalid or non-existent mp3Dir context-param."); 
       URL url = null; 

       try{ 

       url = f.toURL(); 

        System.out.println("URL : "+ url); 

        System.out.println("Converting process Successfully"); 

       } 

        catch (MalformedURLException me){ 

        System.out.println("Converting process error"); 

        } 
       //String rfilepath=this.getServletContext().getRealPath("/")+" AudioFileStorage/test.mp3"; 
       //System.out.println("Path of the rfilepath " + rfilepath); 



} 


} 

qui posso ottenere il file audiorecordtest.mp3 direttamente dal cliente senza la decodifica nel lato server e giocare in questo servlet

mia connessione server locale per il client executepost() è la seguente:

package com.android.audio; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URI; 
import java.util.ArrayList; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 

public class AudioServer { 

    static InputStream is; 
    private static String API_URL = "http://192.168.15.71:8088/QRBarCodeServer/"; 

    public static String executePost(String apiurl, 
      ArrayList<NameValuePair> urlParameters) { 

     try { 
      // Create connection 

      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(API_URL + apiurl); 

      httppost.setEntity(new UrlEncodedFormEntity(urlParameters)); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 

      // Get Response 
      // InputStream is = connection.getInputStream(); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
      String line; 
      StringBuffer response1 = new StringBuffer(); 
      while ((line = rd.readLine()) != null) { 
       response1.append(line); 
       response1.append('\r'); 
      } 
      rd.close(); 

      return response1.toString(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    public static String executeHttpGet(String apiurl) throws Exception { 

     BufferedReader in = null; 

     try { 

      HttpClient client = new DefaultHttpClient(); 

      HttpGet request = new HttpGet(API_URL + apiurl); 

      request.setURI(new URI(apiurl)); 

      HttpResponse response = client.execute(request); 

      in = new BufferedReader(new InputStreamReader(response.getEntity() 
        .getContent())); 

      StringBuffer sb = new StringBuffer(""); 

      String line = ""; 

      String NL = System.getProperty("line.separator"); 

      while ((line = in.readLine()) != null) { 

       sb.append(line + NL); 

      } 

      in.close(); 

      String result = sb.toString(); 

      return result; 

     } finally { 

      if (in != null) { 

       try { 

        in.close(); 

       } catch (IOException e) { 

        e.printStackTrace(); 

       } 

      } 

     } 

    } 

} 

risposta

2

qui è modo semplice per farlo

012.

1: da un lato Android leggere il file .mp3 e creare base64String da esso. 2: Sul lato server leggere questo base64String e convertirlo in file .mp3.

per convertire qualsiasi file per base64String segue è il processo

File file = new File(Environment.getExternalStorageDirectory() + "/hello-4.wav"); 
byte[] bytes = FileUtils.readFileToByteArray(file); 

String encoded = Base64.encodeToString(bytes, 0); 
+0

Questa è la risposta peggiore possibile – Anton

1

Si può raggiungere utilizzando apache MultipartEntity:

HttpClient client = new DefaultHttpClient(); 
HttpPost post = new HttpPost(BASE_URL); 
MultipartEntity mpEntity = new MultipartEntity(); 
mpEntity.addPart("Audiofile", new FileBody(file, "audio/mpeg")); 
post.setEntity(mpEntity); 
HttpResponse res = client.execute(post);  
0

Sì è possibile inviare questo Servlet c'è Mime tipo MIME significa multimediale estensione Sto inviando il codice posso garantire che funzionerà in Servlet in Java e si dovrebbe prendere cura per Android da proprio

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 

import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class SendMp3Envious extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
String fileName = (String) request.getParameter("file"); 
if (fileName == null || fileName.equals("")) 
    throw new ServletException(
     "Invalid or non-existent file parameter in SendMp3 servlet."); 

    if (fileName.indexOf(".mp3") == -1) 
    fileName = fileName + ".mp3"; 

String mp3Dir = getServletContext().getInitParameter("mp3-dir"); 
if (mp3Dir == null || mp3Dir.equals("")) 
    throw new ServletException(
     "Invalid or non-existent mp3Dir context-param."); 

ServletOutputStream stream = null; 
BufferedInputStream buf = null; 
try { 

    stream = response.getOutputStream(); 
    File mp3 = new File(mp3Dir + "/" + fileName); 

    //set response headers 
    response.setContentType("audio/mpeg"); 

    response.addHeader("Content-Disposition", "attachment; filename=" 
     + fileName); 

    response.setContentLength((int) mp3.length()); 

    FileInputStream input = new FileInputStream(mp3); 
    buf = new BufferedInputStream(input); 
    int readBytes = 0; 
    //read from the file; write to the ServletOutputStream 
    while ((readBytes = buf.read()) != -1) 
    stream.write(readBytes); 
} catch (IOException ioe) { 
    throw new ServletException(ioe.getMessage()); 
} finally { 
    if (stream != null) 
    stream.close(); 
    if (buf != null) 
    buf.close(); 
} 
} 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 

doGet(request, response); 
} 
} 
+0

@ Mike Possa tu mi aiuti, io sono nuovo di StackOverflow, a causa di qualche errore – Sheel

+0

@ Mike Può aiutarmi, io sono nuovo di StackOverflow, a causa di qualche errore di meno consapevolezza circa StackOverflow , il mio rank si riduce a 3 e non riesco a postare qualche buona domanda perché poco prima di 1 giorno ho ottenuto -18 punti non in grado di fare domande – Sheel

Problemi correlati