Android 复制文件时显示进度百分比

Android 复制文件时显示进度百分比,android,android-asynctask,android-progressbar,Android,Android Asynctask,Android Progressbar,当前 我正在从库中拾取一个文件并将其复制到指定的文件夹。复制时,我会显示一个ProgressDialog,这是通过AsyncTask实现的 我试图用百分比显示正在复制的文件的进度,但我遇到的问题是,进度显示为50%,并保持在50%,直到文件复制完成 关于这一点有很多问题,但都与从URL下载有关 我的问题 如何获取正在复制的文件的当前进度并将其显示为百分比 请看下面我尝试的内容: @Override protected void onActivityResult(int requestCode

当前

我正在从库中拾取一个文件并将其复制到指定的文件夹。复制时,我会显示一个
ProgressDialog
,这是通过
AsyncTask
实现的

我试图用百分比显示正在复制的文件的进度,但我遇到的问题是,进度显示为50%,并保持在50%,直到文件复制完成

关于这一点有很多问题,但都与从
URL
下载有关


我的问题

如何获取正在复制的文件的当前进度并将其显示为百分比


请看下面我尝试的内容:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(requestCode == SELECT_VIDEO_REQUEST && resultCode == RESULT_OK)
    {
        if(data.getData()!=null)
        {
            new MyCopyTask().execute(data.getData());

    }else{

        Toast.makeText(getApplicationContext(), "Failed to select video" , Toast.LENGTH_LONG).show();

        }
    }
}

private class MyCopyTask extends AsyncTask<Uri, Integer, File> {
    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
        progressDialog = new ProgressDialog(MainActivity.this);
        progressDialog.setCancelable(false);
        progressDialog.setIndeterminate(false);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMax(100);
        progressDialog.show();
    }


    @Override
    protected File doInBackground(Uri... params) {
        //copy file to new folder
        Uri selectedImageUri = params[0];
        String sourcePath = getRealPathFromURI(selectedImageUri);

        File source = new File(sourcePath);



        String filename = sourcePath.substring(sourcePath.lastIndexOf("/")+1);

        //onProgressUpdate(50);

        publishProgress(50);

        File destination = new File(Environment.getExternalStorageDirectory(), "MyFolder/Videos/"+filename);
        try
        {
            FileUtils.copyFile(source, destination);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return destination;
    }

    @Override
    protected void onProgressUpdate(Integer... values){
        super.onProgressUpdate(values);
        progressDialog.setProgress(values[0]);
    }


    @Override
    protected void onPostExecute(File result) {
        if(result.exists()) {
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(result)));

            Toast.makeText(getApplicationContext(),"Stored at:  "+"---"+result.getParent()+"----"+"with name:   "+result.getName(), Toast.LENGTH_LONG).show();
            progressDialog.dismiss();


        } else {
            Toast.makeText(getApplicationContext(),"File could not be copied", Toast.LENGTH_LONG).show();
            progressDialog.dismiss();
        }

    }



}
@覆盖
受保护的void onActivityResult(int请求代码、int结果代码、意图数据)
{
if(requestCode==选择\u视频\u请求和&resultCode==结果\u确定)
{
if(data.getData()!=null)
{
新建MyCopyTask().execute(data.getData());
}否则{
Toast.makeText(getApplicationContext(),“未能选择视频”,Toast.LENGTH_LONG.show();
}
}
}
私有类MyCopyTask扩展了异步任务{
进行对话进行对话;
@凌驾
受保护的void onPreExecute(){
progressDialog=新建progressDialog(MainActivity.this);
progressDialog.setCancelable(假);
progressDialog.setUndeterminate(false);
progressDialog.setProgressStyle(progressDialog.STYLE_水平);
progressDialog.setMax(100);
progressDialog.show();
}
@凌驾
受保护的文件doInBackground(Uri…参数){
//将文件复制到新文件夹
Uri selectedImageUri=params[0];
字符串sourcePath=getRealPathFromURI(selectedImageUri);
文件源=新文件(源路径);
字符串文件名=sourcePath.substring(sourcePath.lastIndexOf(“/”)+1);
//最新进展(50);
出版进度(50);
文件目的地=新文件(Environment.getExternalStorageDirectory(),“MyFolder/Videos/”+文件名);
尝试
{
FileUtils.copyFile(源、目标);
}
捕获(IOE异常)
{
e、 printStackTrace();
}
返回目的地;
}
@凌驾
受保护的void onProgressUpdate(整型…值){
super.onProgressUpdate(值);
progressDialog.setProgress(值[0]);
}
@凌驾
受保护的void onPostExecute(文件结果){
if(result.exists()){
sendBroadcast(新意图(Intent.ACTION\u MEDIA\u SCANNER\u SCAN\u文件,Uri.fromFile(result));
Toast.makeText(getApplicationContext(),”存储在:“+”--“+result.getParent()+”--“+”,名称为:“+result.getName(),Toast.LENGTH_LONG).show();
progressDialog.disclose();
}否则{
Toast.makeText(getApplicationContext(),“无法复制文件”,Toast.LENGTH_LONG.show();
progressDialog.disclose();
}
}
}

错误正在发布(50); 您必须发布每个百分比的进度 这样地 出版进度(一);
i++

手动复制并以百分比更新进度:

InputStream in = new FileInputStream(source);
OutputStream out = new FileOutputStream(destination);

long lenghtOfFile = source.length();
byte[] buf = new byte[512];
int len;
long total;
while ((len = in.read(buf)) != -1) {
  total += len;

  publishProgress((int)((total*100)/lenghtOfFile));
  out.write(buf, 0, len);
}

in.close();
out.close();

i++
从未被使用请看这个问题这只是显示从1到100的进度,它与正在复制的文件不同步。请您更具体一点,也许显示我如何在我的代码中实现它?而不是
FileUtils.copyFile(源、目标)使用我答案的代码。不要忘记删除
publishProgress(50)。我在
lenght()
处收到一个错误--
无法解析lenght()
这只是一个键入错误。。。将其更新为
length()