我正在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")
}
}
}
您应该在activity
中创建游标,并将其传递给ImageProcessor
类,如下所示:
getRealPathFromURI(imageUri!!,cursor:Cursor)
并将getRealPathFromURI
中的ImageProcessor
乐趣更改为此:
fun getRealPathFromURI(uri: Uri,cursor:Cursor): String? {
.
.
.
}