一.Android
public void OpenAlbum() {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, 2);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if (requestCode == 2) {
// 从相册返回的数据
if (data != null) {
// 得到图片的全路径
Uri uri = data.getData(); //uri转换成file
uri = data.getData();
//----------
String[] arr = {MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery(uri, arr, null, null, null);
int img_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String img_path = cursor.getString(img_index);
File file = new File(img_path);
String path = file.getAbsolutePath();
UnityPlayer.UnitySendMessage("ScriptHolder","PicCallFunc",path);
// imageView.setImageURI(uri);
}
else
{
UnityPlayer.UnitySendMessage("ScriptHolder","PicCallFunc","");
}
}
}
二.iOS
IOSCameraController.h:
#import<QuartzCore/CADisplayLink.h>
@interface IOSCameraController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIPopoverPresentationControllerDelegate>
@end
IOSCameraController.m :
#import "IOSCameraController.h"
@implementation IOSCameraController
-(void)OpenCamera:(UIImagePickerControllerSourceType)type{
//创建UIImagePickerController实例
UIImagePickerController *picker;
picker= [[UIImagePickerController alloc]init];
//设置代理
picker.delegate = self;
//是否允许编辑 (默认为NO)
picker.allowsEditing = YES;
//设置照片的来源
picker.sourceType = type;
//展示选取照片控制器
if (picker.sourceType == UIImagePickerControllerSourceTypePhotoLibrary &&[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
picker.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController *popover = picker.popoverPresentationController;
//picker.preferredContentSize = [UIScreen mainScreen].bounds.size;
popover.delegate = self;
popover.sourceRect = CGRectMake(0, 0, 0, 0);
popover.sourceView = self.view;
popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:picker animated:YES completion:nil];
} else {
[self presentViewController:picker animated:YES completion:^{}];
}
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
[picker dismissViewControllerAnimated:YES completion:^{}];
UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];
if (image == nil) {
image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
}
//图片旋转
if (image.imageOrientation != UIImageOrientationUp) {
//图片旋转
image = [self fixOrientation:image];
}
NSString *imagePath = [self GetSavePath:@"Temp.jpg"];
[self SaveFileToDoc:image path:imagePath];
}
-(NSString*)GetSavePath:(NSString *)filename{
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [pathArray objectAtIndex:0];
return [docPath stringByAppendingPathComponent:filename];
}
-(void)SaveFileToDoc:(UIImage *)image path:(NSString *)path{
NSData *data;
if (UIImagePNGRepresentation(image)==nil) {
data = UIImageJPEGRepresentation(image, 1);
}else{
data = UIImagePNGRepresentation(image);
}
[data writeToFile:path atomically:YES];
UnitySendMessage("ScriptHolder", "PicCallFunc", "Temp.jpg");
}
// 打开相册后点击“取消”的响应
- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
NSLog(@" --- imagePickerControllerDidCancel !!");
[self dismissViewControllerAnimated:YES completion:nil];
UnitySendMessage( "ScriptHolder", "PicCallFunc", (@"").UTF8String);
}
#pragma mark 图片处理方法
//图片旋转处理
- (UIImage *)fixOrientation:(UIImage *)aImage {
CGAffineTransform transform = CGAffineTransformIdentity;
switch (aImage.imageOrientation) {
case UIImageOrientationDown:
case UIImageOrientationDownMirrored:
transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
transform = CGAffineTransformRotate(transform, M_PI);
break;
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
transform = CGAffineTransformRotate(transform, M_PI_2);
break;
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
transform = CGAffineTransformRotate(transform, -M_PI_2);
break;
default:
break;
}
switch (aImage.imageOrientation) {
case UIImageOrientationUpMirrored:
case UIImageOrientationDownMirrored:
transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
transform = CGAffineTransformScale(transform, -1, 1);
break;
case UIImageOrientationLeftMirrored:
case UIImageOrientationRightMirrored:
transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);
transform = CGAffineTransformScale(transform, -1, 1);
break;
default:
break;
}
// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.
CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
CGImageGetBitsPerComponent(aImage.CGImage), 0,
CGImageGetColorSpace(aImage.CGImage),
CGImageGetBitmapInfo(aImage.CGImage));
CGContextConcatCTM(ctx, transform);
switch (aImage.imageOrientation) {
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
// Grr...
CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);
break;
default:
CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);
break;
}
// And now we just create a new UIImage from the drawing context
CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
UIImage *img = [UIImage imageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
return img;
}
@end
#if defined(__cplusplus)
extern "C" {
#endif
void IOS_OpenCamera(){
IOSCameraController *app = [[IOSCameraController alloc]init];
UIViewController *vc = UnityGetGLViewController();
[vc.view addSubview:app.view];
[app OpenCamera:UIImagePickerControllerSourceTypeCamera];
}
void IOS_OpenAlbum(){
IOSCameraController *app = [[IOSCameraController alloc]init];
UIViewController *vc = UnityGetGLViewController();
[vc.view addSubview:app.view];
[app OpenCamera:UIImagePickerControllerSourceTypePhotoLibrary];
}
#if defined(__cplusplus)
}
#endif
OpenCameraOrAlbum.cs:
public class OpenCameraOrAlbum : MonoBehaviour {
#if UNITY_IOS
//引入在oc中定义的那两个方法
[DllImport("__Internal")]
private static extern void IOS_OpenCamera();
[DllImport("__Internal")]
private static extern void IOS_OpenAlbum();
public static void OpenAlBum()
{
IOS_OpenAlbum();
}
#endif
}
三.unity调用
public void OpenAlbum()
{
#if UNITY_ANDROID
jo.Call("OpenAlbum");
#elif UNITY_IPHONE
OpenCameraOrAlbum.OpenAlBum();
#endif
}
选择图片回调函数 :
public void PicCallFunc(string path)
{
if (path.Equals(""))
{
return;
}
string filePath = path;
#if UNITY_IPHONE
filePath = Application.persistentDataPath + "/" + path;
#endif
//通过路径加载本地图片
FileStream fs = new FileStream(filePath, FileMode.Open);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Close();
Texture2D originalTex = new Texture2D(400, 800);
var iSLoad = originalTex.LoadImage(buffer);
originalTex.Apply();
if (!iSLoad)
{
Debug.Log("Texture存在但生成Texture失败");
}
else
Decode(originalTex);
}
最后请注意 :
Android和iOS回调回来的第一个参数自己要修改,否则选择完图片时不会回调到你的函数的
参考列表 :
Unity3D与iOS的交互(未成功,不知什么情况)