Unity for iOS 打开相册、相机及保存图片到相册
发表于2017-09-23
在这里简单,实现一个 Unity for iOS 打开相册、相机及保存图片到相册的功能。主要有两个方面:1、unity 与 ios的交互、ios下的objective-c的相关api。具体的看代码吧,有些注释。
以后有时间,再弄一个android版的上来。
一,首上一张图:
二,上点代码代码
先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)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( "IOSAlbumCamera", "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( "IOSAlbumCamera", "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( "IOSAlbumCamera", "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( "IOSAlbumCamera", "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( "IOSAlbumCamera", "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( "IOSAlbumCamera", "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 { [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); } } }