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

2023-12-31

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

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 库:

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

然后你必须根据他的链接进行更改:

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

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

这就是我进行更改的方式:

  1. 您需要添加类:UploadCallback
  2. 您需要将 Uploader 类替换为他的类:https://github.com/cprakashagr/cloudinary_java/blob/master/cloudinary-core/src/main/java/com/cloudinary/Uploader.java https://github.com/cprakashagr/cloudinary_java/blob/master/cloudinary-core/src/main/java/com/cloudinary/Uploader.java

完成此操作后,进入 cloudinary_java 的主文件夹,然后进入终端。去输入mvn install并按回车键。您将看到 mvn 将为目录中的不同文件夹构建 jar。构建完成后,如果您导航到cloudinary-core例如,您将看到文件夹cloudinary-core jar.

您必须复制cloudinary-core从文件夹中提取 jar 并将其添加到 Android 项目根目录中的“libs”文件夹中。完成后,它会出现在那里,右键单击 Android Studios 中的 jar,然后单击"Add as Library"这样 Android Studio 就会将其添加为依赖项。

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

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 构建已成功修改的方式。

现在,在服务类中,添加用于 cloudinary 直接上传的代码。您需要将代码放入服务类中,因为您无法在 UI 线程上执行网络操作,并且如果您尝试以下操作,将会收到错误消息:

    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这样做。这是我的服务类中的消息方法:

