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

发表于2017-08-25
评论0 4.6k浏览

下面给大家介绍的湿实现一个 Unity for iOS 打开相册、相机及保存图片到相册的功能。主要有两个方面:1、unity 与 ios的交互、ios下的Objective-C的相关api。具体的看代码吧,有些注释。 

一,首上一张图:


二,上点代码代码

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

objective-c: IOSAlbumCameraController.h

[objc] view plain copy
  1. //  
  2. //  IOSAlbumCameraController.h  
  3. //  Unity-iPhone  
  4. //  
  5. //  Created by AnYuanLzh  
  6. //  
  7. //  
  8.   
  9. @interface IOSAlbumCameraController : UIViewController<uiimagepickercontrollerdelegate,uinavigationcontrollerdelegate>  </uiimagepickercontrollerdelegate,uinavigationcontrollerdelegate>
  10. @end  


objective-c: IOSAlbumCameraController.mm

[objc] view plain copy
  1. //  
  2. //  OpenPhotoController.m  
  3. //  
  4. //  Created by AnYuanLzh  
  5. //  
  6.   
  7. #import "IOSAlbumCameraController.h"  
  8.   
  9. @implementation IOSAlbumCameraController  
  10.   
  11. - (void)showActionSheet  
  12. {  
  13.     NSLog(@" --- showActionSheet !!");  
  14.       
  15.     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];  
  16.       
  17.     UIAlertAction *albumAction = [UIAlertAction actionWithTitle:@"相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {  
  18.         NSLog(@"click album action!");  
  19.         [self showPicker:UIImagePickerControllerSourceTypePhotoLibrary allowsEditing:YES];  
  20.     }];  
  21.       
  22.     UIAlertAction *cameraAction = [UIAlertAction actionWithTitle:@"相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {  
  23.         NSLog(@"click camera action!");  
  24.         [self showPicker:UIImagePickerControllerSourceTypeCamera allowsEditing:YES];  
  25.     }];  
  26.       
  27.     UIAlertAction *album_cameraAction = [UIAlertAction actionWithTitle:@"相册&相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {  
  28.         NSLog(@"click album&camera action!");  
  29.         //[self showPicker:UIImagePickerControllerSourceTypeCamera];  
  30.         [self showPicker:UIImagePickerControllerSourceTypeSavedPhotosAlbum allowsEditing:YES];  
  31.     }];  
  32.       
  33.     UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {  
  34.         NSLog(@"click cancel action!");  
  35.     }];  
  36.       
  37.       
  38.     [alertController addAction:albumAction];  
  39.     [alertController addAction:cameraAction];  
  40.     [alertController addAction:album_cameraAction];  
  41.     [alertController addAction:cancelAction];  
  42.       
  43.     UIViewController *vc = UnityGetGLViewController();  
  44.     [vc presentViewController:alertController animated:YES completion:^{  
  45.         NSLog(@"showActionSheet -- completion");  
  46.     }];  
  47. }  
  48.   
  49. - (void)showPicker:  
  50. (UIImagePickerControllerSourceType)type  
  51.      allowsEditing:(BOOL)flag  
  52. {  
  53.     NSLog(@" --- showPicker!!");  
  54.     UIImagePickerController *picker = [[UIImagePickerController alloc] init];  
  55.     picker.delegate = self;  
  56.     picker.sourceType = type;  
  57.     picker.allowsEditing = flag;  
  58.       
  59.     [self presentViewController:picker animated:YES completion:nil];  
  60. }  
  61.   
  62. // 打开相册后选择照片时的响应方法  
  63. - (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info  
  64. {  
  65.     NSLog(@" --- imagePickerController didFinishPickingMediaWithInfo!!");  
  66.     // Grab the image and write it to disk  
  67.     UIImage *image;  
  68.     UIImage *image2;  
  69.     image = [info objectForKey:UIImagePickerControllerEditedImage];  
  70.     UIGraphicsBeginImageContext(CGSizeMake(256,256));  
  71.     [image drawInRect:CGRectMake(00256256)];  
  72.     image2 = UIGraphicsGetImageFromCurrentImageContext();  
  73.     UIGraphicsEndImageContext();  
  74.       
  75.     // 得到了image,然后用你的函数传回u3d  
  76.     NSData *imgData;  
  77.     if(UIImagePNGRepresentation(image2) == nil)  
  78.     {  
  79.         NSLog(@" --- actionSheet slse!! 11 ");  
  80.         imgData= UIImageJPEGRepresentation(image, .6);  
  81.     }  
  82.     else  
  83.     {  
  84.         NSLog(@" --- actionSheet slse!! 22 ");  
  85.         imgData= UIImagePNGRepresentation(image2);  
  86.     }  
  87.       
  88.     NSString *_encodeImageStr = [imgData base64Encoding];  
  89.     UnitySendMessage( "UIUpload2(Clone)""PickImageCallBack_Base64", _encodeImageStr.UTF8String);  
  90.       
  91.     // 关闭相册  
  92.     [picker dismissViewControllerAnimated:YES completion:nil];  
  93. }  
  94.   
  95. // 打开相册后点击“取消”的响应  
  96. - (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker  
  97. {  
  98.     NSLog(@" --- imagePickerControllerDidCancel !!");  
  99.     [self dismissViewControllerAnimated:YES completion:nil];  
  100. }  
  101.   
  102. //- (void)dismissWrappedController  
  103. //{  
  104. //    NSLog(@" --- dismissWrappedController !!");  
  105. //    UIViewController *vc = UnityGetGLViewController();  
  106. //  
  107. //    if( !vc )  
  108. //      return;  
  109. //  
  110. //    [self performSelector:@selector(removeAndReleaseViewControllerWrapper) withObject:nil afterDelay:1.0];  
  111. //  
  112. //}  
  113. //- (void)removeAndReleaseViewControllerWrapper  
  114. //{  
  115. //    NSLog(@" --- removeAndReleaseViewControllerWrapper !!");  
  116. //  // iPad might have a popover  
  117. //  if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && _popoverViewController )  
  118. //  {  
  119. //      [_popoverViewController dismissPopoverAnimated:YES];  
  120. //      self.popoverViewController = nil;  
  121. //  }  
  122. //}  
  123.   
  124. // (void) saveImageToPhotosAlbum:(NSString*) base64  
  125. //{  
  126. //    NSLog(@"base64: ");  
  127. //    NSLog(base64);  
  128. //    const char* string = [base64 UTF8String];  
  129. //    NSData* imageData = [NSData dataWithBytes:string length:strlen(string) 1];  
  130. //    UIImage* image = [UIImage imageWithData:imageData];  
  131. //    UIImageWriteToSavedPhotosAlbum(image,  
  132. //                                   self,  
  133. //                                   @selector(image:didFinishSavingWithError:contextInfo:),  
  134. //                                   NULL);  
  135. //}  
  136. (void) saveImageToPhotosAlbum:(NSString*) readAdr  
  137. {  
  138.     NSLog(@"readAdr: ");  
  139.     NSLog(readAdr);  
  140.     UIImage* image = [UIImage imageWithContentsOfFile:readAdr];  
  141.     UIImageWriteToSavedPhotosAlbum(image,  
  142.                                    self,  
  143.                                    @selector(image:didFinishSavingWithError:contextInfo:),  
  144.                                    NULL);  
  145. }  
  146.   
  147. (void) image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo  
  148. {  
  149.     NSString* result;  
  150.     if(error)  
  151.     {  
  152.         result = @"图片保存到相册失败!";  
  153.     }  
  154.     else  
  155.     {  
  156.         result = @"图片保存到相册成功!";  
  157.     }  
  158.     UnitySendMessage( "UIUpload2(Clone)""SaveImageToPhotosAlbumCallBack", result.UTF8String);  
  159. }  
  160.   
  161. @end  
  162.   
  163. //------------- called by unity -----begin-----------------  
  164. #if defined (__cplusplus)  
  165. extern "C" {  
  166. #endif  
  167.       
  168.     // 弹出一个菜单项:相册、相机  
  169.     void _showActionSheet()  
  170.     {  
  171.         NSLog(@" -unity call-- _showActionSheet !!");  
  172.         IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];  
  173.         UIViewController *vc = UnityGetGLViewController();  
  174.         [vc.view addSubview: app.view];  
  175.           
  176.         [app showActionSheet];  
  177.     }  
  178.       
  179.     // 打开相册  
  180.     void _iosOpenPhotoLibrary()  
  181.     {  
  182.         if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])  
  183.         {  
  184.             IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];  
  185.             UIViewController *vc = UnityGetGLViewController();  
  186.             [vc.view addSubview: app.view];  
  187.               
  188.             [app showPicker:UIImagePickerControllerSourceTypePhotoLibrary allowsEditing:NO];  
  189.         }  
  190.         else  
  191.         {  
  192.             UnitySendMessage( "UIUpload2(Clone)""PickImageCallBack_Base64", (@"").UTF8String);  
  193.         }  
  194.     }  
  195.       
  196.     // 打开相册  
  197.     void _iosOpenPhotoAlbums()  
  198.     {  
  199.         if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])  
  200.         {  
  201.             IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];  
  202.             UIViewController *vc = UnityGetGLViewController();  
  203.             [vc.view addSubview: app.view];  
  204.               
  205.             [app showPicker:UIImagePickerControllerSourceTypeSavedPhotosAlbum allowsEditing:NO];  
  206.         }  
  207.         else  
  208.         {  
  209.             _iosOpenPhotoLibrary();  
  210.         }  
  211.     }  
  212.       
  213.     // 打开相机  
  214.     void _iosOpenCamera()  
  215.     {  
  216.         if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])  
  217.         {  
  218.             IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];  
  219.             UIViewController *vc = UnityGetGLViewController();  
  220.             [vc.view addSubview: app.view];  
  221.               
  222.             [app showPicker:UIImagePickerControllerSourceTypeCamera allowsEditing:NO];  
  223.         }  
  224.         else  
  225.         {  
  226.             UnitySendMessage( "UIUpload2(Clone)""PickImageCallBack_Base64", (@"").UTF8String);  
  227.         }  
  228.     }  
  229.       
  230.       
  231.     // 打开相册--可编辑  
  232.     void _iosOpenPhotoLibrary_allowsEditing()  
  233.     {  
  234.         if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])  
  235.         {  
  236.             IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];  
  237.             UIViewController *vc = UnityGetGLViewController();  
  238.             [vc.view addSubview: app.view];  
  239.               
  240.             [app showPicker:UIImagePickerControllerSourceTypePhotoLibrary allowsEditing:YES];  
  241.         }  
  242.         else  
  243.         {  
  244.             UnitySendMessage( "UIUpload2(Clone)""PickImageCallBack_Base64", (@"").UTF8String);  
  245.         }  
  246.           
  247.     }  
  248.       
  249.     // 打开相册--可编辑  
  250.     void _iosOpenPhotoAlbums_allowsEditing()  
  251.     {  
  252.         if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])  
  253.         {  
  254.             IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];  
  255.             UIViewController *vc = UnityGetGLViewController();  
  256.             [vc.view addSubview: app.view];  
  257.               
  258.             [app showPicker:UIImagePickerControllerSourceTypeSavedPhotosAlbum allowsEditing:YES];  
  259.         }  
  260.         else  
  261.         {  
  262.             _iosOpenPhotoLibrary();  
  263.         }  
  264.           
  265.     }  
  266.       
  267.     // 打开相机--可编辑  
  268.     void _iosOpenCamera_allowsEditing()  
  269.     {  
  270.         if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])  
  271.         {  
  272.             IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];  
  273.             UIViewController *vc = UnityGetGLViewController();  
  274.             [vc.view addSubview: app.view];  
  275.               
  276.             [app showPicker:UIImagePickerControllerSourceTypeCamera allowsEditing:YES];  
  277.         }  
  278.         else  
  279.         {  
  280.             UnitySendMessage( "UIUpload2(Clone)""PickImageCallBack_Base64", (@"").UTF8String);  
  281.         }  
  282.     }  
  283.       
  284.     // 保存照片到相册  
  285.     //    void _iosSaveImageToPhotosAlbum(char* base64)  
  286.     //    {  
  287.     //        NSString* temp = [NSString stringWithUTF8String:base64];  
  288.     //        [IOSAlbumCameraController saveImageToPhotosAlbum:temp];  
  289.     //    }  
  290.     void _iosSaveImageToPhotosAlbum(char* readAddr)  
  291.     {  
  292.         NSString* temp = [NSString stringWithUTF8String:readAddr];  
  293.         [IOSAlbumCameraController saveImageToPhotosAlbum:temp];  
  294.     }  
  295.       
  296. #if defined (__cplusplus)  
  297. }  
  298. #endif  
  299. //------------- called by unity -----end-----------------  

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

