gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 08:45:11 25 4
gpt4 key购买 nike

我实现了上传文件到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

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

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

cloudinary-android jar 不需要作为 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 构建已成功修改的方式。

现在在服务类中,添加用于云直接上传的代码。您需要将代码放在服务类中,因为您不能在 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 的文件,就会发生一次回调。

一旦它开始工作,您需要将进度信息从服务类传输回您的 Activity 类,以便您可以在屏幕上显示进度。我使用 messageHandler 来执行此操作。这是我的服务类中的消息方法:

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

这是我的 Activity 类中的messageHandler:

public class MessageHandler extends Handler {
@Override
public void handleMessage(final Message message) {
Timber.e("transfer: " + message.arg1);
}
}

关于android - 如何在 Android 上传文件到 Cloudinary 时显示进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29103479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com