Как настроить Amazon CloudFront с CLI Amplify для потоковой передачи видео из корзины S3 на устройства Android? - PullRequest
0 голосов
/ 03 ноября 2019

Я использую 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. Итак, я запутался в нескольких вещах:

  1. Может ли Amplify cli настраивать операции загрузки и выгрузки через CloudFront?
    • Я не получил никакой информации об этом. Я чувствую, что оба способа общения с ведром S3 разные. Пожалуйста, добавьте немного света сюда.
  2. Как транслировать видео (т.е. храниться в корзине S3) на устройства Android?
    • Есть ли у Amplify cli простая команда для настройки этого?
    • Если нет, пожалуйста, кратко расскажите, как мне этого добиться?
...