查询获得图片picture URI.

本文介绍了一种通过Android系统API获取指定联系人的照片URI的方法。该方法首先构建联系人的URI,然后通过查询系统数据获取联系人照片的具体路径。

public Uri getPhotoUri() { 
       
Uri person = ContentUris.withAppendedId( 
               
ContactsContract.Contacts.CONTENT_URI, Long.parseLong(getId())); 
       
Uri photo = Uri.withAppendedPath(person, 
               
ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); 
 
       
Cursor cur = this.ctx 
               
.getContentResolver() 
               
.query( 
                       
ContactsContract.Data.CONTENT_URI, 
                       
null, 
                       
ContactsContract.Data.CONTACT_ID 
                               
+ "=" 
                               
+ this.getId() 
                               
+ " AND " 
                               
+ ContactsContract.Data.MIMETYPE 
                               
+ "='" 
                               
+ ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE 
                               
+ "'", null, null); 
       
if (cur != null) { 
           
if (!cur.moveToFirst()) { 
               
return null; // no photo 
           
} 
       
} else { 
           
return null; // error in cursor process 
       
} 
       
return photo; 
   
} 

@Composable fun Picture( hasPermission: Boolean, selectedImageUri: Uri?, onPermissionChanged: (Boolean) -> Unit, onSelectedImageUri: (Uri?) -> Unit ) { val context = LocalContext.current // 确定所需权限 val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { arrayOf( android.Manifest.permission.READ_MEDIA_IMAGES, android.Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED ) } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { arrayOf(android.Manifest.permission.READ_MEDIA_IMAGES) } else { arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE) } // 检查权限(优化键值为Unit,确保只执行一次) LaunchedEffect(Unit) { val hasPermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { permissions.all { ContextCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED } } else { ContextCompat.checkSelfPermission(context, permissions[0]) == PackageManager.PERMISSION_GRANTED } onPermissionChanged(hasPermission) } // 多权限请求启动器 val requestPermissionLauncher = rememberLauncherForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { results: Map<String, Boolean>-> val allGranted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { results.all { it.value } } else { results.values.firstOrNull() == true } onPermissionChanged(allGranted) } // 图片选择器启动器 val pickMediaLauncher = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { rememberLauncherForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri: Uri? -> onSelectedImageUri(uri) } } else { null } val getContentLauncher = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> onSelectedImageUri(uri) } } else { null } // 选择图片逻辑(优化参数传递) fun selectImage() { if (hasPermission) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { pickMediaLauncher?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) } else { getContentLauncher?.launch("image/*") } } else { requestPermissionLauncher.launch(permissions) } } Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.padding(16.dp) ) { if (selectedImageUri != null) { Image( painter = rememberAsyncImagePainter(selectedImageUri), contentDescription = "Selected image", modifier = Modifier .size(300.dp) .padding(bottom = 16.dp), contentScale = ContentScale.Crop ) } else { Text("点击下方按钮选择图片") } Button( onClick = {selectImage()} ) { Text("选这图片") } } } 将图片永久保存到app文件目录下
最新发布
10-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值