簡體   English   中英

Android Studio - Kotlin - getDrawable 或 getResource 不工作

[英]Android Studio - Kotlin - getDrawable or getResource is not working

我正在嘗試將內部存儲中的圖像放入按鈕的背景中。 沒有錯誤消息。 我可以打開模擬設備上的存儲並選擇和圖像,但它不會被放置/插入到按鈕背景中。 我使用的是 Android 4.1 並使用 API Level 30 (Q) / Android 11。我正在使用Kotlin 進行編碼。

日志說照片被選中。

有問題的代碼是這樣的:

RegisterActivity.kt --部分--

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

    if(requestCode == 0 && resultCode == RESULT_OK && data != null){
        
        // proceed and check what the selected image was...
        Log.d("RegisterActivity", "Photo was selected")

        val uri = data.data
        val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)

        val bitmapDrawable = BitmapDrawable(bitmap)
        select_photo_button_register.setBackgroundDrawable(bitmapDrawable)
        select_photo_button_register.text = ""

    }
}

RegisterActivity.kt --FULL--

package <censored>.kotlinmessenger

import android.content.Intent
import android.graphics.drawable.BitmapDrawable
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.ActionBar
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.auth.FirebaseAuth
import kotlinx.android.synthetic.main.activity_register.*


class RegisterActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)

        this.supportActionBar?.displayOptions = ActionBar.DISPLAY_SHOW_CUSTOM
        supportActionBar?.setDisplayShowCustomEnabled(true)
        supportActionBar?.setCustomView(R.layout.custom_action_bar)
        //getSupportActionBar().setElevation(0);

        register_button_register.setOnClickListener {
            performRegister()
        }

        already_have_account_textView.setOnClickListener {
            Log.d("RegisterActivity", "Trying to show login activity.")

            val intent = Intent(this, LoginActivity::class.java)
            startActivity(intent)
        }

        select_photo_button_register.setOnClickListener {
            Log.d("RegisterActivity", "Try to show photo selector")


            val intent = Intent(Intent.ACTION_PICK)
            intent.type = "image/*"
            startActivityForResult(intent, 0)
        }
    }



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

        if(requestCode == 0 && resultCode == RESULT_OK && data != null){

            // proceed and check what the selected image was...
            Log.d("RegisterActivity", "Photo was selected")

            val uri = data.data
            val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)

            val bitmapDrawable = BitmapDrawable(bitmap)
            select_photo_button_register.setBackgroundDrawable(bitmapDrawable)
            select_photo_button_register.text = ""

        }
    }

    private fun performRegister() {
        val email = email_editText_register.text.toString()
        val password = password_editText_register.text.toString()

        if (email.isEmpty() || password.isEmpty()) {
            Toast.makeText(this, "Please check email/password", Toast.LENGTH_SHORT).show()
            return
        }

        Log.d("RegisterActivity", "Email: $email")
        Log.d("RegisterActivity", "Password: $password")

        //Firebase Auth
        FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener {
                if (!it.isSuccessful) return@addOnCompleteListener

                // else if successful
                val uid = it.result?.user?.uid
                Log.d("RegisterActivity", "Successfully created user with uid: $uid")

                println("Email: $email\n Password: $password\n UID: $uid")
            }
            .addOnFailureListener {
                Log.d("Main", "Failed to create user: ${it.message}")
                Toast.makeText(this, "Failed to create user: ${it.message}", Toast.LENGTH_SHORT)
                    .show()
            }
    }
}

活動注冊文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#86B400"
    tools:context=".RegisterActivity" >

    <EditText
        android:id="@+id/username_editText_register"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_marginStart="36dp"
        android:layout_marginLeft="36dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="36dp"
        android:layout_marginRight="36dp"
        android:background="@drawable/rounded_edittext"
        android:ems="10"
        android:hint="Username"
        android:inputType="textPersonName"
        android:paddingLeft="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/select_photo_button_register" />

    <EditText
        android:id="@+id/email_editText_register"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_marginTop="8dp"
        android:background="@drawable/rounded_edittext"
        android:ems="10"
        android:hint="Email"
        android:inputType="textEmailAddress"
        android:paddingLeft="16dp"
        app:layout_constraintEnd_toEndOf="@+id/username_editText_register"
        app:layout_constraintStart_toStartOf="@+id/username_editText_register"
        app:layout_constraintTop_toBottomOf="@+id/username_editText_register" />

    <EditText
        android:id="@+id/password_editText_register"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_marginTop="8dp"
        android:background="@drawable/rounded_edittext"
        android:ems="10"
        android:hint="Password"
        android:inputType="textPassword"
        android:paddingLeft="16dp"
        app:layout_constraintEnd_toEndOf="@+id/email_editText_register"
        app:layout_constraintHorizontal_bias="0.497"
        app:layout_constraintStart_toStartOf="@+id/email_editText_register"
        app:layout_constraintTop_toBottomOf="@+id/email_editText_register"
        />

    <Button
        android:id="@+id/register_button_register"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:background="@drawable/rounded_edittext"
        android:text="Register"
        app:backgroundTint="@android:color/holo_green_dark"
        app:layout_constraintEnd_toEndOf="@+id/password_editText_register"
        app:layout_constraintStart_toStartOf="@+id/password_editText_register"
        app:layout_constraintTop_toBottomOf="@+id/password_editText_register" />

    <TextView
        android:id="@+id/already_have_account_textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="Do you already have an account?"
        android:textColor="#FFFFFF"
        android:textSize="16sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="@+id/register_button_register"
        app:layout_constraintStart_toStartOf="@+id/register_button_register"
        app:layout_constraintTop_toBottomOf="@+id/register_button_register" />

    <Button
        android:id="@+id/select_photo_button_register"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_marginTop="32dp"
        android:background="@drawable/rounded_select_photo"
        android:text="Select photo"
        android:textColor="@color/black"
        app:backgroundTint="bitmapDrawable"
        app:layout_constraintBottom_toTopOf="@+id/username_editText_register"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

