Как преобразовать строку base 64 в растровое изображение в Android с помощью kotlin?

#android #kotlin

#Android #kotlin

Вопрос:

Согласно моему требованию, из ответа API я получаю строку base 64. Мне нужно преобразовать это в растровое изображение в kotlin Android. Итак, для этого, просмотрев несколько примеров в stackoverflow и Google, я попробовал следующий способ:

     Code:
    
       class LoginActivity : AppCompatActivity(), LogInHandler {

    private lateinit var viewModel: LogInViewModel
private lateinit var imageVieww : ImageView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
imageVieww = findViewById<ImageView>(R.id.imageVieww)
        // Binding
        val binding = DataBindingUtil.setContentView<ActivityLoginBinding>(this, R.layout.activity_login)
        // ViewModel
        this.viewModel = ViewModelProvider(this).get(LogInViewModel::class.java)
        // Setting binding params
        binding.viewModel = viewModel
        binding.handler = this
        // Watching for login result
        viewModel.getLogInResult().observe(this, Observer { result ->
            Toast.makeText(this, result, Toast.LENGTH_SHORT).show()
        })

        var imageBinary = "R0lGODlhPQBEAPeoAJosM//AwO/AwHVYZ/z595kzAP/s7P goOXMv8 fhw/v739/f 8PD98fH/8mJl fn/9ZWb8/PzWlwv///6wWGbImAPgTEMImIN9gUFCEm/gDALULDN8PAD6atYdCTX9gUNKlj8wZAKUsAOzZz UMAOsJAP/Z2ccMDA8PD/95eX5NWvsJCOVNQPtfX/8zM8 QePLl38MGBr8JCP zs9myn/8GBqwpAP/GxgwJCPny78lzYLgjAJ8vAP9fX/ MjMUcAN8zM/9wcM8ZGcATEL QePdZWf/29uc/P9cmJu9MTDImIN /r7 /vz8/P8VNQGNugV8AAF9fX8swMNgTAFlDOICAgPNSUnNWSMQ5MBAQEJE3QPIGAM9AQMqGcG9vb6MhJsEdGM8vLx8fH98AANIWAMuQeL8fABkTEPPQ0OM5OSYdGFl5jo Pj/ pqcsTE78wMFNGQLYmID4dGPvd3UBAQJmTkP 8vH9QUK vr8ZWSHpzcJMmILdwcLOGcHRQUHxwcK9PT9DQ0O/v70w5MLypoG8wKOuwsP/g4P/Q0IcwKEswKMl8aJ9fX2xjdOtGRs/Pz Dg4GImIP8gIH0sKEAwKKmTiKZ8aB/f39Wsl LFt8dgUE9PT5x5aHBwcP AgP WltdgYMyZfyywz78AAAAAAAD///8AAP9mZv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKgALAAAAAA9AEQAAAj/AFEJHEiwoMGDCBMqXMiwocAbBww4nEhxoYkUpzJGrMixogkfGUNqlNixJEIDB0SqHGmyJSojM1bKZOmyop0gM3Oe2liTISKMOoPy7GnwY9CjIYcSRYm0aVKSLmE6nfq05QycVLPuhDrxBlCtYJUqNAq2bNWEBj6ZXRuyxZyDRtqwnXvkhACDV euTeJm1Ki7A73qNWtFiF /gA95Gly2CJLDhwEHMOUAAuOpLYDEgBxZ4GRTlC1fDnpkM fOqD6DDj1aZpITp0dtGCDhr fVuCu3zlg49ijaokTZTo27uG7Gjn2P hI8 PDPERoUB318bWbfAJ5sUNFcuGRTYUqV/3ogfXp1rWlMc6awJjiAAd2fm4ogXjz56aypOoIde4OE5u/F9x199dlXnnGiHZWEYbGpsAEA3QXYnHwEFliKAgswgJ8LPeiUXGwedCAKABACCN EA1pYIIYaFlcDhytd51sGAJbo3onOpajiihlO92KHGaUXGwWjUBChjSPiWJuOO/LYIm4v1tXfE6J4gCSJEZ7YgRYUNrkji9P55sF/ogxw5ZkSqIDaZBV6aSGYq/lGZplndkckZ98xoICbTcIJGQAZcNmdmUc210hs35nCyJ58fgmIKX5RQGOZowxaZwYA JaoKQwswGijBV4C6SiTUmpphMspJx9unX4KaimjDv9aaXOEBteBqmuuxgEHoLX6Kqx yXqqBANsgCtit4FWQAEkrNbpq7HSOmtwag5w57GrmlJBASEU18ADjUYb3ADTinIttsgSB1oJFfA63bduimuqKB1keqwUhoCSK374wbujvOSu4QG6UvxBRydcpKsav  Ca6G8A6Pr1x2kVMyHwsVxUALDq/krnrhPSOzXG1lUTIoffqGR7Goi2MAxbv6O2kEG56I7CSlRsEFKFVyovDJoIRTg7sugNRDGqCJzJgcKE0ywc0ELm6KBCCJo8DIPFeCWNGcyqNFE06ToAfV0HBRgxsvLThHn1oddQMrXj5DyAQgjEHSAJMWZwS3HPxT/QMbabI/iBCliMLEJKX2EEkomBAUCxRi42VDADxyTYDVogV wSChqmKxEKCDAYFDFj4OmwbY7bDGdBhtrnTQYOigeChUmc1K3QTnAUfEgGFgAWt88hKA6aCRIXhxnQ1yg3BCayK44EWdkUQcBByEQChFXfCB776aQsG0BIlQgQgE8qO26X1h8cEUep8ngRBnOy74E9QgRgEAC8SvOfQkh7FDBDmS43PmGoIiKUUEGkMEC/PJHgxw0xH74yx/3XnaYRJgMB8obxQW6kL9QYEJ0FIFgByfIL7/IQAlvQwEpnAC7DtLNJCKUoO/w45c44GwCXiAFB/OXAATQryUxdN4LfFiwgjCNYg kYMIEFkCKDs6PKAIJouyGWMS1FSKJOMRB/BoIxYJIUXFUxNwoIkEKPAgCBZSQHQ1A2EWDfDEUVLyADj5AChSIQW6gu10bE/JG2VnCZGfo4R4d0sdQoBAHhPjhIB94v/wRoRKQWGRHgrhGSQJxCS 0pCZbEhAAOw=="
        val imageBytes = Base64.decode(imageBinary.toByteArray(), Base64.DEFAULT)
        val decodedImage = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size)
        println("check decoded image size: ${decodedImage.byteCount}")
        imageVieww.setImageBitmap(Bitmap.createScaledBitmap(decodedImage, 120, 120, false))

    }

    override fun onLogInClicked() {
        viewModel.performValidation()
    }

}
xml:
        <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="viewModel"
            type="com.example.samplekotlinapplication.LogInViewModel" />
        <variable
            name="handler"
            type="com.example.samplekotlinapplication.LogInHandler" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".LogInActivity">

        <TextView
            android:id="@ id/tv_login"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginBottom="18dp"
            android:gravity="center"
            android:text="@string/label_login"
            android:textSize="38sp"
            app:layout_constraintBottom_toTopOf="@id/et_username"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_chainStyle="packed" />

        <EditText
            android:id="@ id/et_username"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:hint="@string/hint_username"
            android:text="@={viewModel.username}"
            app:layout_constraintBottom_toTopOf="@id/et_password"
            app:layout_constraintEnd_toEndOf="@id/tv_login"
            app:layout_constraintStart_toStartOf="@id/tv_login"
            app:layout_constraintTop_toBottomOf="@id/tv_login" />

        <EditText
            android:id="@ id/et_password"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:hint="@string/hint_password"
            android:inputType="textPassword"
            android:text="@={viewModel.password}"
            app:layout_constraintBottom_toTopOf="@id/imageVieww"
            app:layout_constraintEnd_toEndOf="@id/et_username"
            app:layout_constraintStart_toStartOf="@id/et_username"
            app:layout_constraintTop_toBottomOf="@id/et_username" />

        <!--    <Button
            android:id="@ id/b_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:onClick="@{()->handler.onLogInClicked()}"
            android:text="@string/action_login"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="@id/et_password"
            app:layout_constraintStart_toStartOf="@id/et_password"
            app:layout_constraintTop_toBottomOf="@id/et_password" />-->

        <ImageView
            android:id="@ id/imageVieww"
            android:layout_width="400dp"
            android:layout_height="500dp"
            android:src="@mipmap/ic_launcher"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@ id/et_password" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
  

