Kotlin 我想使用Volley库在服务器上上传图像

Kotlin 我想使用Volley库在服务器上上传图像,kotlin,server,android-volley,Kotlin,Server,Android Volley,我正在从手机图库中选择图像,并希望在服务器上上载图像,但每次我不知道原因时,我的应用程序都会崩溃。。我已经学习了很多教程和问题,但我不明白。请帮帮我。 这是我的密码 class profileCreate : AppCompatActivity() { var context: Context? = null var imageUri: Uri? = null var picturePath: String? = null val url = "https://

我正在从手机图库中选择图像,并希望在服务器上上载图像,但每次我不知道原因时,我的应用程序都会崩溃。。我已经学习了很多教程和问题,但我不明白。请帮帮我。 这是我的密码

class profileCreate : AppCompatActivity() {

    var context: Context? = null
    var imageUri: Uri? = null
    var picturePath: String? = null
    val url = "https://apps.faizeqamar.website/charity/api/donnor_add"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_profile_create)
        val et_name = findViewById<EditText>(R.id.et_name)
        val et_cnic = findViewById<EditText>(R.id.et_cnic)
        val et_email = findViewById<EditText>(R.id.et_email)
        val et_phon = findViewById<EditText>(R.id.et_phon)
        val et_address = findViewById<EditText>(R.id.et_address)
        val profile_image = findViewById<ImageView>(R.id.profile_image)
        profile_image.setOnClickListener {
            checkPermission()
        }

        val btn_create_profile = findViewById<Button>(R.id.btn_create_profile)

        btn_create_profile.setOnClickListener {
            imageUpload()

        }
    }
从手机中选择图像

    //*********pick image from phone************
    var READIMAGE: Int = 253
    fun checkPermission() {

        if (Build.VERSION.SDK_INT >= 23) {
            if (ActivityCompat.checkSelfPermission(
                    this,
                    android.Manifest.permission.READ_EXTERNAL_STORAGE
                ) !=
                PackageManager.PERMISSION_GRANTED
            ) {
                requestPermissions(
                    arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE),
                    READIMAGE
                )
                return
            }
        }
        loadImage()
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        when (requestCode) {
            READIMAGE -> {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    loadImage()
                } else {
                    Toast.makeText(
                        applicationContext,
                        "cannot access your images",
                        Toast.LENGTH_LONG
                    ).show()
                }
            }
            else -> super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        }
    }

    val PICK_IMAGE_CODE = 123
    fun loadImage() {

        var intent = Intent(
            Intent.ACTION_PICK,
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI
        )
        startActivityForResult(intent, PICK_IMAGE_CODE)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == PICK_IMAGE_CODE && data != null && resultCode == RESULT_OK) {
            imageUri = data.data
            val filePathColum = arrayOf(MediaStore.Images.Media.DATA)
            val cursor = contentResolver.query(imageUri!!, filePathColum, null, null, null)
            cursor!!.moveToFirst()
            val columnIndex = cursor.getColumnIndex(filePathColum[0])
            picturePath = cursor.getString(columnIndex)
            cursor.close()
            profile_image?.setImageBitmap(BitmapFactory.decodeFile(picturePath))

        }
    }
}
//*******从手机中选择图像************
变量READIMAGE:Int=253
乐趣检查权限(){
如果(Build.VERSION.SDK_INT>=23){
如果(ActivityCompat.checkSelfPermission(
这
android.Manifest.permission.READ\u外部存储
) !=
PackageManager.PERMISSION\u已授予
) {
请求权限(
arrayOf(android.Manifest.permission.READ\u外部存储),
READIMAGE
)
返回
}
}
loadImage()
}
覆盖onRequestPermissionsResult(
请求代码:Int,
权限:数组,
格兰特结果:因塔雷
) {
何时(请求代码){
READIMAGE->{
if(grantResults[0]==已授予PackageManager.权限){
loadImage()
}否则{
Toast.makeText(
应用上下文,
“无法访问您的图像”,
吐司,长度
).show()
}
}
else->super.onRequestPermissionsResult(请求代码、权限、GrantResult)
}
}
val PICK_IMAGE_CODE=123
有趣的loadImage(){
var intent=intent(
意向、行动、选择,
MediaStore.Images.Media.EXTERNAL\u CONTENT\u URI
)
startActivityForResult(意图、拾取图像\u代码)
}
重写activityResult(请求代码:Int,结果代码:Int,数据:Intent?){
super.onActivityResult(请求代码、结果代码、数据)
if(requestCode==PICK\u IMAGE\u CODE&&data!=null&&resultCode==RESULT\u OK){
imageUri=data.data
val filepathcolm=arrayOf(MediaStore.Images.Media.DATA)
val cursor=contentResolver.query(imageUri!!,filepathcolm,null,null)
光标!!.moveToFirst()
val columnIndex=cursor.getColumnIndex(filePathColum[0])
picturePath=cursor.getString(columnIndex)
cursor.close()
profile_image?.setImageBitmap(BitmapFactory.decodeFile(picturePath))
}
}
}

将图像编码为字符串,然后像发送字符串一样发送到服务器 更改OnActivity结果如下所示

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

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

                val contentURI = data!!.data
                try {
                    logBitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, contentURI)
                    encodedImgString = getStringImage(logBitmap!!)
                    profile_image!!.setImageBitmap(logBitmap)

                } catch (e: IOException) {
                    e.printStackTrace()
                    Toast.makeText(this, "Failed!", Toast.LENGTH_SHORT).show()
                }



        }else if (requestCode== IMAGE_CAPTURE_CODE){
            img_logo.setImageURI(image_uri)
        }

    } catch (e: Exception) {
        e.printStackTrace()
    }
}
下面是getStringImage函数

 private fun getStringImage(bmp: Bitmap): String {
    val baos = ByteArrayOutputStream()
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos)
    val imageBytes = baos.toByteArray()
    return Base64.encodeToString(imageBytes, Base64.DEFAULT)
}

每次我不知道原因时,您可以将encodedImgString发送到服务器并从那里解码我的应用程序崩溃

异常堆栈跟踪在Logcat中,请找到它并将其附加到您的问题中。否则,就无法判断代码的错误。
 private fun getStringImage(bmp: Bitmap): String {
    val baos = ByteArrayOutputStream()
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos)
    val imageBytes = baos.toByteArray()
    return Base64.encodeToString(imageBytes, Base64.DEFAULT)
}