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) } ) } } } }
浙公网安备 33010602011771号