访问相册

本文详细介绍了如何使用UIImagePickerController组件在iOS应用中获取本地相册图片、摄像头图片与视频,并通过判断资源类型实现不同场景的图片与视频获取与处理,包括前置/后置摄像头的启用、视频媒体类型的指定以及最终通过didFinishPickingMediaWithInfo方法判断并处理选中按钮以执行相应操作。
UIImagePickerController创建一个对象,
    //设置代理
    imgPickerCtrl.delegate = self;

1.获取本地相册图片

    //设置资源类型
    imgPickerCtrl.
sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
   
//弹出模态
    [self presentViewController:imgPickerCtrl animated:YES completion:nil];

点击”获取本地相册图片”,效果图:



//获取摄像头图片
判断摄像头的类型:前置/后置,有/无
 BOOL isAvailable = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];
   
   
if (!isAvailable) {
       
//如果没有摄像头,弹出框提示
       
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"提示" message:@"当前没有可用摄像头" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
        [alertView
show];
       
       
return;
    }
    //如果有,就启用摄像头拍照
    imgPickerCtrl.sourceType = UIImagePickerControllerSourceTypeCamera;
    [
self presentViewController:imgPickerCtrl animated:YES completion:nil];
   

/**
 * 
获取本地视频
 */
 imgPickerCtrl.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
   
//指定媒体类型,比如public.movie
imgPickerCtrl.mediaTypes = @[@"public.movie"];  
[self presentViewController:imgPickerCtrl animated:YES completion:nil];
   
/**
 * 
获取摄像头视频
 */
    imgPickerCtrl.sourceType = UIImagePickerControllerSourceTypeCamera;
   
   
//指定媒体类型
    imgPickerCtrl.
mediaTypes = @[@"public.movie"];
   
    [
self presentViewController:imgPickerCtrl animated:YES completion:nil];
    


通过 UIImagePickerController的选中方法didFinishPickingMediaWithInfo:判断选中的是那个按钮以做出相应操作;
    //取得mediaType,判断是图片还是视频
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
  
//如果是图片
    if ([mediaType isEqualToString:@"public.image"]) {
       
       
//获取选中的图片
       
UIImage *img = [info objectForKey:UIImagePickerControllerOriginalImage];
       
_imgView.image = img;
       
       
//如果是摄像头拍摄的则保存到本地
       
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
           
//将图片写到本地
           
UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
        }
       
    }
else if ([mediaType isEqualToString:@"public.movie"]){//视频
       
//获取视图的url
       
NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL];
       
       
//播放器播放(还没学)
    }

   
//关闭当前的模态视图
    [
self dismissViewControllerAnimated:YES completion:nil];
    

保存摄像头图片后还可以用 didFinishSavingWithError:方法进行操作,比如用弹出框提示@“保存成功"
   
### 使用 Android MediaStore API 访问相册的解决方案 在 Android 开发中,MediaStore 是访问设备上媒体文件(如图片、视频和音频)的标准方式。以下是一个完整的代码示例,展示如何使用 MediaStore API 访问相册中的图片。 #### 1. 获取相册图片路径 通过查询 `MediaStore.Images.Media.EXTERNAL_CONTENT_URI`,可以获取相册中的所有图片及其路径。以下是一个代码示例: ```kotlin fun getImagesFromGallery(context: Context): List<String> { val imagePaths = mutableListOf<String>() val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI val projection = arrayOf( MediaStore.Images.Media.DATA, // 图片路径 MediaStore.Images.Media._ID // 图片 ID ) val cursor = context.contentResolver.query(uri, projection, null, null, null) if (cursor != null && cursor.moveToFirst()) { do { val dataIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) val imagePath = cursor.getString(dataIndex) imagePaths.add(imagePath) } while (cursor.moveToNext()) } cursor?.close() return imagePaths } ``` 此代码从 `MediaStore.Images.Media.EXTERNAL_CONTENT_URI` 中提取图片路径,并将其存储到一个列表中[^1]。 #### 2. 删除相册中的图片 如果需要删除相册中的图片,可以通过 `_ID` 字段获取图片的 URI,并调用 `ContentResolver.delete()` 方法进行删除操作。 ```kotlin fun deleteImageFromGallery(context: Context, imageId: Long): Boolean { val uri = ContentUris.withAppendedId( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageId ) return context.contentResolver.delete(uri, null, null) > 0 } ``` 在此代码中,`ContentUris.withAppendedId()` 方法用于将 `_ID` 转换为 URI,然后通过 `ContentResolver.delete()` 方法删除指定的图片[^2]。 #### 3. 刷新 MediaStore 在删除图片后,可能需要刷新 MediaStore 数据库以确保更改生效。可以通过发送广播通知系统重新扫描外部存储来实现。 ```kotlin fun refreshMediaStore(context: Context) { context.sendBroadcast( Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(Environment.getExternalStorageDirectory())) ) } ``` 此代码发送了一个广播,通知系统重新扫描外部存储设备,从而更新 MediaStore 数据库[^3]。 #### 4. 权限管理 从 Android 10 开始,访问外部存储的方式发生了变化。应用可以直接读写自己创建的媒体文件,而无需申请额外权限。然而,如果需要访问其他应用创建的媒体文件,则需要申请相应的权限(如 `READ_MEDIA_IMAGES`)。以下是支持的目录及其权限说明: - **图片**:`MediaStore.Images.Media`,支持 `/DCIM/` 和 `/Pictures/` 目录。应用可自由读写自己创建的图片文件,无需权限;读取其他应用的图片需 `READ_MEDIA_IMAGES` 权限。 - **视频**:`MediaStore.Video.Media`,支持 `/DCIM/`、`/Movies/` 和 `/Pictures/` 目录。应用可自由读写自己创建的视频文件,无需权限;读取其他应用的视频需 `READ_MEDIA_VIDEO` 权限。 - **音频**:`MediaStore.Audio.Media`,支持 `/Music/`、`/Alarms/` 和 `/Podcasts/` 目录。应用可自由读写自己创建的音频文件,无需权限;读取其他应用的音频需 `READ_MEDIA_AUDIO` 权限[^4]。 ### 注意事项 - 在 Android 4.4 及以上版本中,`Intent.ACTION_GET_CONTENT` 和 `Intent.ACTION_OPEN_DOCUMENT` 返回的 URI 格式不同,因此需要根据实际情况处理 URI[^1]。 - 在 Android 10 及以上版本中,建议使用分区存储(Scoped Storage)来访问媒体文件。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值