获取手机相册

关于获取 手机相片的帖子一堆。但是里面很多的内容都是互相copy,有些方法写的不清楚,我在这里给大家完善下,代码如下:

Oc代码
  1. dispatch_async(dispatch_get_main_queue(),^{
  2. @autoreleasepool
  3. {
  4. ALAssetsLibraryAccessFailureBlockfailureBlock=^(NSError*error)
  5. {
  6. NSLog(@"相册访问失败=%@",[errorlocalizedDescription]);
  7. if([error.localizedDescriptionrangeOfString:@"Globaldeniedaccess"].location!=NSNotFound)
  8. {
  9. NSLog(@"无法访问相册.请在'设置->定位服务'设置为打开状态.");
  10. }
  11. else
  12. {
  13. NSLog(@"相册访问失败.");
  14. }
  15. };
  16. ALAssetsGroupEnumerationResultsBlockgroupBlock=^(ALAsset*result,NSUIntegerindex,BOOL*stop)
  17. {
  18. if(result!=NULL)
  19. {
  20. if([[resultvalueForProperty:ALAssetPropertyType]isEqualToString:ALAssetTypePhoto])
  21. {
  22. NSLog(@"index=%d",index);
  23. //NSString*urlStr=[NSStringstringWithFormat:@"%@",result.defaultRepresentation.url];//图片的url
  24. UIImage*img=[UIImageimageWithCGImage:result.thumbnail];
  25. [photoArraddObject:img];
  26. }
  27. }
  28. };
  29. ALAssetsLibraryGroupsEnumerationResultsBlocklibraryGroupBlock=^(ALAssetsGroup*group,BOOL*stop)
  30. {
  31. NSLog(@"stop=%d",stop?1:0);
  32. if(group==nil)
  33. {
  34. NSLog(@"group==nil结束");
  35. }
  36. if(group!=nil){
  37. NSString*g=[NSStringstringWithFormat:@"%@",group];
  38. NSLog(@"%@",g);
  39. [groupenumerateAssetsUsingBlock:groupBlock];
  40. }
  41. };
  42. ALAssetsLibrary*library=[[ALAssetsLibraryalloc]init];
  43. [libraryenumerateGroupsWithTypes:ALAssetsGroupAll
  44. usingBlock:libraryGroupBlock
  45. failureBlock:failureBlock];
  46. }
  47. });

打印结果:

>> stop = 1

>> ALAssetsGroup - Name:QQ, Type:Album, Assets count:0

>> stop = 1

>> ALAssetsGroup - Name:Camera Roll, Type:Saved Photos, Assets count:65

>> index = 0

.

.

.

>> index = 64

>> stop = 1

>> ALAssetsGroup - Name:My Photo Stream, Type:Photo Stream, Assets count:772

>> index = 0

.

.

.

>> index = 771

>> stop = 1

>> group == nil结束

以上为全部的日志。

其实代码很简单,就是几个block块的定义和实现,按照如下步骤执行。

1、先弹出是否允许访问相册。点击允许后

2、执行libraryGroupBlock(可以截取和分割字符串,获取相册相关信息)

3、执行groupBlock (该相册的照片信息,index是从0开始的。)

4、再执行libraryGroupBlock(有多少本相册,执行多少次)

5、再执行groupBlock

6、一直到>> group == nil 的时候,才算结束。

注:

700多张相片,存在集合里面(缩略图)

内存变化:(执行前)



内存变化:(执行后)


