Я использую AWS S3 для хранения моего приложения для Android. Ранее я настроил S3 Bucket с CloudFront, и все идет хорошо.
Затем в мой список добавляется новая задача для потоковой передачи видео через CloudFront. Я искал по Интернету и не нашел SDK для Android, но один, то есть Amplify Android SDK. Я прочитал дальше и узнал, что это последний подход, которому Amazon рекомендует следовать.
Не долго думая, я начал настраивать клиентскую систему. Я успешно настроил функцию Cli и Writing для загрузки и выгрузки следующим образом:
private val s3Client by lazy {
AmazonS3Client(
AWSMobileClient.getInstance(),
Region.getRegion(Regions.AP_SOUTH_1)
)
}
private val transferUtility by lazy {
TransferUtility.builder()
.context(applicationContext)
.awsConfiguration(AWSMobileClient.getInstance().configuration)
.s3Client(s3Client)
.build()
}
private val sampleKey = "public/a.jpg"
private val testUploadFilePath = "Pictures/a.jpg"
private val testDownloadFilePath = "Pictures/a-downloaded.jpg"
fun onUpload(v: View) {
val file = File(Environment.getExternalStorageDirectory(), testUploadFilePath)
val uploadObserver = transferUtility.upload(sampleKey, file)
// Attach a listener to the observer to get state update and progress notifications
uploadObserver.setTransferListener(object : TransferListener {
override fun onStateChanged(id: Int, state: TransferState) {
Log.d(tag, "onStateChanged: $id, $state")
}
override fun onProgressChanged(id: Int, bytesCurrent: Long, bytesTotal: Long) {
val percent = ((bytesCurrent.toFloat() / bytesTotal.toFloat()) * 100).toInt()
Log.d(tag, "onProgressChanged: $percent% uploaded")
}
override fun onError(id: Int, ex: Exception) {
Log.d(tag, "onError: $id, ${ex.message}")
}
})
}
fun onDownload(view: View) {
val file = File(Environment.getExternalStorageDirectory(), testDownloadFilePath)
val downloadObserver = transferUtility.download(sampleKey, file)
// Attach a listener to the observer to get state update and progress notifications
downloadObserver.setTransferListener(object : TransferListener {
override fun onStateChanged(id: Int, state: TransferState) {
Log.d(tag, "onStateChanged: $id, $state")
if (state == TransferState.COMPLETED) {
val bmp = BitmapFactory.decodeFile(file.absolutePath)
runOnUiThread {
imageView.setImageBitmap(bmp)
}
}
}
override fun onProgressChanged(id: Int, bytesCurrent: Long, bytesTotal: Long) {
val percent = ((bytesCurrent.toFloat() / bytesTotal.toFloat()) * 100).toInt()
Log.d(tag, "onProgressChanged: $percent% uploaded")
}
override fun onError(id: Int, ex: Exception) {
Log.d(tag, "onError: $id, ${ex.message}")
}
})
}
Я впервые использую Amazon. Итак, я запутался в нескольких вещах:
- Может ли Amplify cli настраивать операции загрузки и выгрузки через CloudFront?
- Я не получил никакой информации об этом. Я чувствую, что оба способа общения с ведром S3 разные. Пожалуйста, добавьте немного света сюда.
- Как транслировать видео (т.е. храниться в корзине S3) на устройства Android?
- Есть ли у Amplify cli простая команда для настройки этого?
- Если нет, пожалуйста, кратко расскажите, как мне этого добиться?