From 57d1ff885c981283758d355856012b16b4c7bc5e Mon Sep 17 00:00:00 2001 From: zhujie <leon.zhu@cloudroam.com.cn> Date: 星期三, 26 三月 2025 18:00:38 +0800 Subject: [PATCH] Merge branch 'master' of http://47.96.225.205:8888/r/FirstApp2 --- app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt | 199 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 199 insertions(+), 0 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 new file mode 100644 index 0000000..49d435c --- /dev/null +++ b/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt @@ -0,0 +1,199 @@ +package com.example.firstapp.ui.profile + +import android.Manifest +import android.app.Activity +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Build +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) { + result.data?.data?.let { uri -> + selectedImageUri = uri + Glide.with(this) + .load(uri) + .circleCrop() + .into(binding.ivAvatar) + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityEditProfileBinding.inflate(layoutInflater) + setContentView(binding.root) + + // 设置状态栏 + window.statusBarColor = ContextCompat.getColor(this, android.R.color.white) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + } + + // 获取传入的数据 + val currentNickname = intent.getStringExtra("nickname") ?: "" + val currentAvatarUrl = intent.getStringExtra("avatar_url") + + // 设置当前数据 + binding.etNickname.setText(currentNickname) + if (!currentAvatarUrl.isNullOrEmpty()) { + Glide.with(this) + .load(currentAvatarUrl) + .circleCrop() + .into(binding.ivAvatar) + } + + // 设置点击事件 + binding.btnBack.setOnClickListener { + finish() + } + + binding.ivAvatar.setOnClickListener { + checkAndRequestPermission() + } + + binding.btnSaveBottom.setOnClickListener { + saveAndFinish() + } + } + + private fun saveAndFinish() { + lifecycleScope.launch { + try { + binding.btnSaveBottom.isEnabled = false + showLoading() + + 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() + } + } + } + + private fun checkAndRequestPermission() { + when { + ContextCompat.checkSelfPermission( + this, + Manifest.permission.READ_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED -> { + openGallery() + } + else -> { + ActivityCompat.requestPermissions( + this, + arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), + PERMISSION_REQUEST_CODE + ) + } + } + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array<out String>, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + when (requestCode) { + PERMISSION_REQUEST_CODE -> { + if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + openGallery() + } else { + Toast.makeText(this, "需要存储权限来选择头像", Toast.LENGTH_SHORT).show() + } + } + } + } + + private fun openGallery() { + val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + 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 + } +} \ No newline at end of file -- Gitblit v1.9.3