时间变化:(700多张相片

第一次点击,450ms,第二次 250ms ,第三次 250ms

去掉:

Oc代码
  1. UIImage*img=[UIImageimageWithCGImage:result.thumbnail];
  2. [photoArraddObject:img];

第一次点击,400ms,第二次 200ms ,第三次 200ms

照片中还有一起其他的属性如下:

Oc代码
  1. //唯一ID?
  2. NSString*uti=result.defaultRepresentation.UTI;
  3. NSLog(@"uti=%@",uti);
  4. //图片的长宽
  5. CGSizedimensions=result.defaultRepresentation.dimensions;
  6. NSLog(@"width=%f.height=%f",dimensions.width,dimensions.height);
  7. //图片的全屏图
  8. CGImageRefrefScreen=result.defaultRepresentation.fullScreenImage;
  9. //图片的高清图
  10. CGImageRefrefResolution=result.defaultRepresentation.fullResolutionImage;
  11. //图片名称
  12. NSString*fileName=result.defaultRepresentation.filename;
  13. NSLog(@"fileName=%@",fileName);
  14. //图片大小
  15. longlongsize=result.defaultRepresentation.size;
  16. NSLog(@"size=%lld",size);
  17. //图片原数据
  18. NSDictionary*metadata=result.defaultRepresentation.metadata;
  19. NSLog(@"metadata=%@",metadata);
  20. //图片方向
  21. ALAssetOrientationorientation=result.defaultRepresentation.orientation;
  22. NSLog(@"orientation=%d",orientation);
  23. //图片缩放大小
  24. floatscale=result.defaultRepresentation.scale;
  25. NSLog(@"scale=%f",scale);
  26. //图片URL
  27. NSURL*url=result.defaultRepresentation.url;
  28. NSLog(@"url=%@",url);

输出:

>>uti = public.jpeg(不知道UTI什么意思,所有图片都是一样)

>>width = 1260.000000 . height = 1680.000000

>>fileName = IMG_0670.JPG

>>size = 543520

>>metadata = {

ColorModel = RGB;

DPIHeight = 72;

DPIWidth = 72;

Depth = 8;

Orientation = 1;

PixelHeight = 1680;

PixelWidth = 1260;

"{Exif}" = {

ColorSpace = 1;

ComponentsConfiguration = (

1,

2,

3,

0

);

ExifVersion = (

2,

2,

1

);

FlashPixVersion = (

1,

0

);

PixelXDimension = 1260;

PixelYDimension = 1680;

SceneCaptureType = 0;

};

"{TIFF}" = {

Orientation = 1;

ResolutionUnit = 2;

XResolution = 72;

YResolution = 72;

};

}

>>orientation = 0

>>scale = 1.000000

>> url = assets-library://asset/asset.JPG?id=9801003C-5700-4670-B255-FCD27297B74A&ext=JPG

参考:

http://www.tuicool.com/articles/UBZJFb

http://blog.youkuaiyun.com/sbvfhp/article/details/12384707

http://blog.youkuaiyun.com/enuola/article/details/8160801

在 Unity 中,虽然没有直接提供内置 API 来访问手机相册,但可以通过使用第三方插件或自定义安卓插件来实现此功能。以下将详细介绍如何通过 NativeGallery 插件以及自定义安卓插件来获取手机相册中的图片。 ### 使用 NativeGallery 插件获取手机相册 NativeGallery 是一个免费的跨平台插件,支持 Android 和 iOS 设备,允许开发者轻松实现从设备图库中选择图像或视频的功能[^1]。以下是实现步骤: #### 1. 导入插件 将 NativeGallery 插件导入到 Unity 项目中。确保插件已正确安装并配置。 #### 2. 编写脚本以调用插件功能 以下是一个示例脚本,展示如何使用 NativeGallery 插件从手机相册中选择图片并显示在 Unity 的 `Image` 组件上: ```csharp using UnityEngine; using UnityEngine.UI; using NativeGallery; public class GetPhotoFromGallery : MonoBehaviour { public Button selectButton; public Image displayImage; private void Start() { selectButton.onClick.AddListener(SelectPhoto); } private void SelectPhoto() { NGallery.GetImageFromGallery((path) => { if (string.IsNullOrEmpty(path)) { Debug.Log("No image selected"); return; } StartCoroutine(LoadImageTexture(path)); }); } private System.Collections.IEnumerator LoadImageTexture(string path) { WWW www = new WWW("file://" + path); yield return www; if (www.error != null) { Debug.LogError("Error loading image: " + www.error); } else { Texture2D texture = new Texture2D(www.texture.width, www.texture.height); texture.SetPixels(www.texture.GetPixels()); texture.Apply(); Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); displayImage.sprite = sprite; } } } ``` #### 3. 配置权限 对于 Android 平台,需要在 `AndroidManifest.xml` 文件中添加读取外部存储的权限[^5]: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 对于 iOS 平台,需在 `Info.plist` 文件中声明相机和相册访问权限[^4]。 --- ### 使用自定义安卓插件获取手机相册 如果不想依赖第三方插件,可以创建自定义安卓插件来实现该功能。以下是具体步骤: #### 1. 创建安卓插件 在 Android Studio 中创建一个新的空项目,并编写用于打开相册的代码[^2]。例如,在 `MainActivity` 中添加以下方法: ```java import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import com.unity3d.player.UnityPlayerActivity; public class MainActivity extends UnityPlayerActivity { private static String LOG_TAG = "LOG_My"; Context mContext = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; } // Unity 调用此方法以打开相册 public void OpenGallery() { Log.d(LOG_TAG, "Opening gallery..."); Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, 1); } } ``` #### 2. 在 Unity 中调用插件 在 Unity 中通过以下代码调用安卓插件的方法: ```csharp using UnityEngine; public class OpenGalleryExample : MonoBehaviour { public void OpenGallery() { #if UNITY_ANDROID && !UNITY_EDITOR using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) using (AndroidJavaClass pluginClass = new AndroidJavaClass("com.example.plugin.MainActivity")) { pluginClass.Call("OpenGallery"); } #endif } } ``` #### 3. 处理返回结果 在安卓插件中处理用户选择的图片路径,并将其传递回 Unity[^3]。 --- ### 注意事项 - 确保 Unity 项目已正确配置以支持 Android 和 iOS 平台。 - 在使用插件或自定义安卓插件时,务必遵守相关平台的权限和隐私政策[^1]。 - 对于 iOS 平台,建议使用官方文档推荐的方式处理照片库访问[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值