具有外部存儲權限的注冊活動

package <censroed>.kotlinmessenger

import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.ImageDecoder
import android.graphics.drawable.BitmapDrawable
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.storage.FirebaseStorage
import kotlinx.android.synthetic.main.activity_register.*
import java.util.*


class RegisterActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)

        register_button_register.setOnClickListener {
            performRegister()
        }

        already_have_account_textView.setOnClickListener {
            Log.d("RegisterActivity", "Trying to show login activity.")

            val intent = Intent(this, LoginActivity::class.java)
            startActivity(intent)
        }

        select_photo_button_register.setOnClickListener {
            Log.d("RegisterActivity", "Try to show photo selector")
            val galleryIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)

            startActivityForResult(galleryIntent, 0)

            val intent = Intent(Intent.ACTION_PICK)
            intent.type = "image/*"
            startActivityForResult(intent, 0)
        }
    }
    var selectedPhotoUri: Uri? = null
    @RequiresApi(Build.VERSION_CODES.P)
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if (ContextCompat.checkSelfPermission(this@RegisterActivity,
                        Manifest.permission.READ_EXTERNAL_STORAGE) !==
                PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this@RegisterActivity,
                            Manifest.permission.READ_EXTERNAL_STORAGE)) {
                ActivityCompat.requestPermissions(this@RegisterActivity,
                        arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1)
            } else {
                ActivityCompat.requestPermissions(this@RegisterActivity,
                        arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1)
            }
        }
        selectedPhotoUri = data?.data
//        val source = ImageDecoder.createSource(this.contentResolver, selectedPhotoUri!!)
//        val bitmap = ImageDecoder.decodeBitmap(source)
////        select_photo_button_register.setBackgroundDrawable(BitmapDrawable(this.resources, bitmap))
//        select_photo_button_register.background = BitmapDrawable(resources, bitmap)

//        try {
//            selectedPhotoUri?.let {{
//                    val source = ImageDecoder.createSource(this.contentResolver, selectedPhotoUri!!)
//                    val bitmap = ImageDecoder.decodeBitmap(source)
//
//                }
//                select_photo_button_register.setBackgroundDrawable(BitmapDrawable(this.resources, bitmap))
//
//            }
//        } catch (e: Exception) {
//            e.printStackTrace()
//        }


//        if (requestCode == 0 && resultCode == Activity.RESULT_OK && data != null){
//            Log.d("RegisterActivity", "Photo was selected")
//
//            selectedPhotoUri = data.data
//            val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, selectedPhotoUri)
//            val bitmapDrawable = BitmapDrawable(bitmap)
//            select_photo_button_register.setBackgroundDrawable(bitmapDrawable)
//        }
    }

    @RequiresApi(Build.VERSION_CODES.P)
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>,
                                            grantResults: IntArray) {
        when (requestCode) {
            1 -> {
                if (grantResults.isNotEmpty() && grantResults[0] ==
                        PackageManager.PERMISSION_GRANTED) {
                    if ((ContextCompat.checkSelfPermission(this@RegisterActivity,
                                    Manifest.permission.ACCESS_FINE_LOCATION) ===
                                    PackageManager.PERMISSION_GRANTED)) {
                        Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show()


                        val source = ImageDecoder.createSource(this.contentResolver, selectedPhotoUri!!)
                        val bitmap = ImageDecoder.decodeBitmap(source)
//        select_photo_button_register.setBackgroundDrawable(BitmapDrawable(this.resources, bitmap))
                        select_photo_button_register.background = BitmapDrawable(resources, bitmap)
                    }
                } else {
                    Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show()
                }
                return
            }
        }
    }

    private fun performRegister() {
        val email = email_editText_register.text.toString()
        val password = password_editText_register.text.toString()

        if (email.isEmpty() || password.isEmpty()) {
            Toast.makeText(this, "Please check email/password", Toast.LENGTH_SHORT).show()
            return
        }

        Log.d("RegisterActivity", "Email: $email")
        Log.d("RegisterActivity", "Password: $password")

        //Firebase Auth
        FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener {
                if (!it.isSuccessful) return@addOnCompleteListener

                // else if successful
                val uid = it.result?.user?.uid
                Log.d("RegisterActivity", "Successfully created user with uid: $uid")

                uploadImageToFirebase()
            }
            .addOnFailureListener {
                Log.d("RegisterActivity", "Failed to create user: ${it.message}")
                Toast.makeText(this, "Failed to create user: ${it.message}", Toast.LENGTH_SHORT)
                    .show()
            }
    }

    private fun uploadImageToFirebase() {
        if (selectedPhotoUri == null) return

        val filename = UUID.randomUUID().toString()
        val ref = FirebaseStorage.getInstance().getReference("/images/$filename")

        ref.putFile(selectedPhotoUri!!).addOnSuccessListener {
            Log.d("RegisterActivity", "Sucessfully uploaded image: ${it.metadata?.path}")
        }
    }
}

