I made a program which uploads a video to an asp.net server. Then I want to develop my application by adding a progress bar. However, after adding the progress bar I am not able to upload the file to the server.( this is the result that I get after debugging!!!) Could you please help me what is wrong with my code?
package com.isoft.uploader2;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class Proje2Activity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button =(Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
openGaleryVideo();
}
});
}
/** Called when the activity is first created. */
public static final int SELECT_VIDEO=1;
public static final String TAG="UploadActivity";
String path="";
//Gallery'i aç
public void openGaleryVideo()
{
Intent intent=new Intent();
intent.setType("video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Video"),SELECT_VIDEO);
}
//Dosyayı seç ve yükle
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
{
if (requestCode == SELECT_VIDEO)
{
Uri videoUri = data.getData();
path= getPath(videoUri);
upload a = new upload();
a.onPreExecute();
a.doInBackground();
a.onProgressUpdate();
}
}
}
//SD carddan yerini al
public String getPath(Uri uri)
{
String[] projection = { MediaStore.Video.Media.DATA};
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
public class upload extends AsyncTask<Object, Integer, Void>
{
public ProgressDialog dialog;
File file=new File(path);
String urlServer = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String filename=file.getName();
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 20*1024*1024;
@Override
public void onPreExecute()
{
dialog = new ProgressDialog(Proje2Activity.this);
dialog.setMessage("Uploading...");
dialog.setIndeterminate(false);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setProgress(0);
dialog.show();
//Burada işlemi yapmadan önce ilk olarak ne yaptırmak istiyorsak burada yaparız.
//Örneğin burada dialog gösterip "onPostExecute()" metodunda dismiss edebiliriz.
}
@Override
public Void doInBackground(Object... arg0)
{
// TODO Auto-generated method stub
try
{
FileInputStream fileInputStream = new FileInputStream(file);
URL url = new URL(urlServer);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setFixedLengthStreamingMode((int) file.length());
// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Enable POST method
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data");
connection.setRequestProperty("SD-FileName", filename);//This will be the file name
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
publishProgress();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}//end of while statement
fileInputStream.close();
publishProgress(100);
outputStream.flush();
outputStream.close();
}//end of try body
catch (Exception ex)
{
//ex.printStackTrace();
Log.e("Error: ", ex.getMessage());
}
return null;
}//end of doInBackground method
@Override
public void onProgressUpdate(Integer... values)
{
// TODO Auto-generated method stub
dialog.setProgress((int) ((file.length()-bytesRead)/100));
}//end of onProgressUpdate method
}// end of asyncTask class
}//end of main
You have to call the upload task like
and you are not doing the right by calling asynTask like the way you did
So you code just looks like the following
Instead of
And if your code to upload the file is correct , this will work
and if you want to update the progress bar use Handler class
as described in ProgressBar widget
And inside the doInBackground() method invoke the method publishProgress() as described here AsyncTask Docs