Показать выбранное / сохраненное изображение на Android после сброса / убить приложение - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь показать изображение, которое пользователь выбрал через камеру или из галереи изображений. Приложение должно показывать это изображение даже после перезапуска / удаления приложения и его сохранения.

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

MainActivity.kt

package com.example.pickimagetakeexamples

import android.annotation.SuppressLint
import android.app.AlertDialog
import android.content.Intent
import android.content.pm.ActivityInfo
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.media.MediaScannerConnection
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory
import kotlinx.android.synthetic.main.activity_main.*
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.util.*


class MainActivity : AppCompatActivity() {

    private var btn: Button? = null
    private var imageview: ImageView? = null
    private val GALLERY = 1
    private val CAMERA = 2

    @SuppressLint("SourceLockedOrientationActivity")
    override fun onCreate(savedInstanceState:Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

        btn = findViewById<View>(R.id.btn) as Button
        imageview = findViewById<View>(R.id.iv) as ImageView

        val wallpaperDirectory = File(getExternalFilesDir(null).toString() + IMAGE_DIRECTORY)

        if (!wallpaperDirectory.exists())
        {

        iv.setImageBitmap(BitmapFactory.decodeFile("/wallpaperDirectory"))

        } else {

            val img = BitmapFactory.decodeResource(resources, R.mipmap.profile_image)
            val round = RoundedBitmapDrawableFactory.create(resources, img)
            round.isCircular = true
            iv.setImageDrawable(round)
            println("Image_Directory")
            println(IMAGE_DIRECTORY)

        }

        btn!!.setOnClickListener { showPictureDialog() }

    }

    private fun showPictureDialog() {
        val pictureDialog = AlertDialog.Builder(this)
        pictureDialog.setTitle("Select Action")
        val pictureDialogItems = arrayOf("Select Photo From Gallery", "Capture Photo From Camera")
        pictureDialog.setItems(pictureDialogItems
        ) { dialog, which ->
            when (which) {
                0 -> choosePhotoFromGallary()
                1 -> takePhotoFromCamera()
            }
        }
        pictureDialog.show()
    }

    fun choosePhotoFromGallary() {
        val galleryIntent = Intent(Intent.ACTION_PICK,
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI)

        startActivityForResult(galleryIntent, GALLERY)
    }

    fun takePhotoFromCamera() {
        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        startActivityForResult(intent, CAMERA)
    }

    public override fun onActivityResult(requestCode:Int, resultCode:Int, data: Intent?) {

        super.onActivityResult(requestCode, resultCode, data)

        if (requestCode == GALLERY)
        {
            if (data != null)
            {
                val contentURI = data.data
                try
                {
                    val bitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, contentURI)
                    val round = RoundedBitmapDrawableFactory.create(resources, bitmap)
                    round.isCircular = true

                    val path = saveImage(bitmap)
                    Toast.makeText(this@MainActivity, "Image Saved!", Toast.LENGTH_SHORT).show()
                    imageview!!.setImageDrawable(round)

                }
                catch (e: IOException) {
                    e.printStackTrace()
                    Toast.makeText(this@MainActivity, "Failed!", Toast.LENGTH_SHORT).show()
                }
            }
        }
        else if (requestCode == CAMERA)
        {
            val thumbnail = data!!.extras!!.get("data") as Bitmap
            val round = RoundedBitmapDrawableFactory.create(resources, thumbnail)
            round.isCircular = true
            imageview!!.setImageDrawable(round)
            saveImage(thumbnail)
            Toast.makeText(this@MainActivity, "Image Saved!", Toast.LENGTH_SHORT).show()

            }
    }

    fun saveImage(myBitmap: Bitmap):String {
        val bytes = ByteArrayOutputStream()
        myBitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes)
        val wallpaperDirectory = File(getExternalFilesDir(null).toString() + IMAGE_DIRECTORY)
        println("WallpaperDirectory::" + wallpaperDirectory)

        // have the object build the directory structure, if needed.
        Log.d("fee",wallpaperDirectory.toString())
        if (!wallpaperDirectory.exists())
        {

            wallpaperDirectory.mkdirs()
        }

        try
        {
            Log.d("heel",wallpaperDirectory.toString())
            val f = File(wallpaperDirectory, ((Calendar.getInstance()
                    .getTimeInMillis()).toString() + ".jpg"))
            f.createNewFile()
            val fo = FileOutputStream(f)
            fo.write(bytes.toByteArray())
            MediaScannerConnection.scanFile(this,
                    arrayOf(f.getPath()),
                    arrayOf("image/jpeg"), null)
            fo.close()
            Log.d("TAG", "File Saved::--->" + f.getAbsolutePath())

            return f.getAbsolutePath()
        }
        catch (e1: IOException) {
            e1.printStackTrace()
        }

        return ""
    }

    companion object {
        private val IMAGE_DIRECTORY = "/demonuts"

    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:exported="true"
    tools:context=".MainActivity">

    <!--        android:text="Select or Capture Image" -->
    <Button
        android:id="@+id/btn"
        android:layout_width="125dp"
        android:layout_height="125dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="40dp"
        android:width="2dp"
        android:background="#00000000" />

    <ImageView
        android:id="@+id/iv"
        android:layout_width="125dp"
        android:layout_height="125dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="-150dp"
        android:scaleType="fitXY"
        android:background="#00000000"
        android:src="@mipmap/profile_image" />


</LinearLayout>

1 Ответ

1 голос
/ 14 октября 2019

Вам необходимо добавить эту строку перед сохранением изображения, чтобы сохранить только одно изображение:

val wallpaperDirectory = File(getExternalFilesDir(null).toString() + IMAGE_DIRECTORY)
wallpaperDirectory.deleteRecursively()

Тогда, если изображение существует, вы можете получить absolutePath изображения, сохраненного в вашем каталоге, и показать изображение,Заменить этим кодом:

    val wallpaperDirectory = File(getExternalFilesDir(null).toString() + IMAGE_DIRECTORY)

    var listImages : Array<File>? = null
    listImages = wallpaperDirectory.listFiles()

    if(listImages != null && listImages.size!! > 0){
        iv.setImageBitmap(BitmapFactory.decodeFile(listImages[0].absolutePath))
    }
    else {
        val img = BitmapFactory.decodeResource(resources, R.drawable.profile_image)
        val round = RoundedBitmapDrawableFactory.create(resources, img)
        round.isCircular = true
        iv.setImageDrawable(round)
        println("Image_Directory")
        println(IMAGE_DIRECTORY)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...