2

我制作了一个将视频上传到 asp.net 服务器的程序。然后我想通过添加进度条来开发我的应用程序。但是,添加进度条后,我无法将文件上传到服务器。(这是我调试后得到的结果!!!)你能帮我看看我的代码有什么问题吗?

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
4

2 回答 2

1

你必须调用上传任务

new Upload().execute();

并且您没有像以前那样调用 asynTask 来做正确的事

因此,您的代码如下所示

Upload a = new Upload();
a.execute 

代替

upload a = new upload();
            a.onPreExecute();
            a.doInBackground();
            a.onProgressUpdate();

如果您上传文件的代码是正确的,这将起作用

如果要更新进度条,请使用 Handler 类

Handler handler = new Handler(){
    @Override 
    public void handleMessage(int what){
        mProgress.setProgress(mProgressStatus);
     }

ProgressBar 小部件中所述

并在 doInBackground() 方法中调用方法 publishProgress() ,如此处所述AsyncTask Docs

于 2012-07-03T14:37:38.530 回答
1

正如 Muhannad 所说,您的 onActivityResult 方法应如下所示:

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.execute();


    }
}

}

编辑: 正如我的评论中所解释的。粗体的变化:

public class upload extends AsyncTask<Object, Integer, Void> {
 public ProgressDialog dialog;
 File file=new File(path);  
 String urlServer = "http://192.168.10.177/androidweb/default.aspx";
 String filename=file.getName();
 int bytesRead, bytesAvailable, bufferSize, **progress**;
 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
    **progress = 0;**
    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
    **progress += bytesRead;**
    while (bytesRead > 0)
    {   
        outputStream.write(buffer, 0, bufferSize);
        bytesAvailable = fileInputStream.available();
        publishProgress();
        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
 @Override
 public void onProgressUpdate(Integer... values) 
 {
   // TODO Auto-generated method stub
   dialog.setProgress((int) ((file.length()-**progress**)/100));
 }//end of onProgressUpdate method
 }// end of asyncTask class 
 }//end of main
于 2012-07-03T14:53:25.603 回答