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

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 に答える
1

次のようにアップロードタスクを呼び出す必要があります

new Upload().execute();

そして、あなたがしたように aynTask を呼び出すことによって正しいことをしていません

したがって、コードは次のようになります

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 に答える