public void sendMessage(float progress) {
    Message message = Message.obtain();
    message.arg1 = Math.round(progress);
    try {
        messageHandler.send(message);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

这是我的messageHandler在我的活动课上:

public class MessageHandler extends Handler {
    @Override
    public void handleMessage(final Message message) {
        Timber.e("transfer: " + message.arg1);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Android - 如何一次只允许播放一个 MediaPlayer 实例?

    我正在尝试创建一个简单的 Sound board Android 应用程序 使用 ListView 项目作为按钮 顺便说一句 我是一个新手程序员 我的想法是 我按下一个按钮 就会播放一个特定的声音文件 如果我在播放声音时按下任何按钮 它应该
  • 如何更新 Firebase 中的节点密钥?

    如何重命名14 04 2017 node 没有用于重命名节点的 API 您必须获取节点的值 使用新名称将其保存到数据库并删除旧节点
  • 为什么将函数参数声明为最终的?

    我目前正在阅读 Sams 出版的 24 小时自学 Android 应用程序开发 一书 我对 Java Android 或其他方面还比较陌生 我对 ActionScript 3 有非常扎实的背景 它与 Java 有足够的相似之处 因此该语言本
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 在 Google Analytics 中跟踪应用程序版本

    我正在使用谷歌分析模块 https marketplace appcelerator com apps 5081 2014113336 https marketplace appcelerator com apps 5081 2014113
  • 在意图过滤器中使用多个操作时的默认值

    尝试理解 Android 中的意图和操作并查看文档 http developer android com guide topics intents intents filters html 但我一直看到的一件事是定义了多个操作的意图过滤器
  • 已经使用 AsyncTask doInBackground 但新数据未显示

    我使用 AsyncTask 创建一个聊天室来接收消息 因此它总是检查即将到来的消息并将其显示给客户端 但代码似乎无法按我希望的方式工作 在客户端只显示所有旧数据 新数据不显示 因为当我尝试从服务器发送消息时 新数据没有显示在客户端中 我对这
  • Android 原理图内容提供程序库配置?

    Jake Wharton 在最近的一次演讲中提到了这个库 它看起来是避免大量样板文件的好方法 所以我尝试了一下 但没有任何成功 https github com SimonVT schematic https github com Simo
  • 获取 AlarmManager 中活动的 PendingIntents 列表

    我有办法获取活动列表PendingIntent在设备中 我开始工作AlarmManager我想看看我的PendingIntents 已正确创建和删除 也很高兴看到其他什么PendingIntent在那里 只是为了看看某些应用程序是否正在做一
  • 应用程序未安装在 Android 模拟器上

    我正在 android Geocoder 中开发一个应用程序 当我运行该应用程序时 它会显示 2011 01 11 11 08 13 GeoTourProject 自动目标模式 使用现有模拟器 emulator 5554 运行兼容的 AVD
  • Android相机意图:如何获取全尺寸照片?

    我正在使用意图来启动相机 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE CAPTURE getParent startActivityForR
  • Android Studio:无法启动守护进程

    当我尝试在 Android Studio 中导入 gradle 项目时 遇到以下错误 Unable to start the daemon process This problem might be caused by incorrect
  • 如何在不更改手机语言的情况下更改Android应用程序语言?

    我希望用户在应用程序内选择一种语言 选择语言后 我希望字符串使用特定语言 如果我更改手机语言 那么我的应用程序将以设置的语言运行 我无法找到任何在不更改手机语言的情况下设置语言的方法 此外 一旦设置了语言 更改就应该反映出来 有人可以建议一
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • 如何删除因 Google Fitness API 7.5.0 添加的权限

    将我的 play services fitness api 从 7 0 0 更新到 7 5 0 后 我注意到当我将新版本上传到 PlayStore 时 它 告诉我正在添加一个新权限和 2 个新功能 我没有这样做 有没有搞错 在做了一些研究来

随机推荐

  • 除非已通过 Windows 资源管理器打开,否则无法打开共享点 UNC 路径

    我希望有人能阐明这一点 因为它一直让我分心 我有一个脚本 如果该路径存在 它将通过 UNC 路径将其创建的报告保存到共享点文档库 否则它将保存到网络驱动器位置的 UNC 路径作为后备 我注意到检查test path 保存 通过 msexce
  • 未找到 XML 扩展

    我有 centos 6 5 服务器 当我尝试使用安装 php 扩展时pecl我收到以下错误 XML Extension not found 所有文档都说默认包含此扩展 为什么此错误仍然存 在 根据php net 上的评论 https sec
  • JUnit 测试:如何使用 try-catch 块检查错误

    因此 我需要为我正在改进的一些 遗留 代码编写测试 在一个方法中 我尝试解析一些字符串 应该是合法的 JSON 那么一个可能的JSONException如果字符串不代表有效的 JSON 则会捕获该错误 就像是 public void tra
  • 使用 Python 读取元数据

    在过去的两天里 我一直在浏览互联网 试图找到解决我的问题的方法 我有一个包含不同文件的文件夹 他们运行文件类型的策略 我正在尝试编写一个 python 脚本 该脚本将从每个文件中读取元数据 如果存在 目的是最终将数据输出到文件中 以便与另一
  • 联合身份验证后,重定向到最初请求的 url

    我们使用 ThinkTecture 服务器设置了联合安全性 当用户希望访问特定 URL 时 他们会被重定向到身份提供商服务器 IDP 然后登录并获得身份验证 然后 IDP 服务器会将用户重定向回该依赖方配置中指定的 重定向 URL 相反 我
  • 在 SQL 中查询 GeoLite2 国家/地区 CSV

    有谁知道如何使用 SQL 从 MaxMind 的 GeoLite2 Country CSV 查找 IP4 地址 我已经使用 MaxMind 的免费 G eoIP 数据很多年了 并且想升级到他们的 GeoLite2 数据 我已将块和位置数据加
  • 笔记本验证失败 Jupyter

    这不是重复的笔记本验证失败 https stackoverflow com questions 61453312 notebook validation failed I have a Jupyter ntb which was worki
  • 如何开发、构建和部署多个基于 OSGi 的 Web 应用程序

    我正在寻找一种方法来开发 构建和部署多个基于 OSGi 的 Web 应用程序 一些 RAP 首先 我使用从以下位置克隆的 RAP 示例 https github com eclipse rap git https github com ec
  • 如何在ES中使用数组映射?

    我想创建一个映射movies看起来像 title The Artist genres Drama Comedy In the ElasticSearch 文档 https www elastic co guide en elasticsea
  • Rust 中的指针和引用有什么区别?

    一个指针 和一个参考 在 Rust 中共享相同的表示 它们都表示一段数据的内存地址 编写代码时有什么实际差异 将 C 代码移植到 Rust 时 是否可以安全地替换它们 C 指针 gt rust 指针 C 引用 gt rust 引用 可以时使
  • GDB使用什么信号来实现tracee和tracer之间的控制传递

    通过控制转移 我的意思是 在tracee执行函数并返回后 会生成哪个信号以便GDB可以在其上等待 并再次夺取控制权 尽管很多人声称这不是 SIGTRAP 在tracee执行函数并返回后 会生成哪个信号以便GDB可以在其上wait 并再次夺取
  • C#中的无锁会话有哪些?

    我了解 C 中的会话以及如何定义它们 但今天我听到一个词Lock free session 我用谷歌搜索但没有得到任何与我的问题完全匹配的答案 谁能解释一下 C 中的无锁会话以及如何为它们编写代码 以下是一些内容来自msdn http ms
  • 如何使动态创建的div可编辑

    我要实现div创建的可编辑动态地 这也是可拖动的 div 这就是我尝试过的 1 divid attr contentEditable true 2 divid live click function this click contentEd
  • 获取 glFrustum 的坐标

    我刚刚开始阅读有关OpenGL主题 特别是关于Viewing http glprogramming com red chapter03 html以满足我目前的需求 我试图理解glFrustum根据我的理解 对我在屏幕上绘制的对象进行透视投影
  • 从 JVM 上的堆栈帧获取局部变量

    有没有办法在不使用调试器的情况下在 JVM 上获取当前范围内的局部变量的映射或其他数据结构 即获取当前栈帧的局部变量 我知道有堆栈跟踪对象 但是StackTraceElement无法访问任何状态 它只是告诉您在哪里调用了什么方法 但不告诉您
  • 无法设置 Content-Type 标头

    我在 HttpClient 上设置 Content Type 时遇到问题 我沿着这个问题 如何为 HttpClient 请求设置 Content Type 标头 https stackoverflow com questions 10679
  • 计算机编程艺术中approximateEqual和essentialEqual的区别

    我从其他地方得到这个代码片段 据站长介绍 代码摘自 由于我没有那本书 请问这两个函数有什么区别 bool approximatelyEqual float a float b float epsilon return fabs a b lt
  • C# 接口和 Haskell 类型类之间的区别

    我知道这里有一个类似的问题 但我想看一个例子 它清楚地表明 你不能做什么interface并且可以使用 Type Class 为了进行比较 我给你一个示例代码 class Eq a where a gt a gt Bool instance
  • 如何在Python中使用pdfminer从在线PDF中提取文本

    我想使用 pdfminer 使用下面的代码从在线 PDF 中提取文本 它没有显示错误 但输出什么也没有 from pdfminer pdfpage import PDFPage from urllib import request from
  • 如何在 Android 中将文件上传到 Cloudinary 时显示进度?

    我实现了将文件上传到Cloudinary的功能 Cloudinary cloudinary new Cloudinary Constants CLOUDINARY URL try FileInputStream is new FileInp