From 5c73f167603693d5e015193730bf16f3b6bb2bf5 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期二, 25 三月 2025 13:47:54 +0800 Subject: [PATCH] fix 1111 --- app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt | 91 ++++++++++++++++++++++++++++++++++++++------- 1 files changed, 77 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt b/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt index 45d4c18..49d435c 100644 --- a/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt +++ b/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt @@ -9,17 +9,30 @@ import android.os.Bundle import android.provider.MediaStore import android.view.View +import android.widget.ProgressBar import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.example.firstapp.databinding.ActivityEditProfileBinding +import com.example.firstapp.database.service.ApiService +import kotlinx.coroutines.launch +import java.io.File +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MultipartBody +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.RequestBody.Companion.toRequestBody class EditProfileActivity : AppCompatActivity() { private lateinit var binding: ActivityEditProfileBinding private var selectedImageUri: Uri? = null + private lateinit var apiService: ApiService + private var loadingDialog: AlertDialog? = null private val pickImage = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { @@ -69,25 +82,53 @@ binding.btnSaveBottom.setOnClickListener { saveAndFinish() } - - binding.btnSaveBottom.setOnClickListener { - saveAndFinish() - } } private fun saveAndFinish() { - val newNickname = binding.etNickname.text.toString() - if (newNickname.isEmpty()) { - Toast.makeText(this, "昵称不能为空", Toast.LENGTH_SHORT).show() - return - } + lifecycleScope.launch { + try { + binding.btnSaveBottom.isEnabled = false + showLoading() - val resultIntent = Intent().apply { - putExtra("nickname", newNickname) - putExtra("avatar_uri", selectedImageUri?.toString()) + val newNickname = binding.etNickname.text.toString() + if (newNickname.isEmpty()) { + Toast.makeText(this@EditProfileActivity, "昵称不能为空", Toast.LENGTH_SHORT).show() + return@launch + } + + // 准备文件和参数 + val nicknameBody = newNickname.toRequestBody("text/plain".toMediaType()) + + // 如果选择了新头像,处理文件 + val avatarPart = selectedImageUri?.let { uri -> + val inputStream = contentResolver.openInputStream(uri) + val file = File(cacheDir, "avatar_temp") + inputStream?.use { input -> + file.outputStream().use { output -> + input.copyTo(output) + } + } + + val requestFile = file.asRequestBody("image/*".toMediaType()) + MultipartBody.Part.createFormData("avatar", file.name, requestFile) + } + + // 调用更新接口 + apiService.updateProfile( + nickname = nicknameBody, + avatar = avatarPart + ) + + Toast.makeText(this@EditProfileActivity, "保存成功", Toast.LENGTH_SHORT).show() + finish() + + } catch (e: Exception) { + Toast.makeText(this@EditProfileActivity, "保存失败: ${e.message}", Toast.LENGTH_SHORT).show() + } finally { + binding.btnSaveBottom.isEnabled = true + hideLoading() + } } - setResult(Activity.RESULT_OK, resultIntent) - finish() } private fun checkAndRequestPermission() { @@ -130,6 +171,28 @@ pickImage.launch(intent) } + private fun showLoading() { + if (loadingDialog == null) { + loadingDialog = AlertDialog.Builder(this) + .setView(ProgressBar(this)) + .setCancelable(false) + .create() + } + loadingDialog?.show() + } + + private fun hideLoading() { + loadingDialog?.dismiss() + } + + private fun String.toRequestBody(mediaType: String): RequestBody { + return this.toRequestBody(mediaType.toMediaType()) + } + + private fun File.asRequestBody(mediaType: String): RequestBody { + return this.asRequestBody(mediaType.toMediaType()) + } + companion object { private const val PERMISSION_REQUEST_CODE = 100 } -- Gitblit v1.9.3