我的程序正在从SD卡上传视频而没有任何问题,但我正在尝试添加进度对话框,以显示目前为止上传的字节数百分比。我正在使用异步任务。但是,尽管我能够在屏幕上显示对话框。该对话框未更新。上传完成后,它变为100/100并消失。你能帮我解决一下如何更新进度对话框吗?
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.os.Handler;
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 select =(Button)findViewById(R.id.select);
Button back =(Button)findViewById(R.id.back1);
Button camera =(Button)findViewById(R.id.camera);
//Select a video from SD-Card
select.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View arg0)
{
// TODO Auto-generated method stub
openGaleryVideo();
}
});
//Turn back
back.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View arg0)
{
// TODO Auto-generated method stub
finish();
}
});
//Record a video
camera.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View arg0)
{
// TODO Auto-generated method stub
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);
}
});
}
/** Called when the activity is first created. */
public static final int SELECT_VIDEO=1;
public static final String TAG="UploadActivity";
String path="";
//Open Gallery
public void openGaleryVideo()
{
Intent intent=new Intent();
intent.setType("video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Video"),SELECT_VIDEO);
}
//Select the video and start to execute the upload class
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 upload = new upload();
upload.execute();
}
}
}
//Getting the URİ from the SD Card
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);
}
//ASYNC TASK Upload Class which uploads the file and shows the progress via a dialog
public class upload extends AsyncTask<Object, Integer, Void>
{
//Initializations
public ProgressDialog dialog;
File file=new File(path);
String urlServer = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String filename=file.getName();
int bytesRead, bytesAvailable, bufferSize,progress;
byte[] buffer;
int maxBufferSize = 20*1024*1024;
//Before start to upload the file creating a dialog
@Override
public void onPreExecute()
{
dialog = new ProgressDialog(Proje2Activity.this);
dialog.setMessage("Uploading...");
dialog.setIndeterminate(false);
dialog.setTitle("UPLOADING");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setProgress(0);
dialog.setMax(100);
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.
}
//Uploading the file in background with showing the progress
@Override
public Void doInBackground(Object... arg0)
{
// TODO Auto-generated method stub
try
{
final 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
final 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)
{
progress=0;
progress+=bytesRead;
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
publishProgress((int)((progress*100)/(file.length())));
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
progress+=bytesRead;
}//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
//making an update on progress
@Override
public void onProgressUpdate(Integer... values)
{
super.onProgressUpdate(values);
dialog.setProgress(values[0]);
}//end of onProgressUpdate
//After finishing the progress the dialog will disappear!
@Override
public void onPostExecute(Void result)
{
try
{
dialog.dismiss();
} //End of the second try body
catch(Exception e)
{
}
}//end of onPostExecute method
}// end of asyncTask class
}//end of main
答案 0 :(得分:2)
bufferSize
可以是文件总长度。所以,在一个读取本身中,缓冲区可以是满的。我将其更改为512以在进度条中获得明显的变化progress
变量0
写入bufferSize
)到输出流。不是实际的`bytesRead。在最后部分,您可能会收到错误值。buffer
更新代码
bufferSize = 512;
buffer = new byte[bufferSize];
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
progress=0;
while (bytesRead > 0)
{
progress+=bytesRead;
outputStream.write(buffer, 0, bytesRead);
bytesAvailable = fileInputStream.available();
publishProgress((int)((progress*100)/(file.length())));
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}//end of while statement
fileInputStream.close();
publishProgress(100);
outputStream.flush();
outputStream.close();
答案 1 :(得分:0)
您的循环看起来应该是这样的,代码中存在一些逻辑错误。
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
progress=0;
progress+=bytesRead;
while (bytesRead > 0)
{
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
publishProgress((int)((progress/file.length())*100));
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
progress+=bytesRead;
}//end of while statement
更新:我刚注意到,您使用的是20MB的缓冲区,将maxBufferSize
更改为int maxBufferSize = 1024
,它应该有效。