Upload Fortschrittsbalken in Android?

Ich benutze den folgenden Code, um das Video auf PHP-Server hochladen, es funktionierte gut, aber ich muss die Fortschrittsanzeige während der Datei hochgeladen werden, ich muss die Synchronisation zwischen Datei-Upload und Fortschrittsbalken erhöhen.

HttpURLConnection conn = null; DataOutputStream dos = null; DataInputStream inStream = null; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1 * 1024 * 1024; String responseFromServer = ""; File sourceFile = new File(sourceFileUri); if (!sourceFile.isFile()) { Log.e("Huzza", "Source File Does not exist"); return; } int serverResponseCode=0; try { // open a URL connection to the Servlet FileInputStream fileInputStream = new FileInputStream(sourceFile); URL url = new URL(upLoadServerUri); conn = (HttpURLConnection) url.openConnection(); // Open a HTTP connection to the URL conn.setDoInput(true); // Allow Inputs conn.setDoOutput(true); // Allow Outputs conn.setUseCaches(false); // Don't use a Cached Copy conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("ENCTYPE", "multipart/form-data"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); conn.setRequestProperty("uploadedfile", fileName); // conn.setFixedLengthStreamingMode(1024); //conn.setChunkedStreamingMode(1); dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""+ fileName + "\"" + lineEnd); dos.writeBytes(lineEnd); bytesAvailable = fileInputStream.available(); // create a buffer of maximum size Log.i("Huzza", "Initial .available : " + bytesAvailable); //bufferSize = Math.min(bytesAvailable, maxBufferSize); bufferSize=(int)sourceFile.length(); System.out.println("BytesAvail"+bytesAvailable); System.out.println("maxBufferSize"+maxBufferSize); buffer = new byte[bufferSize]; // read file and write it into form... bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { dos.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } // send multipart form data necesssary after file data... dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // Responses from the server (code and message) serverResponseCode = conn.getResponseCode(); String serverResponseMessage = conn.getResponseMessage(); Log.i("Upload file to server", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode); // close streams Log.i("Upload file to server", fileName + " File is written"); fileInputStream.close(); dos.flush(); dos.close(); } catch (MalformedURLException ex) { ex.printStackTrace(); Log.e("Upload file to server", "error: " + ex.getMessage(), ex); } catch (Exception e) { e.printStackTrace(); } //this block will give the response of upload link try { BufferedReader rd = new BufferedReader(new InputStreamReader(conn .getInputStream())); String line; while ((line = rd.readLine()) != null) { Log.i("Huzza", "RES Message: " + line); } rd.close(); } catch (IOException ioex) { Log.e("Huzza", "error: " + ioex.getMessage(), ioex); } return; // like 200 (Ok) 

Vielen Dank .

  • Android vorne Kamera zeigt Videos zwischen 7,5 und 8,0 - setVideoFrameRate funktioniert nicht - Samsung Galaxy s2
  • Android - Erstellen Sie eine Benachrichtigung, TaskStackBuilder.addParentStack funktioniert nicht
  • Kann Eclipse ADT nicht auf 22 aktualisieren
  • Wenn du einen POJO in Firebase machst, kannst du ServerValue.TIMESTAMP verwenden?
  • Unterschied zwischen ActionBarActivity und Fragment Activity
  • Zeigen Sie die Tastatur programmgesteuert auf Android mit einer OK / DONE-Taste an
  • Speichern von Währung in SQlite Android Datenbank
  • OnPreferenceChange-Methode wird nicht aufgerufen, wenn sich Listpreferences ändert
  • Wie gewöhnliche Entwickler ausprobieren isPermissionRevokedByPolicy ()?
  • Hinzufügen von Abhängigkeit zu spezifischem ProduktFlavor und buildType in gradle
  • Ist es möglich, einen Screenshot zu machen und Pixelwerte mit Espresso zu testen?
  • Schwarzer Text auf dunklem Hintergrund auf Nougat (android.R.layout.simple_spinner_item)
  • 4 Solutions collect form web for “Upload Fortschrittsbalken in Android?”

    Setzen Sie Ihren Upload-Code in die doInBackGround Methode einer AsyncTask . Du kannst dann von dort aus veröffentlichen und in onProgressUpdate die ProgressBar aktualisieren.

    Schauen Sie hier, wie das mit publishProgress aussehen publishProgress .

    Ich glaube, Sie fragen, wie Sie eine numerische Darstellung des aktuellen Upload-Fortschritts erhalten können, damit Sie diesen Wert als Fortschrittsbalken anzeigen können. Mit deinem aktuellen Code bin ich nicht sicher, dass du es leicht kann. Was ist die größte Datei, die Sie zum Hochladen versucht haben? Ich denke, du bekommst einen OutOfMemory Fehler mit großen Dateien. Du machst das:

     byte[] buffer; bufferSize=(int)sourceFile.length(); buffer = new byte[bufferSize]; bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { ... 

    Dein "Puffer" ist nur ein Array, das die gleiche Größe hat wie deine ganze Datei. Der Aufruf von fileInputStream.read() könnte versuchen, den vollständigen Inhalt der Datei in den "Puffer" zu stellen. Wenn deine Datei groß ist (mehr als ein paar Dutzend Megabyte), dann kann deine App mit einem OutOfMemory Fehler OutOfMemory .

    Wenn du einen kleinen Puffer mit einer festen Größe verwende, dann kannst du jedes Mal durch die while Schleife die Datenmenge berechnen, die du bereits gesendet hast, diese in einen prozentualen Wert umwandeln und entweder publishProgess für eine AsyncTask oder sendMessage für einen Handler sendMessage .

    Oder Sie können einen Thread mit einem Handler verwenden, wenn Sie feinere körnige Kontrolle wünschen, aber für die meisten Aufgaben AFAIK AsyncTask sollte funktionieren.

     connection.setFixedLengthStreamingMode((int) requestLength); 

    Hat den Trick für mich!

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.