2014-04-04 7 views
8

Mam pewne problemy podczas przesyłania dużych plików wideo (zapisu do 150MB)Upload dużych plików z paskiem postępu i bez OutOfMemory Błąd w Androidzie

1.W przypadku, gdy używam tego kodu Link1 .I stanie przekazać mały plik z postępem pasek, ale ponieważ mój plik jest duży, więc Android daje mi OutOfMemory Error.

2.Jeśli korzystam z tego kodu Link2. jestem w stanie przesłać duży plik (to naprawdę dobre rozwiązanie), ale nie wiem, jak pokazać postęp (jak w 20% ukończone lub 80% kompletne itd.). Proszę mnie poprowadzić.

+0

Czy próbowałeś używać więcej niż 200 kawałków w kodzie z pierwszego linku? – SimonSays

+0

Tak, próbowałem upto 500 kawałków, ale nie działało tak wypróbowałem używając Link2 –

+0

@VibhorBhardwaj: Nawet 500 porcji potrzebuje bufora około 300 KB na plik 150 MB. Prawdopodobnie zabrałbym co najmniej 2000 kawałków, które zmniejszyły rozmiar bufora do około 75 KB. – Squonk

Odpowiedz

16

Wreszcie mam rozwiązanie na moje pytanie Chcę dzielić ...

1.First rozwiązanie Link1 Rozwiązanie to jest ok z małych plików, takich jak przesyłanie obrazu zapisu do 15MB .Ale nie mogłem pozbyć z Błąd OutOfMemory, jeśli plik jest bardzo duży.

2.Pewne rozwiązanie (Link2) jest naprawdę dobrym rozwiązaniem i dla pokazania paska postępu użyłem niestandardowej klasy MultipartEntity. Kod jest tutaj:

import java.io.FilterOutputStream; 
    import java.io.IOException; 
    import java.io.OutputStream; 
    import java.nio.charset.Charset; 

    import org.apache.http.entity.mime.HttpMultipartMode; 
    import org.apache.http.entity.mime.MultipartEntity; 

    public class CustomMultiPartEntity extends MultipartEntity 

{ 

    private final ProgressListener listener; 

    public CustomMultiPartEntity(final ProgressListener listener) 
    { 
     super(); 
     this.listener = listener; 
    } 

    public CustomMultiPartEntity(final HttpMultipartMode mode, final ProgressListener listener) 
    { 
     super(mode); 
     this.listener = listener; 
    } 

    public CustomMultiPartEntity(HttpMultipartMode mode, final String boundary, final Charset charset, final ProgressListener listener) 
    { 
     super(mode, boundary, charset); 
     this.listener = listener; 
    } 

    @Override 
    public void writeTo(final OutputStream outstream) throws IOException 
    { 
     super.writeTo(new CountingOutputStream(outstream, this.listener)); 
    } 

    public static interface ProgressListener 
    { 
     void transferred(long num); 
    } 

    public static class CountingOutputStream extends FilterOutputStream 
    { 

     private final ProgressListener listener; 
     private long transferred; 

     public CountingOutputStream(final OutputStream out, final ProgressListener listener) 
     { 
      super(out); 
      this.listener = listener; 
      this.transferred = 0; 
     } 

     public void write(byte[] b, int off, int len) throws IOException 
     { 
      out.write(b, off, len); 
      this.transferred += len; 
      this.listener.transferred(this.transferred); 
     } 

     public void write(int b) throws IOException 
     { 
      out.write(b); 
      this.transferred++; 
      this.listener.transferred(this.transferred); 
     } 
    } 
} 

A mój kod aktywność jest

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.mime.HttpMultipartMode; 
import org.apache.http.entity.mime.MultipartEntity; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.entity.mime.content.StringBody; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.util.EntityUtils; 

import com.example.fileupload.CustomMultiPartEntity.ProgressListener; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

public class MainActivity extends Activity implements OnClickListener { 
    private ProgressBar pb; 
    private final String filename = "/mnt/sdcard/vid.mp4"; 
    // private final String filename = "/mnt/sdcard/a.3gp"; 
    private String urlString = "http://10.0.2.2:8080/FileUploadServlet1/UploadServlet"; 
    private TextView tv; 
    long totalSize = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tv = (TextView) findViewById(R.id.textView1); 
     findViewById(R.id.button1).setOnClickListener(this); 
     tv.setText("init"); 
     pb = (ProgressBar) findViewById(R.id.progressBar1); 

    } 

    private class Uploadtask extends AsyncTask<Void, Integer, String> { 
     @Override 
     protected void onPreExecute() { 
      pb.setProgress(0); 
      tv.setText("shuru"); 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onProgressUpdate(Integer... progress) { 
      pb.setProgress(progress[0]); 
     } 

     @Override 
     protected String doInBackground(Void... params) { 
      return upload(); 
     } 

     private String upload() { 
      String responseString = "no"; 

      File sourceFile = new File(filename); 
      if (!sourceFile.isFile()) { 
       return "not a file"; 
      } 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(urlString); 


      try { 
       CustomMultiPartEntity entity=new CustomMultiPartEntity(new ProgressListener() { 

        @Override 
        public void transferred(long num) { 
         publishProgress((int) ((num/(float) totalSize) * 100));      
        } 
       }); 

       entity.addPart("type", new StringBody("video")); 
       entity.addPart("uploadedfile", new FileBody(sourceFile)); 
       totalSize = entity.getContentLength(); 
       httppost.setEntity(entity); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity r_entity = response.getEntity(); 
       responseString = EntityUtils.toString(r_entity); 

      } catch (ClientProtocolException e) { 
       responseString = e.toString(); 
      } catch (IOException e) { 
       responseString = e.toString(); 
      } 

      return responseString; 

     } 


     @Override 
     protected void onPostExecute(String result) { 
      tv.setText(result); 
      super.onPostExecute(result); 
     } 

    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     new Uploadtask().execute(); 
    } 

} 
+0

To zadziałało dla mnie. Dzięki, Vibhor Bhardwaj. – TdSoft

+0

@TdSoft Wellcome –

+1

Czy jesteś pewien, co zrobiłeś, informując o faktycznym postępie przesyłania plików, czy też postęp odczytu pliku z systemu plików jest bardzo szybki? –

Powiązane problemy