偶然在网上看到一位博主写的 unity 和ios 交互 个人感觉 功能很全

转载地址:http://blog.csdn.net/AnYuanLzh/article/details/50748928

在这里简单,实现一个 Unity for iOS 打开相册、相机及保存图片到相册的功能。主要有两个方面:1、unity 与 ios的交互、ios下的objective-c的相关api。具体的看代码吧,有些注释。

一,首上一张图:

二,上点代码代码

先oc代码,一个头文件,一个实现文件

objective-c: IOSAlbumCameraController.h

//
//  IOSAlbumCameraController.h
//  Unity-iPhone
//
//  Created by AnYuanLzh
//
//@interface IOSAlbumCameraController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@end

objective-c: IOSAlbumCameraController.mm

//
//  OpenPhotoController.m
//
//  Created by AnYuanLzh
//#import "IOSAlbumCameraController.h"@implementation IOSAlbumCameraController- (void)showActionSheet
{NSLog(@" --- showActionSheet !!");UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];UIAlertAction *albumAction = [UIAlertAction actionWithTitle:@"相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {NSLog(@"click album action!");[self showPicker:UIImagePickerControllerSourceTypePhotoLibrary allowsEditing:YES];}];UIAlertAction *cameraAction = [UIAlertAction actionWithTitle:@"相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {NSLog(@"click camera action!");[self showPicker:UIImagePickerControllerSourceTypeCamera allowsEditing:YES];}];UIAlertAction *album_cameraAction = [UIAlertAction actionWithTitle:@"相册&相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {NSLog(@"click album&camera action!");//[self showPicker:UIImagePickerControllerSourceTypeCamera];[self showPicker:UIImagePickerControllerSourceTypeSavedPhotosAlbum allowsEditing:YES];}];UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {NSLog(@"click cancel action!");}];[alertController addAction:albumAction];[alertController addAction:cameraAction];[alertController addAction:album_cameraAction];[alertController addAction:cancelAction];UIViewController *vc = UnityGetGLViewController();[vc presentViewController:alertController animated:YES completion:^{NSLog(@"showActionSheet -- completion");}];
}- (void)showPicker:
(UIImagePickerControllerSourceType)typeallowsEditing:(BOOL)flag
{NSLog(@" --- showPicker!!");UIImagePickerController *picker = [[UIImagePickerController alloc] init];picker.delegate = self;picker.sourceType = type;picker.allowsEditing = flag;[self presentViewController:picker animated:YES completion:nil];
}// 打开相册后选择照片时的响应方法
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{NSLog(@" --- imagePickerController didFinishPickingMediaWithInfo!!");// Grab the image and write it to diskUIImage *image;UIImage *image2;image = [info objectForKey:UIImagePickerControllerEditedImage];UIGraphicsBeginImageContext(CGSizeMake(256,256));[image drawInRect:CGRectMake(0, 0, 256, 256)];image2 = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();// 得到了image,然后用你的函数传回u3dNSData *imgData;if(UIImagePNGRepresentation(image2) == nil){NSLog(@" --- actionSheet slse!! 11 ");imgData= UIImageJPEGRepresentation(image, .6);}else{NSLog(@" --- actionSheet slse!! 22 ");imgData= UIImagePNGRepresentation(image2);}NSString *_encodeImageStr = [imgData base64Encoding];UnitySendMessage( "UIUpload2(Clone)", "PickImageCallBack_Base64", _encodeImageStr.UTF8String);// 关闭相册[picker dismissViewControllerAnimated:YES completion:nil];
}// 打开相册后点击“取消”的响应
- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{NSLog(@" --- imagePickerControllerDidCancel !!");[self dismissViewControllerAnimated:YES completion:nil];
}//- (void)dismissWrappedController
//{
//    NSLog(@" --- dismissWrappedController !!");
//    UIViewController *vc = UnityGetGLViewController();
//
//    if( !vc )
//      return;
//
//    [self performSelector:@selector(removeAndReleaseViewControllerWrapper) withObject:nil afterDelay:1.0];
//
//}
//- (void)removeAndReleaseViewControllerWrapper
//{
//    NSLog(@" --- removeAndReleaseViewControllerWrapper !!");
//  // iPad might have a popover
//  if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && _popoverViewController )
//  {
//      [_popoverViewController dismissPopoverAnimated:YES];
//      self.popoverViewController = nil;
//  }
//}//+(void) saveImageToPhotosAlbum:(NSString*) base64
//{
//    NSLog(@"base64: ");
//    NSLog(base64);
//    const char* string = [base64 UTF8String];
//    NSData* imageData = [NSData dataWithBytes:string length:strlen(string)+1];
//    UIImage* image = [UIImage imageWithData:imageData];
//    UIImageWriteToSavedPhotosAlbum(image,
//                                   self,
//                                   @selector(image:didFinishSavingWithError:contextInfo:),
//                                   NULL);
//}
+(void) saveImageToPhotosAlbum:(NSString*) readAdr
{NSLog(@"readAdr: ");NSLog(readAdr);UIImage* image = [UIImage imageWithContentsOfFile:readAdr];UIImageWriteToSavedPhotosAlbum(image,self,@selector(image:didFinishSavingWithError:contextInfo:),NULL);
}+(void) image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo
{NSString* result;if(error){result = @"图片保存到相册失败!";}else{result = @"图片保存到相册成功!";}UnitySendMessage( "UIUpload2(Clone)", "SaveImageToPhotosAlbumCallBack", result.UTF8String);
}@end//------------- called by unity -----begin-----------------
#if defined (__cplusplus)
extern "C" {
#endif// 弹出一个菜单项:相册、相机void _showActionSheet(){NSLog(@" -unity call-- _showActionSheet !!");IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];UIViewController *vc = UnityGetGLViewController();[vc.view addSubview: app.view];[app showActionSheet];}// 打开相册void _iosOpenPhotoLibrary(){if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];UIViewController *vc = UnityGetGLViewController();[vc.view addSubview: app.view];[app showPicker:UIImagePickerControllerSourceTypePhotoLibrary allowsEditing:NO];}else{UnitySendMessage( "UIUpload2(Clone)", "PickImageCallBack_Base64", (@"").UTF8String);}}// 打开相册void _iosOpenPhotoAlbums(){if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]){IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];UIViewController *vc = UnityGetGLViewController();[vc.view addSubview: app.view];[app showPicker:UIImagePickerControllerSourceTypeSavedPhotosAlbum allowsEditing:NO];}else{_iosOpenPhotoLibrary();}}// 打开相机void _iosOpenCamera(){if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];UIViewController *vc = UnityGetGLViewController();[vc.view addSubview: app.view];[app showPicker:UIImagePickerControllerSourceTypeCamera allowsEditing:NO];}else{UnitySendMessage( "UIUpload2(Clone)", "PickImageCallBack_Base64", (@"").UTF8String);}}// 打开相册--可编辑void _iosOpenPhotoLibrary_allowsEditing(){if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];UIViewController *vc = UnityGetGLViewController();[vc.view addSubview: app.view];[app showPicker:UIImagePickerControllerSourceTypePhotoLibrary allowsEditing:YES];}else{UnitySendMessage( "UIUpload2(Clone)", "PickImageCallBack_Base64", (@"").UTF8String);}}// 打开相册--可编辑void _iosOpenPhotoAlbums_allowsEditing(){if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]){IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];UIViewController *vc = UnityGetGLViewController();[vc.view addSubview: app.view];[app showPicker:UIImagePickerControllerSourceTypeSavedPhotosAlbum allowsEditing:YES];}else{_iosOpenPhotoLibrary();}}// 打开相机--可编辑void _iosOpenCamera_allowsEditing(){if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];UIViewController *vc = UnityGetGLViewController();[vc.view addSubview: app.view];[app showPicker:UIImagePickerControllerSourceTypeCamera allowsEditing:YES];}else{UnitySendMessage( "UIUpload2(Clone)", "PickImageCallBack_Base64", (@"").UTF8String);}}// 保存照片到相册//    void _iosSaveImageToPhotosAlbum(char* base64)//    {//        NSString* temp = [NSString stringWithUTF8String:base64];//        [IOSAlbumCameraController saveImageToPhotosAlbum:temp];//    }void _iosSaveImageToPhotosAlbum(char* readAddr){NSString* temp = [NSString stringWithUTF8String:readAddr];[IOSAlbumCameraController saveImageToPhotosAlbum:temp];}#if defined (__cplusplus)
}
#endif
//------------- called by unity -----end-----------------