Но изображение не отображается в пользовательском интерфейсе при запуске приложения. Я не понимаю, что не так в этом коде. Может кто-нибудь, пожалуйста, помочь мне с этим, поскольку я застрял здесь.

Комментарии:

1. Я протестировал ваш код с другой строкой base64, у меня это работает. Может быть проблема с вашей строкой изображения base64. Попробуйте свой код с какой-нибудь онлайн-тестовой строкой изображения и проверьте ее.

2. Привет, не могли бы вы отправить строку base 64, которую вы проверили .. я попробовал несколько строк онлайн-изображений .. у меня это не работает:(

3. по следующей ссылке я попробовал jsfiddle.net/casiano/Xadvz

4. Привет, я попробовал строку base 64, которую вы предоставили… для меня это все еще не загружается в представлении изображения .. не понимаю, в чем была проблема для меня:(

5. еще одно предложение, вы можете, по крайней мере, перед установкой bitmap в imageview проверить размер изображения в режиме просмотра decodedImage.ByteCount если его строка > 0 декодируется, поэтому проблема не должна быть с декодированием, попробуйте добавить какое-либо статическое изображение в свой imageview, действительно ли оно показывает какое-либо изображение или нет. по-прежнему не работает, поделитесь своим исходным кодом, чтобы лучше понять.