【Ios】 Unity for iOS 打开相册、相机及保存图片到相册
发表于2017-08-25
下面给大家介绍的湿实现一个 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> </uiimagepickercontrollerdelegate,uinavigationcontrollerdelegate>
- @end
- //
- // 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)type
- allowsEditing:(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 disk
- UIImage *image;
- UIImage *image2;
- image = [info objectForKey:UIImagePickerControllerEditedImage];
- UIGraphicsBeginImageContext(CGSizeMake(256,256));
- [image drawInRect:CGRectMake(0, 0, 256, 256)];
- image2 = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- // 得到了image,然后用你的函数传回u3d
- NSData *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);
- ///
- /// 打开照片
- ///
- ///
- public static void iosOpenPhotoLibrary(bool allowsEditing=false)
- {
- if (allowsEditing)
- _iosOpenPhotoLibrary_allowsEditing ();
- else
- _iosOpenPhotoLibrary ();
- }
- ///
- /// 打开相册
- ///
- ///
- public static void iosOpenPhotoAlbums(bool allowsEditing=false)
- {
- if (allowsEditing)
- _iosOpenPhotoAlbums_allowsEditing ();
- else
- _iosOpenPhotoAlbums ();
- }
- ///
- /// 打开相机
- ///
- ///
- public static void iosOpenCamera(bool allowsEditing=false)
- {
- if (allowsEditing)
- _iosOpenCamera_allowsEditing ();
- else
- _iosOpenCamera ();
- }
- ///
- /// 保存图片到相册
- ///
- ///
- public static void iosSaveImageToPhotosAlbum(string readAddr)
- {
- _iosSaveImageToPhotosAlbum (readAddr);
- }
- ///
- /// 将ios传过的string转成u3d中的texture
- ///
- ///
- ///
- 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
(); - }
- ///
- /// 打开相册相机后的从ios回调到unity的方法
- ///
- /// Base64.
- void PickImageCallBack_Base64(string base64)
- {
- if(CallBack_PickImage_With_Base64!=null)
- {
- CallBack_PickImage_With_Base64(base64);
- }
- }
- ///
- /// 保存图片到相册后,从ios回调到unity的方法
- ///
- /// Message.
- void SaveImageToPhotosAlbumCallBack(string msg)
- {
- Debug.Log (" -- msg: " msg);
- if(CallBack_ImageSavedToAlbum!=null)
- {
- CallBack_ImageSavedToAlbum(msg);
- }
- }
- #endif
- }