后然是:对应的在unity端的c#代码文件。

IOSAlbumCamera.cs

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;public class IOSAlbumCamera : MonoBehaviour
{#if UNITY_IPHONE[DllImport ("__Internal")]private static extern void _iosOpenPhotoLibrary();[DllImport ("__Internal")]private static extern void _iosOpenPhotoAlbums();[DllImport ("__Internal")]private static extern void _iosOpenCamera();[DllImport ("__Internal")]private static extern void _iosOpenPhotoLibrary_allowsEditing();    [DllImport ("__Internal")]private static extern void _iosOpenPhotoAlbums_allowsEditing(); [DllImport ("__Internal")]private static extern void _iosOpenCamera_allowsEditing();[DllImport ("__Internal")]private static extern void _iosSaveImageToPhotosAlbum(string readAddr);/// <summary>/// 打开照片/// </summary>/// <param name="allowsEditing"></param>public static void iosOpenPhotoLibrary(bool allowsEditing=false){if (allowsEditing)_iosOpenPhotoLibrary_allowsEditing ();else_iosOpenPhotoLibrary ();}/// <summary>/// 打开相册/// </summary>/// <param name="allowsEditing"></param>public static void iosOpenPhotoAlbums(bool allowsEditing=false){if (allowsEditing)_iosOpenPhotoAlbums_allowsEditing ();else_iosOpenPhotoAlbums ();}/// <summary>/// 打开相机/// </summary>/// <param name="allowsEditing"></param>public static void iosOpenCamera(bool allowsEditing=false){if (allowsEditing)_iosOpenCamera_allowsEditing ();else_iosOpenCamera ();}/// <summary>/// 保存图片到相册/// </summary>/// <param name="readAddr"></param>public static void iosSaveImageToPhotosAlbum(string readAddr){_iosSaveImageToPhotosAlbum (readAddr);}/// <summary>/// 将ios传过的string转成u3d中的texture/// </summary>/// <param name="base64"></param>/// <returns></returns>public static Texture2D Base64StringToTexture2D(string base64){Texture2D tex = new Texture2D (4, 4, TextureFormat.ARGB32, false);try{byte[] bytes = System.Convert.FromBase64String(base64);tex.LoadImage(bytes);}catch(System.Exception ex){Debug.LogError(ex.Message);}return tex;}    private static IOSAlbumCamera _instance;public static IOSAlbumCamera Instance{get{ return _instance; }}public System.Action<string> CallBack_PickImage_With_Base64;public System.Action<string> CallBack_ImageSavedToAlbum;void Awake(){if (_instance != null){DestroyImmediate(this);return;}_instance = this;//      GameObject go = new GameObject ("IOSAlbumCamera");//      _instance = go.AddComponent<IOSAlbumCamera> ();}/// <summary>/// 打开相册相机后的从ios回调到unity的方法/// </summary>/// <param name="base64">Base64.</param>void PickImageCallBack_Base64(string base64){if(CallBack_PickImage_With_Base64!=null){CallBack_PickImage_With_Base64(base64);}}/// <summary>/// 保存图片到相册后,从ios回调到unity的方法/// </summary>/// <param name="msg">Message.</param>void SaveImageToPhotosAlbumCallBack(string msg){Debug.Log (" -- msg: " + msg);if(CallBack_ImageSavedToAlbum!=null){CallBack_ImageSavedToAlbum(msg);}}#endif
}

