如何访问Kotlin上其他类中的函数?

问题描述 投票:0回答:1

我正在Kotlin上开发一个应用程序,所以我有一个名为CreateNoteActivity.kt的类,其中有一个函数想要移至ImageProcessor.kt以使代码更简洁。它可以使用2个功能(getResizedBitmap和getImageUriAndCompress),但是当我尝试访问有趣的getRealPathFromURI时,我遇到了一个问题,原因是它显示“ Unresolved Reference:contentResolver”。注意:如果有趣的getRealPathFromURI位于CreateNoteActivity.kt上,则此方法有效。

一如既往的感谢!

ImageProcessor.kt:

package com.example.miciudadstable

import android.content.Context
import android.database.Cursor
import android.graphics.Bitmap
import android.net.Uri
import android.provider.MediaStore
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import java.io.ByteArrayOutputStream


class ImageProcessor {

    fun getRealPathFromURI(uri: Uri): String? {
        val cursor: Cursor? = contentResolver.query(uri, null, null, null, null)

        cursor?.moveToFirst()

        val idx = cursor!!.getColumnIndex(MediaStore.Images.ImageColumns.DATA)
        val realPath = cursor.getString(idx)

        intent.putExtra("Real image path", realPath)

        Log.d("@JSCRUI getRealPathFromURI", realPath)

        return realPath
    }


    fun getResizedBitmap(image: Bitmap, maxSize: Int): Bitmap? {
        var width = image.width
        var height = image.height
        val bitmapRatio = width.toFloat() / height.toFloat()
        if (bitmapRatio > 1) {
            width = maxSize
            height = (width / bitmapRatio).toInt()
        } else {
            height = maxSize
            width = (height * bitmapRatio).toInt()
        }
        return Bitmap.createScaledBitmap(image, width, height, true)
    }
    fun getImageUriAndCompress(inContext: Context, inImage: Bitmap): Uri? {
        val bytes = ByteArrayOutputStream()
        inImage.compress(Bitmap.CompressFormat.JPEG, 80, bytes)
        val path = MediaStore.Images.Media.insertImage(
            inContext.getContentResolver(),
            inImage,
            "Compressed",
            "Image created by Rawson Ciudad"
        )
        Log.d("@JSCRUI getImageUriAndCompress", path)
        return Uri.parse(path)
    }
}

CreateNoteActivity:

package com.example.miciudadstable

import android.content.Context
import android.content.Intent
import android.database.Cursor
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Bundle
import android.os.StrictMode
import android.provider.MediaStore
import android.util.Log
import android.view.View
import android.widget.ArrayAdapter
import androidx.appcompat.app.AppCompatActivity
import com.android.volley.Response
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import com.google.gson.Gson
import com.tiper.MaterialSpinner
import kotlinx.android.synthetic.main.activity_createnote.*
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.asRequestBody
import java.io.ByteArrayOutputStream
import java.io.File


class CreateNoteActivity : AppCompatActivity(){

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_createnote)    
    }

    //select a picture...
    fun fromGallery(){
        val pickPhoto = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        startActivityForResult(pickPhoto, 1)
    }
    fun fromCamera(){
        val takePicture = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        startActivityForResult(takePicture, 0)
    }

    //Result from Gallery/Camera depends on choosed option.
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when(requestCode){
            0 -> if(resultCode == RESULT_OK){
                    val selectedImageUri = data?.data
                        if (selectedImageUri != null) {

                }
            }
            1 -> if (resultCode == RESULT_OK){
                    val selectedImageUri = data?.data
                        if (selectedImageUri != null) {

                        val imageStream = contentResolver.openInputStream(selectedImageUri)
                        val selectedImage = BitmapFactory.decodeStream(imageStream)
                        val bitmapResizedImage = ImageProcessor().getResizedBitmap(selectedImage, 1024)

                    var imageUri = ImageProcessor().getImageUriAndCompress(this, bitmapResizedImage!!)
                                         ImageProcessor().getRealPathFromURI(imageUri!!)

                    let {
                        iv_pickedImage.setImageBitmap(selectedImage)
                    }

                }
            }
            else -> Log.d("@JSCRUI result: ", "No image received")
        }
    }
}
android function class kotlin access
1个回答
0
投票

您应该在activity中创建游标,并将其传递给ImageProcessor类,如下所示:

getRealPathFromURI(imageUri!!,cursor:Cursor)

并将getRealPathFromURI中的ImageProcessor乐趣更改为此:

fun getRealPathFromURI(uri: Uri,cursor:Cursor): String? {
.
.
.
}
© www.soinside.com 2019 - 2024. All rights reserved.