- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我实现了上传文件到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。
我是这样修改的:
完成此操作后,进入 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/
我是一名优秀的程序员,十分优秀!