浏览代码

1. 新增用户中心页面
2. 调试完成照片选择

bjb 3 月之前
父节点
当前提交
3b7523029c

+ 8 - 0
app/src/main/AndroidManifest.xml

@@ -5,6 +5,10 @@
     <uses-permission android:name="android.permission.INTERNET" />
     <!--  指纹验证  -->
     <uses-permission android:name="android.permission.USE_BIOMETRIC" />
+    <!--  读取存储权限 Android13版本以下使用  -->
+    <uses-permission
+        android:name="android.permission.READ_EXTERNAL_STORAGE"
+        android:maxSdkVersion="32" />
 
 
     <application
@@ -78,6 +82,10 @@
             android:name=".ui.pages.create.job.PagePushJob"
             android:exported="true"
             android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.pages.profile.PageProfile"
+            android:exported="true"
+            android:screenOrientation="portrait" />
         <!--  阿里消息推送服务配置  -->
         <service
             android:name=".service.AliPushService"

+ 3 - 1
app/src/main/java/com/iscs/bozzys/ui/pages/home/SettingsCompose.kt

@@ -47,6 +47,7 @@ import com.iscs.bozzys.ui.common.PageBase
 import com.iscs.bozzys.ui.common.TipsDialog
 import com.iscs.bozzys.ui.pages.compose.CardContainer
 import com.iscs.bozzys.ui.pages.login.openPageLogin
+import com.iscs.bozzys.ui.pages.profile.openPageProfile
 import com.iscs.bozzys.ui.pages.vm.VMHome
 import com.iscs.bozzys.ui.theme.Text
 import com.iscs.bozzys.utils.BiometricKeyStore
@@ -54,7 +55,6 @@ import com.iscs.bozzys.utils.Storage
 import com.iscs.bozzys.utils.Storage.saveTokenIv
 import com.iscs.bozzys.utils.Storage.saveTokenIvValue
 import com.iscs.bozzys.utils.SystemUtil
-import com.iscs.bozzys.utils.SystemUtil.isBiometricCanUse
 
 @OptIn(ExperimentalStdlibApi::class)
 @Composable
@@ -181,6 +181,7 @@ private fun TopToolBar(pv: PaddingValues, vm: VMHome) {
  */
 @Composable
 private fun UserInfo(vm: VMHome) {
+    val ctx = LocalContext.current
     val state by vm.state.collectAsState()
     CardContainer(modifier = Modifier.padding(16.dp)) {
         Row(
@@ -188,6 +189,7 @@ private fun UserInfo(vm: VMHome) {
                 .fillMaxWidth()
                 .height(90.dp)
                 .background(brush = Brush.horizontalGradient(listOf(Color(0xFFFFF9E5), Color(0xFFFFFEFB))))
+                .clickable { ctx.openPageProfile() }
                 .padding(horizontal = 20.dp),
             verticalAlignment = Alignment.CenterVertically
         ) {

+ 67 - 0
app/src/main/java/com/iscs/bozzys/ui/pages/profile/PageProfile.kt

@@ -0,0 +1,67 @@
+package com.iscs.bozzys.ui.pages.profile
+
+import android.Manifest
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.os.Build
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.material3.Button
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import com.iscs.bozzys.ui.common.PageBase
+import com.iscs.bozzys.ui.common.Title
+import com.iscs.bozzys.utils.LogUtil
+import com.iscs.bozzys.utils.SystemUtil.uriToFile
+import java.io.File
+
+/**
+ * 打开用户中心
+ */
+fun Context.openPageProfile() {
+    startActivity(Intent(this, PageProfile::class.java))
+}
+
+/**
+ * 个人中心
+ */
+class PageProfile : PageBase() {
+
+    // 跳转到选择照片页面
+    private val imageLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
+        uriToFile(uri)?.let { onImagePickerFinish(it) }
+    }
+
+    // 照片选择成功回调
+    private var onImagePickerFinish: (file: File) -> Unit = {}
+
+    /**
+     * 执行照片选择
+     */
+    private fun pickerImage(done: (file: File) -> Unit) {
+        this.onImagePickerFinish = done
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
+            if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
+                requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1001)
+                return
+            }
+        }
+        imageLauncher.launch("image/*")
+    }
+
+    @Composable
+    override fun GetViews(pv: PaddingValues) {
+        Column() {
+            Title(pv, "个人中心")
+            Button({
+                pickerImage {
+                    LogUtil.i("xiaoming", "$it")
+                }
+            }) {
+                Text("选择照片")
+            }
+        }
+    }
+}

+ 17 - 0
app/src/main/java/com/iscs/bozzys/utils/SystemUtil.kt

@@ -2,6 +2,7 @@ package com.iscs.bozzys.utils
 
 import android.app.Activity
 import android.content.Context
+import android.net.Uri
 import android.os.Build
 import android.os.CancellationSignal
 import android.security.keystore.KeyGenParameterSpec
@@ -9,6 +10,7 @@ import android.security.keystore.KeyProperties
 import androidx.biometric.BiometricManager
 import androidx.biometric.BiometricPrompt
 import androidx.fragment.app.FragmentActivity
+import java.io.File
 import java.security.KeyStore
 import javax.crypto.Cipher
 import javax.crypto.KeyGenerator
@@ -94,6 +96,21 @@ object SystemUtil {
         }
     }
 
+    /**
+     * Uri转文件
+     */
+    fun Context.uriToFile(uri: Uri?): File? {
+        if (uri == null) return null
+        val input = contentResolver.openInputStream(uri)!!
+        val suffix = ".${contentResolver.getType(uri)!!.split("/")[1]}"
+        LogUtil.i("SystemUtil", "uriToFile -> 文件类型:$suffix")
+        val file = File(cacheDir, "upload_${System.currentTimeMillis()}$suffix")
+        file.outputStream().use { output ->
+            input.copyTo(output)
+        }
+        return file
+    }
+
 }
 
 /**