最后非常感谢 这位博主~

【Ios】 Unity for iOS 打开相册、相机及保存图片到相册相关推荐

  1. Qt之打开IOS相册图片和保存图片到相册

    打开相册图片很简单,这里主要说明的是保存图片到相册的两种情况:1.已知图片路径,保存到相册:2.将QImage直接保存到相册 一.打开相册图片 这里需要设置xcode工程的相册权限Privacy - ...

  2. Unity for IOS 加载手机相册图片以及打开相机拍照获取图片

    Unity for IOS 加载手机相册图片以及打开相机拍照获取图片 最近想做一个使用unity for IOS获取手机图片的功能,所以就研究了一下 这里我们需要创建两个objective-c文件,最 ...

  3. Unity与IOS交互,调用相机相册,兼容ipad

    IOS篇 在处理unity和ios的时候,除了对oc不太习惯以外,还有就是iphone和ipad有些方法需要做区别.比如通用的弹窗方法不用,以及ipad上打开相册竟然可以支持显示的相册不是全屏了!好吧 ...

  4. Unity功能记录(一) ------ 截图/录屏保存到相册(Android/iOS横屏竖屏都可以)

    截屏和录屏unity端代码都已经分享过 : Unity功能记录(十七) ------ 截屏功能 Unity插件(二) ------ NatCorder(录屏保存到相册) 但是之前一个个的其实并没有用在 ...

  5. ios 保存图片到相册 崩溃_iOS开发之 保存图片到相册(相机胶卷)

    平时开发APP时难免会遇到保存图片到相册的相关操作,具体我么可以直接保存到系统的相机胶卷, 也可以自定义相册保存图片,下面我们就一起来看一看. 保存图片到系统相册 先看看比较简单的直接保存图片到系统相 ...

  6. iOS 相册相机应用2

    在iOS中要拍照和录制视频最简单的方式就是调用UIImagePickerController,UIImagePickerController继承与UINavigationController,需要使用 ...

  7. iOS判断是否有权限访问相机,相册,定位

    2019独角兽企业重金招聘Python工程师标准>>> iOS判断是否有权限访问相机,相册,定位 原文地址:判断是否有权限访问相机,相册,定位 1.判断用户是否有权限访问相册 #im ...

  8. html5 调用系统相册,iOS之H5调用系统相册相机浏览文件

    在我们iOS开发中大家遇到过H5和原生交互,需要上传文件,刚开始的思路肯定是在之前轻车熟路的js交互中原生方法获取文件之后上传,今天我们了解一个新的方法,其实苹果官方给我们提供了一个更简单的方法, H ...

  9. Unity 发布IOS平台并部署到真机上测试的方法

    准备 Mac OS系统 使用Unity做IOS开发,需要一台苹果系统的电脑,如果没有,那就用虚拟机或者安装黑苹果吧,虽然Windows版Unity也可以跨平台发布IOS,但是问题多的让你怀疑人生. 虚 ...