IOSAlbumCamera.cs

[csharp] view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Runtime.InteropServices;  
  4.   
  5. public class IOSAlbumCamera : MonoBehaviour  
  6. {  
  7.     #if UNITY_IPHONE  
  8.   
  9.     [DllImport ("__Internal")]  
  10.     private static extern void _iosOpenPhotoLibrary();  
  11.     [DllImport ("__Internal")]  
  12.     private static extern void _iosOpenPhotoAlbums();  
  13.     [DllImport ("__Internal")]  
  14.     private static extern void _iosOpenCamera();  
  15.     [DllImport ("__Internal")]  
  16.     private static extern void _iosOpenPhotoLibrary_allowsEditing();      
  17.     [DllImport ("__Internal")]  
  18.     private static extern void _iosOpenPhotoAlbums_allowsEditing();   
  19.     [DllImport ("__Internal")]  
  20.     private static extern void _iosOpenCamera_allowsEditing();  
  21.     [DllImport ("__Internal")]  
  22.     private static extern void _iosSaveImageToPhotosAlbum(string readAddr);  
  23.   
  24.     ///   
  25.     /// 打开照片  
  26.     ///   
  27.     ///   
  28.     public static void iosOpenPhotoLibrary(bool allowsEditing=false)  
  29.     {  
  30.         if (allowsEditing)  
  31.             _iosOpenPhotoLibrary_allowsEditing ();  
  32.         else  
  33.             _iosOpenPhotoLibrary ();  
  34.     }  
  35.   
  36.     ///   
  37.     /// 打开相册  
  38.     ///   
  39.     ///   
  40.     public static void iosOpenPhotoAlbums(bool allowsEditing=false)  
  41.     {  
  42.         if (allowsEditing)  
  43.             _iosOpenPhotoAlbums_allowsEditing ();  
  44.         else  
  45.             _iosOpenPhotoAlbums ();  
  46.     }  
  47.   
  48.     ///   
  49.     /// 打开相机  
  50.     ///   
  51.     ///   
  52.     public static void iosOpenCamera(bool allowsEditing=false)  
  53.     {  
  54.         if (allowsEditing)  
  55.             _iosOpenCamera_allowsEditing ();  
  56.         else  
  57.             _iosOpenCamera ();  
  58.     }  
  59.   
  60.     ///   
  61.     /// 保存图片到相册  
  62.     ///   
  63.     ///   
  64.     public static void iosSaveImageToPhotosAlbum(string readAddr)  
  65.     {  
  66.         _iosSaveImageToPhotosAlbum (readAddr);  
  67.     }  
  68.   
  69.     ///   
  70.     /// 将ios传过的string转成u3d中的texture  
  71.     ///   
  72.     ///   
  73.     ///   
  74.     public static Texture2D Base64StringToTexture2D(string base64)  
  75.     {  
  76.         Texture2D tex = new Texture2D (4, 4, TextureFormat.ARGB32, false);  
  77.         try  
  78.         {  
  79.             byte[] bytes = System.Convert.FromBase64String(base64);  
  80.             tex.LoadImage(bytes);  
  81.         }  
  82.         catch(System.Exception ex)  
  83.         {  
  84.             Debug.LogError(ex.Message);  
  85.         }  
  86.         return tex;  
  87.     }      
  88.   
  89.     private static IOSAlbumCamera _instance;  
  90.     public static IOSAlbumCamera Instance{getreturn _instance; }}  
  91.   
  92.     public System.Action<string> CallBack_PickImage_With_Base64;  
  93.     public System.Action<string> CallBack_ImageSavedToAlbum;  
  94.   
  95.     void Awake()  
  96.     {  
  97.         if (_instance != null)  
  98.         {  
  99.             DestroyImmediate(this);  
  100.             return;  
  101.         }  
  102.         _instance = this;  
  103.         //      GameObject go = new GameObject ("IOSAlbumCamera");  
  104.         //      _instance = go.AddComponent ();  
  105.     }  
  106.   
  107.     ///   
  108.     /// 打开相册相机后的从ios回调到unity的方法  
  109.     ///   
  110.     /// Base64.  
  111.     void PickImageCallBack_Base64(string base64)  
  112.     {  
  113.         if(CallBack_PickImage_With_Base64!=null)  
  114.         {  
  115.             CallBack_PickImage_With_Base64(base64);  
  116.         }  
  117.     }  
  118.   
  119.     ///   
  120.     /// 保存图片到相册后,从ios回调到unity的方法  
  121.     ///   
  122.     /// Message.  
  123.     void SaveImageToPhotosAlbumCallBack(string msg)  
  124.     {  
  125.         Debug.Log (" -- msg: "   msg);  
  126.         if(CallBack_ImageSavedToAlbum!=null)  
  127.         {  
  128.             CallBack_ImageSavedToAlbum(msg);  
  129.         }  
  130.     }  
  131.     #endif  
  132. }  

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: