有需要查看安卓读取相册的,请看我上一篇文章: Unity3D读取android相册(不裁剪)
这个主要参考了这篇文章http://blog.youkuaiyun.com/AnYuanLzh/article/details/50748928,建议先移步看一下再回来看这篇。
我做了一点修改。主要是不裁剪照片。在代码中有标注。
直接Copy代码:
Xcode部分:
//
// IOSAlbumCameraController.h
// Unity-iPhone
//
// Created by AnYuanLzh
//
//
@interface IOSAlbumCameraController : UIViewController<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(280,428));
// [image drawInRect:CGRectMake(0, 0, 280, 428)];
//<-主要修改了这里image = [info objectForKey:UIImagePickerControllerEditedImage];->
// 将它改为不编辑类型的参数,如下
image = [info objectForKey:UIImagePickerControllerOriginalImage];
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( "Main Camera", "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( "Main Camera", "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( "Main Camera", "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( "Main Camera", "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( "Main Camera", "PickImageCallBack_Base64", (@"").UTF8String);
}
}
// 打开相册--可编辑
void _iosOpenPhotoAlbums_allowsEditing()
{
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
{
NSLog(@"打开相册");
IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];
UIViewController *vc = UnityGetGLViewController();
[vc.view addSubview: app.view];
[app showPicker:UIImagePickerControllerSourceTypeSavedPhotosAlbum allowsEditing:YES];
}
else
{
NSLog(@"打开相册==这是啥?");
_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( "Main Camera", "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-----------------
Unity3D:
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 (256, 256, TextureFormat.ARGB32, false);
try
{
byte[] bytes = System.Convert.FromBase64String(base64);
bool isOK= tex.LoadImage(bytes);
Debug.Log("Are You OK? " + isOK.ToString());
}
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)
{
Debug.Log("选图后回调 了 ");
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);
}
}
}