安卓上传多张带有进度条的图片,显示进度 1/5,2/5等等?

3
在一次上传多张图片时,我希望能够显示进度条,并在状态栏通知区域显示信息1/5、2/5等进度条。其中1表示已上传的图片数量,5表示需要上传的总图片数量。
我已经能够在通知区域显示进度条了。请问有谁能建议我如何计算已上传(完成)的图片数量以显示在进度条中(如1/5更新)。提前感谢您的帮助。
为了更清楚地说明问题:
我有一个异步任务,用于将单个图像上传到服务器。但是我无法做到以下两点:
1> 计算出总共需要上传的图像大小(例如5张图像);
2> 如何找到在5张图像中已上传的图像数量。
private class FileUploadTask extends AsyncTask<Object, Integer,String> {

    private ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(context);
        dialog.setMessage("Uploading...");
        dialog.setIndeterminate(false);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setProgress(0);
        dialog.show();
    }

    @Override
    protected String doInBackground(Object... arg0) {
        try {
            File file = new File("/mnt/sdcard/DCIM/100MEDIA/IMAG0149.jpg");
            FileInputStream fileInputStream = new FileInputStream(file);
            byte[] bytes = new byte[(int) file.length()];
            fileInputStream.read(bytes);
            fileInputStream.close();

            URL url = new URL("http://android.com.bd/form.php");
            HttpURLConnection connection = 
                    (HttpURLConnection) url.openConnection();
            OutputStream outputStream = connection.getOutputStream();

            int bufferLength = 1024;
            for (int i = 0; i < bytes.length; i += bufferLength) {
                int progress = (int)((i / (float) bytes.length) * 100);
                Log.i("progress",progress+"dfdf");
                publishProgress(progress);
                if (bytes.length - i >= bufferLength) {
                    outputStream.write(bytes, i, bufferLength);
                } else {
                    outputStream.write(bytes, i, bytes.length - i);
                }
            }
            publishProgress(100);

            outputStream.close();
            outputStream.flush();

            InputStream inputStream = connection.getInputStream();
            // read the response
            inputStream.close();
            return "ok";

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        dialog.setProgress(progress[0]);
    }

    @Override
    protected void onPostExecute(String result) {
        Log.v("sds", result);
        try {
            dialog.dismiss();
        } catch(Exception e) {
        }

    }

}

尝试这个,希望有所帮助:https://dev59.com/l3A75IYBdhLWcg3w7tx6#3028660 - Deepak Swami
3个回答

4
看看这篇简短易懂的博客文章/教程。你应该能够做类似的事情。您将需要使用 ProgressDialog,在使用 ASyncTask 更新其状态。如果您已经在为图像上传使用 ASyncTask,则已经有了就绪的部分。

http://toolongdidntread.com/android/android-multipart-post-with-progress-bar/

还要看一下这个SO问题 - 在Android上下载文件,并在ProgressDialog中显示进度。你的问题以前已经得到了回答。你只需要根据自己的需求调整解决方案,通过自定义onProgressUpdate来显示1/5、2/5等进度条。我没有测试过这段代码,但我想类似以下的代码将允许你按照你想要的方式逐步显示进度。

    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        if (progress[0] < 20) {            
            mProgressDialog.setProgress(0);
        } else if (progress[0] < 40) {            
            mProgressDialog.setProgress(20);
        }
        else if (progress[0] < 60) {            
            mProgressDialog.setProgress(40);
        }
        else if (progress[0] < 80) {            
            mProgressDialog.setProgress(60);
        }
        else if (progress[0] < 100) {            
            mProgressDialog.setProgress(80);
        }
        else if (progress[0] == 100) {            
            mProgressDialog.setProgress(100);
        }
    }

就是说,页面是否加载或代码示例是否有效?对我来说两者都有效。 - Kyle Clegg
谢谢@Kyle,第二个链接非常有用,但不是解决方案。是的,我能够上传单个图像到服务器并进行进度更新,但我不知道如何同时上传多个图像。 - Krishna Shrestha
+1 了解情况。你能建议一下如何上传多张图片吗? - Krishna Shrestha
我不确定如何同时上传多个图像,但我建议按顺序逐个上传。例如,您可以在onReceiveResult或onPostExecute中触发下一个上传,并继续进行,直到所有图像都已上传。您需要重构进度对话框以处理此操作,以便您不会为每个上传获取新的进度对话框。 - Kyle Clegg

0

你的图片在哪里?你必须像这样做

File fav = new File(Environment.getExternalStorageDirectory().getPath());
File[] filesav = fav.listFiles();
for (int i = 0; i < filesav.length; i++) {
        inside you send your pictures and count 

}

变量i是您的图像编号,而filesav.length是您的总图像数量


-1

嗯,这真的取决于您如何下载图像?

我的建议是创建一个某个DownloadManager类的实例(单例),它将计算和管理已启动和完成的下载数量。此实例将用于创建新的下载,并在每次下载完成时通知。当收到通知时,它可以更新进度条。

但这是一个非常通用的答案。如果没有更多关于您当前如何进行下载的信息(它们是否在单独的线程中完成?它们是顺序还是并行的?...),我无法做得更好。


我在谈论上传图片。当然,在Android中有下载管理器类来处理它。@Orabig - Krishna Shrestha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接