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

发表于2017-09-23
评论0 2.9k浏览

在这里简单,实现一个 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);
        }
    }
}

三、u3d demo

下载

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

0个评论