嘗試使用它,因為 MediaStore.Images.Media.getBitmap() 已被棄用。

try {
            uri?.let {
                if(Build.VERSION.SDK_INT < 28) {
                    val bitmap = MediaStore.Images.Media.getBitmap(
                        this.contentResolver,
                        uri
                    )
                } else {
                    val source = ImageDecoder.createSource(this.contentResolver, uri)
                    val bitmap = ImageDecoder.decodeBitmap(source)
                }
                select_photo_button_register.setBackgroundDrawable(new BitmapDrawable(context.getResources(), bitmap));
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }

嘗試這個。 替換這兩行:

val bitmapDrawable = BitmapDrawable(bitmap)
select_photo_button_register.setBackgroundDrawable(bitmapDrawable)

有了這個:

select_photo_button_register.background = BitmapDrawable(resources, bitmap)

我修好了它。 我將Button更改為ImageView並在其上添加了一個TextView 我正在使用Picasso將其插入ImageView

onActivityResult處理插入圖像。

從這里獲得的權限代碼

package <censored>.kotlinmessenger

import android.Manifest
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.auth.FirebaseAuth
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_register.*



class RegisterActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)

        register_button_register.setOnClickListener {
            performRegister()
        }

        already_have_account_textView.setOnClickListener {
            Log.d("RegisterActivity", "Trying to show login activity.")

            val intent = Intent(this, LoginActivity::class.java)
            startActivity(intent)
        }

        //BUTTON CLICK
        select_photo_imageView_register.setOnClickListener {
            //check runtime permission
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) ==
                    PackageManager.PERMISSION_DENIED
                ) {
                    //permission denied
                    Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show()
                    val permissions = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
                    //show popup to request runtime permission
                    requestPermissions(permissions, PERMISSION_CODE)
                } else {
                    //permission already granted
                    Toast.makeText(this, "Permission already granted", Toast.LENGTH_SHORT).show()
                    pickImageFromGallery()
                }
            } else {
                //system OS is < Marshmallow
                pickImageFromGallery()
            }
        }
    }

    private fun pickImageFromGallery() {
        //Intent to pick image
        val intent = Intent(Intent.ACTION_PICK)
        intent.type = "image/*"
        startActivityForResult(intent, IMAGE_PICK_CODE)
    }

    companion object {
        //image pick code
        private val IMAGE_PICK_CODE = 1000

        //Permission code
        private val PERMISSION_CODE = 1001
    }

    //handle requested permission result
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        when (requestCode) {
            PERMISSION_CODE -> {
                if (grantResults.size > 0 && grantResults[0] ==
                    PackageManager.PERMISSION_GRANTED
                ) {
                    //permission from popup granted
                    Toast.makeText(this, "Permission from popup granted", Toast.LENGTH_SHORT).show()
                    pickImageFromGallery()
                } else {
                    //permission from popup denied
                    Toast.makeText(this, "Permission from popup denied", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }


    //handle result of picked image
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == Activity.RESULT_OK && requestCode == IMAGE_PICK_CODE && data != null) {

            Picasso.get()
                .load(data.data)
                .fit()
                .centerCrop()
                .into(select_photo_imageView_register)

            select_photo_textView_register.text = ""
        }
    }


    private fun performRegister() {
        val email = email_editText_register.text.toString()
        val password = password_editText_register.text.toString()

        if (email.isEmpty() || password.isEmpty()) {
            Toast.makeText(this, "Please check email/password", Toast.LENGTH_SHORT).show()
            return
        }

        Log.d("RegisterActivity", "Email: $email")
        Log.d("RegisterActivity", "Password: $password")

        //Firebase Auth
        FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener {
                if (!it.isSuccessful) return@addOnCompleteListener

                // else if successful
                val uid = it.result?.user?.uid
                Log.d("RegisterActivity", "Successfully created user with uid: $uid")

//                    uploadImageToFirebase()
            }
            .addOnFailureListener {
                Log.d("RegisterActivity", "Failed to create user: ${it.message}")
                Toast.makeText(this, "Failed to create user: ${it.message}", Toast.LENGTH_SHORT)
                    .show()
            }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM