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。
这就是我所做的更改:
完成此操作后,进入cloudinary_java的主文件夹,然后进入Terminal。转到并键入
您必须从文件夹中复制
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项目,您会看到
现在在服务类中,添加您的代码以进行云端直接上传。您将需要将代码放入服务类中,因为您无法在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); |
您必须将缓冲区设置为足够大(但不要太大),以确保实际调用了回调。当我第一次尝试该代码时,我将缓冲区设置为非常大的值,例如
一旦运行,您将需要将进度信息从服务类传输回活动类,以便可以在屏幕上显示进度。我使用
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(); } } |
这是我在活动课程上的
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项目(
根据我的拉取请求进行更改。
并根据更改后的签名调用方法uploadLarge。像:
1 | cloudinary.uploader().uploadLarge(UploadCallback : uploadCallback, File : file, Map : options, INT : bufferSize); |
对于缓冲区大小,请确保至少使用5242881。这是cloudinary服务器的限制。最小数据包至少需要为5.001 MB。