最新文章

  1. 计算机绘图 招聘,计算机绘图-网课答案.pdf
  2. 在线实时大数据平台Storm集群组件学习
  3. 科技论文的组织-如何写好科技论文之我见(四)
  4. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)
  5. 腾讯光子《黎明觉醒》技术美术负责人:如何制作超真实的开放世界?
  6. 系统测试分类和测试常用方法
  7. 法拉利杀手Koenigsegg CCX
  8. 用Java代码敲出简易的王者荣耀单机版,让你秒懂王者荣耀的运行机制
  9. 设x、y、t均为int型变量,则执行语句:t=3; x=y=2; t=x++||++y; 后,变量t和y的值分别为
  10. 深度相机:结构光、TOF、双目相机
  11. Python利用pptx模块三步将图片插入特定PPT模板
  12. 网络在线电视专家 v7.27 怎么用
  13. 考取RHCE认证的历程,总结的经验
  14. 理解ESP32 Flash烧写的DOUT/DIO/QOUT/QIO配置
  15. Duplicate entry '1106a210d0794c45a005ef034bc1b664' for key 'PRIMARY'
  16. Facade(外观)
  17. 王者营地显示主宰进攻服务器是什么意思,王者营地战斗力什么意思?战斗力意思解释[多图]...
  18. 使用计算机录音需要准被硬件和,电脑音频的制作及录音分析
  19. matlab 开普勒方程,理论力学中非线性问题的 MATLAB数值解
  20. 从零开始学习Linux运维,成为IT领域翘楚(六)

热门文章

  1. Linux 命令tail -f | 管道条件(sed,awk)文件,不输出原因
  2. 上门按摩预约小程序APP软件系统部署讲解
  3. 蓝牙技术|蓝牙BLE促进物联网资产跟踪的发展
  4. 分析哪个国家在总体幸福指数上排名最高,中国居然80名以外?
  5. VL34-整数倍数据位宽转换8to16。其中,先到的8bit数据应置于输出16bit的高8位!
  6. 育网校园云盘软件简介(四维一体解决方案)
  7. php 取字符串中的字母数字,php如何提取字符串中的数字?php提取字符串中数字的方法总结(附代码)...
  8. 【1.2】 评价类模型之层次分析法中判断矩阵的填写方法、一致性检验的步骤、以及根据判断矩阵计算权重的方法
  9. RPC服务器不可用,问题解决
  10. 【嵌入式】超详细的嵌入式路径学习精选合集,建议收藏