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)
}