我通过从图库中选择图像或使用Android相机捕获图像来将图像上传到Web服务器。
我需要在通知栏中显示进度。我看到Facebook应用就是这么做的。有没有办法找出上传了多少?
我将图像上传到服务器的代码是:
public void uploadImage() {
final Toast toast = Toast.makeText(this, "Image uploaded successfully",
Toast.LENGTH_SHORT);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Upload");
builder.setMessage("Do you want to upload the captured picture?");
builder.setIcon(R.drawable.icon);
builder.setCancelable(false);
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
testWebService(Bitmap bmp)
finish();
toast.show();
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
public void testWebService(Bitmap bmp) {
MarshalBase64 marshal = new MarshalBase64();
ByteArrayOutputStream out = new ByteArrayOutputStream();
bmp.compress(CompressFormat.PNG, 100, out);
byte[] raw = out.toByteArray();
SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
OPERATION_NAME);
request.addProperty("image", raw);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
marshal.register(envelope);
HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
try
{
httpTransport.call(SOAP_ACTION, envelope);
Object response = envelope.getResponse();
}
catch (Exception exception)
{
exception.printStackTrace();
}
}
有没有办法找出上传了多少?
答案 0 :(得分:3)
这是一个很有用的链接:http://developer.android.com/guide/topics/ui/notifiers/notifications.html#CustomExpandedView
现在在您的自定义布局中使用进度条。
此代码用于跟踪下载。因此,您可以检查上传状态,在服务中启动此异步任务以相应地上载和更新进度条
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
答案 1 :(得分:2)
我不熟悉您用来进行SOAP调用的类,但使用Apache Commons HttpClient完成上传进程的一种常用方法是提供自己的FilterOutputStream子类,它只是对指定的侦听器进行回调每次读出部分流。您只需要覆盖write()方法:
@Override
public void write(byte[] b, int off, int len) throws IOException {
out.write(b, off, len);
transferred += len;
progressHandler.handleProgress(ProgressDirection.Send, len, transferred, expectedLength);
}
@Override
public void write(int b) throws IOException {
out.write(b);
progressHandler.handleProgress(ProgressDirection.Send, 1, ++transferred, expectedLength);
}
当然,如果您的HTTP库允许您将HTTP请求的整个主体(或至少很大一部分)作为OutputStream提供,那么您只能使用此方法。