4.21 | 冲刺day3

接着搞吃药模块

想要把图片上传到数据库,图片转BitMap再转Base64,数据库经常出问题,还有权限调用,前后端交互什么的,调试了好久

 我用的jetpack写的



@Composable
private fun uriToBitmap(uri: Uri): Bitmap? {
    return runCatching {
        val context = LocalContext.current
        val contentResolver = context.contentResolver
        BitmapFactory.decodeStream(contentResolver.openInputStream(uri))
    }.getOrNull()
}

@Composable
fun AddEatMedicinePage(navController: NavHostController) {

    // 吃药次数
    var timesIndex by remember { mutableIntStateOf(0) }
    // 每次药量
    var mountIndex by remember { mutableIntStateOf(0) }
    // 第一次药的吃药时间
    var startTimeIndex by remember { mutableIntStateOf(0) }

    var isTimesDropdownExpanded by remember { mutableStateOf(false) }
    var isMountDropdownExpanded by remember { mutableStateOf(false) }
    var isStartTimeDropdownExpanded by remember { mutableStateOf(false) }

    var imageUri by remember { mutableStateOf<Uri?>(null) }
    var baseString by remember {
        mutableStateOf("")
    }

    val presetTimes = listOf("一日一次","一日两次","一日三次","一日四次","一日五次")
    val presetMounts= listOf("一次一片(粒)","一次两片(粒)","一次三片(粒)","一次四片(粒)","一次五片(粒)","一次六片(粒)")
    val presetStartTimes = listOf("08:00", "12:00", "18:00", "22:00")

    val context = LocalContext.current

    val launcher = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri ->
        imageUri = uri
    }

    val requestPermissionLauncher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
        if (isGranted) {
            launcher.launch("image/*")
        } else {
            Toast.makeText(context, "需要存储权限以选择图片", Toast.LENGTH_SHORT).show()
        }
    }

    fun handleImageClick() {
        requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
    }

    Surface(
        modifier = Modifier.fillMaxSize(),
        color = Color.White
    ) {
        Column(
            modifier = Modifier
                .padding(horizontal = 16.dp)
                .verticalScroll(rememberScrollState()),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            //ImageBox(imageUri = imageUri, onClick = ::handleImageClick,baseString)

            Box(
                modifier = Modifier
                    .fillMaxWidth()
                    .height(200.dp)
                    .background(Color.Gray, shape = RoundedCornerShape(8.dp))
                    .clickable(onClick = ::handleImageClick)
            ) {
                imageUri?.let { uri ->
                    val bitmap = uriToBitmap(uri)
                    val byteArrayOutputStream = ByteArrayOutputStream()
                    bitmap!!.compress(
                        Bitmap.CompressFormat.PNG,
                        70,
                        byteArrayOutputStream
                    )
                    val byteArray = byteArrayOutputStream.toByteArray()
                    val base64String: String = Base64.encodeToString(byteArray, Base64.DEFAULT)
                    baseString=base64String
                    Log.e("TAG", "ImageBox: ${base64String}", )
                    bitmap?.asImageBitmap()?.let { imageBitmap ->
                        Image(
                            bitmap = imageBitmap,
                            contentDescription = "Uploaded Image",
                            modifier = Modifier.fillMaxSize(),
                            contentScale = ContentScale.Crop
                        )
                    }
                } ?: run {
                    Image(
                        painter = painterResource(id = R.drawable.dolar), // 替换成你的初始图片资源
                        contentDescription = "Placeholder Image",
                        modifier = Modifier.fillMaxSize(),
                        contentScale = ContentScale.Crop
                    )
                }
            }

            Spacer(modifier = Modifier.height(16.dp))

            DropdownSelector(
                label = "选择吃药次数",
                options = presetTimes,
                selectedIndex = timesIndex,
                isDropdownExpanded = isTimesDropdownExpanded,
                onDropdownExpandedChange = { isTimesDropdownExpanded = it },
                onOptionSelected = { timesIndex = it }
            )

            DropdownSelector(
                label = "选择每次药量",
                options = presetMounts,
                selectedIndex = mountIndex,
                isDropdownExpanded = isMountDropdownExpanded,
                onDropdownExpandedChange = { isMountDropdownExpanded = it },
                onOptionSelected = { mountIndex = it }
            )

            DropdownSelector(
                label = "选择第一次吃药时间",
                options = presetStartTimes,
                selectedIndex = startTimeIndex,
                isDropdownExpanded = isStartTimeDropdownExpanded,
                onDropdownExpandedChange = { isStartTimeDropdownExpanded = it },
                onOptionSelected = { startTimeIndex = it }
            )

            Spacer(modifier = Modifier.height(16.dp))

            Button(
                onClick = {
                    onClickA(Medicine(null,baseString,timesIndex+1,mountIndex+1,presetStartTimes[startTimeIndex]))
                    navController.navigate("medicine")
                },
                modifier = Modifier.fillMaxWidth()
            ) {
                Text("确认")
            }
        }
    }
}

fun onClickA(medicine: Medicine) {
    val service= ServiceCreator.create(MedicineService::class.java)
    service.add(medicine).enqueue(object :retrofit2.Callback<String>{
        override fun onResponse(call: Call<String>, response: Response<String>) {
            Log.e("?????", "onResponse: ${response.body().toString()}" )
        }

        override fun onFailure(call: Call<String>, t: Throwable) {
            Log.e("????", "onFailure: ${t.toString()}")
        }


    })
}

@Composable
fun DropdownSelector(
    label: String,
    options: List<String>,
    selectedIndex: Int,
    isDropdownExpanded: Boolean,
    onDropdownExpandedChange: (Boolean) -> Unit,
    onOptionSelected: (Int) -> Unit
) {
    Column {
        OutlinedTextField(
            value = options[selectedIndex],
            onValueChange = {},
            label = { Text(label) },
            readOnly = true,
            trailingIcon = {
                Icon(
                    imageVector = Icons.Default.ArrowDropDown,
                    contentDescription = null,
                    modifier = Modifier.clickable { onDropdownExpandedChange(!isDropdownExpanded) }
                )
            },
            modifier = Modifier
                .fillMaxWidth()
                .clickable { onDropdownExpandedChange(!isDropdownExpanded) }
        )
        DropdownMenu(
            expanded = isDropdownExpanded,
            onDismissRequest = { onDropdownExpandedChange(false) }
        ) {
            options.forEachIndexed { index, option ->
                DropdownMenuItem(
                    onClick = {
                        onOptionSelected(index)
                        onDropdownExpandedChange(false)
                    },
                    text = { Text(text = option) }
                )
            }
        }
    }
}

 

posted on 2024-04-21 23:37  Daniel350  阅读(8)  评论(0)    收藏  举报