在Android中将文件上传到Cloudinary时如何显示进度?

How to show progress while upload file to Cloudinary in Android?

我实现了将文件上传到Cloudinary的功能。

1
2
3
4
5
6
7
8
9
10
11
Cloudinary cloudinary = NEW Cloudinary(Constants.CLOUDINARY_URL);
    try {
        FileInputStream is = NEW FileInputStream(NEW File(filePath));
        Uploader uploader = cloudinary.uploader();
        Map map = uploader.upload(is, NEW HashMap());
        RETURN map;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

现在,我想在上传时显示进度条中的上传百分比。
但是我找不到任何回调函数来获取上载百分比。
请帮我。
谢谢。


cprakashagr答案实际上能创造奇迹。只是为了详细说明他的答案,您需要通过执行以下操作从github下载最新的cloudinary库:

1
git clone https://github.com/cloudinary/cloudinary_java.git

然后您将不得不根据他的链接进行更改:

1
https://github.com/cloudinary/cloudinary_java/pull/41

您不能使用Android Studio进行这些更改,因为这是一个Maven项目,因此您需要使用其他IDE,例如IntelliJ。

这就是我所做的更改:

  • 您将需要添加以下类:UploadCallback
  • 您将需要用他的类替换上载器类:https://github.com/cprakashagr/cloudinary_java/blob/master/cloudinary-core/src/main/java/com/cloudinary/Uploader.java
  • 完成此操作后,进入cloudinary_java的主文件夹,然后进入Terminal。转到并键入mvn install,然后按Enter。您将看到mvn将为目录中的不同文件夹构建jar。构建完成后,例如,如果导航到cloudinary-core文件夹,则会看到cloudinary-core jar。

    您必须从文件夹中复制cloudinary-core jar,并将其添加到android项目根目录中的android项目" libs"文件夹中。完成操作并显示在其中后,右键单击Android Studios中的jar,然后单击"Add as Library",以便android studio将其添加为依赖项。

    cloudinary-android jar不需要作为jar添加,因为您可以从gradle中获取副本。您的最终gradle文件应如下所示:

    1
    2
    3
    4
    COMPILE('com.cloudinary:cloudinary-android:1.2.2') {
            exclude module: 'cloudinary-core'
        }
        COMPILE files('/Users/XXX/Documents/myApp/libs/cloudinary-core-1.4.2-SNAPSHOT.jar')

    重建您的android studio项目,您会看到UploadCallback现在是可以在android项目中使用的对象。这就是您知道您的jar构建已成功修改的方式。

    现在在服务类中,添加您的代码以进行云端直接上传。您将需要将代码放入服务类中,因为您无法在UI线程上执行网络操作,并且如果尝试将得到错误:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        Map config = NEW HashMap();
        config.put("cloud_name","XXX");
        Cloudinary mobileCloudinary = NEW Cloudinary(config);
        Map map = null;
        try {
            map = mobileCloudinary.uploader()
                    .uploadLarge(this,
                            intent.getSerializableExtra(getString(R.string.file)),
                            ObjectUtils.asMap("public_id", 123),
                                   "tags","myphoto",
                                   "folder","mylibrary",
                                   "unsigned", TRUE,
                                   "upload_preset","XXX"),
                            51200);

        } catch (IOException e) {
            e.printStackTrace();
        }
        STRING imageUrl = map.get("url").toString();
        Timber.e("imageUrl" + imageUrl);

    您必须将缓冲区设置为足够大(但不要太大),以确保实际调用了回调。当我第一次尝试该代码时,我将缓冲区设置为非常大的值,例如200000000,并且未调用回调,因为上传将一次性完成。如果将其设置为较小的值(例如2048),则将定期调用回调,但是,上载会变得很慢。您可以自行决定合适的大小,以适合您的应用。对我来说,这是51200,这意味着每上传50kb的文件,就会发生回调。

    一旦运行,您将需要将进度信息从服务类传输回活动类,以便可以在屏幕上显示进度。我使用messageHandler来做到这一点。这是我的服务类中的消息方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void sendMessage(float PROGRESS) {
        MESSAGE MESSAGE = MESSAGE.obtain();
        MESSAGE.arg1 = Math.round(PROGRESS);
        try {
            messageHandler.send(MESSAGE);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    这是我在活动课程上的messageHandler

    1
    2
    3
    4
    5
    6
    public CLASS MessageHandler extends HANDLER {
        @Override
        public void handleMessage(final MESSAGE MESSAGE) {
            Timber.e("transfer:" + MESSAGE.arg1);
        }
    }

    该回调尚未从cloudinary团队实施。尽管周围的工作很少。

    检查此链接。

    您需要从cloudinary源导入或构建新的JAR。为此,您可以使用此存储库,也可以对其原始存储库进行必要的更改。

    如果您有任何疑问,请告诉我。

    编辑:关于如何使用它

    将这两个cloudinary源导入到您的Android项目(src/java目录)中:

  • Cloudinary核心库源
  • Cloudinary Android库源代码
  • 根据我的拉取请求进行更改。

    并根据更改后的签名调用方法uploadLarge。像:

    1
    cloudinary.uploader().uploadLarge(UploadCallback : uploadCallback, File : file, Map : options, INT : bufferSize);

    对于缓冲区大小,请确保至少使用5242881。这是cloudinary服务器的限制。最小数据包至少需要为5.001 MB。