Unity功能记录(一) ------ 截图/录屏保存到相册(Android/iOS横屏竖屏都可以)
截屏和录屏unity端代码都已经分享过 :
Unity功能记录(十七) ------ 截屏功能
Unity插件(二) ------ NatCorder(录屏保存到相册)
但是之前一个个的其实并没有用在项目上,可能会有点小坑,因此此次用在项目上的完整代码再次记录一下
一.截屏
Unity端代码 :
void RecordFrame(){DateTime now = new DateTime();now = DateTime.Now;string filename = string.Format("image{0}{1}{2}{3}.png", now.Day, now.Hour, now.Minute, now.Second);Texture2D texture = CaptureScreen(ARControll.Instance.CaptureCamera,new Rect(0,0,Screen.width,Screen.height));string destination = "";if (Application.platform == RuntimePlatform.Android){destination = "/mnt/sdcard/DCIM/Screenshots";if (!Directory.Exists(destination)){Directory.CreateDirectory(destination);}destination = destination + "/" + filename;Debug.Log(destination);File.WriteAllBytes(destination, texture.EncodeToPNG());// 安卓在这里需要去 调用原生的接口去 刷新一下,不然相册显示不出来using (AndroidJavaClass playerActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){using (AndroidJavaObject jo = playerActivity.GetStatic<AndroidJavaObject>("currentActivity")){Debug.Log("scanFile:m_androidJavaObject ");jo.Call("scanFile", destination);}}MainControll.Instance.OpenTip(TipType.OneBtn, TipContentType.defaultTip, null, null, "拍照成功!", PanelLayer.Top);}else if (Application.platform == RuntimePlatform.IPhonePlayer){destination = Application.persistentDataPath;if (!Directory.Exists(destination)){Directory.CreateDirectory(destination);}destination = destination + "/" + filename;File.WriteAllBytes(destination, texture.EncodeToPNG());
#if UNITY_IOSIOSAlbumCamera.iosSaveImageToPhotosAlbum(destination);
#endif}else{File.WriteAllBytes(Application.persistentDataPath + filename, texture.EncodeToPNG());}// cleanupDestroy(texture);}
Android刷新相册代码 :
//刷新相册public void scanFile(String filePath) {//Log.i("Unity", "------------filePath"+filePath);Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);scanIntent.setData(Uri.fromFile(new File(filePath)));this.sendBroadcast(scanIntent); //this是指UnityPlayerActivity}
iOS保存图片到相册代码(这里一起放了保存视频到相册的代码) :
IOSAlbumCameraController.h :
#import<QuartzCore/CADisplayLink.h>
@interface IOSAlbumCameraController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIPopoverPresentationControllerDelegate>
@end
IOSAlbumCameraController.mm :
#import "IOSAlbumCameraController.h"@implementation IOSAlbumCameraController
- (void)leftAction
{[self interfaceOrientation:UIInterfaceOrientationPortrait];
}- (void)rightAction
{[self interfaceOrientation:UIInterfaceOrientationLandscapeRight];
}- (void)interfaceOrientation:(UIInterfaceOrientation)orientation
{if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {SEL selector = NSSelectorFromString(@"setOrientation:");NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];[invocation setSelector:selector];[invocation setTarget:[UIDevice currentDevice]];int val = orientation;// 从2开始是因为0 1 两个参数已经被selector和target占用[invocation setArgument:&val atIndex:2];[invocation invoke];}
}
-(void)OpenCamera:(UIImagePickerControllerSourceType)type{[self interfaceOrientation:UIInterfaceOrientationPortrait];//创建UIImagePickerController实例UIImagePickerController * picker = [[UIImagePickerController alloc] init];picker.sourceType = UIImagePickerControllerSourceTypeCamera;//设置代理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{[self interfaceOrientation:UIInterfaceOrientationLandscapeRight];UnitySendMessage("MainScriptHolder", "PicCallFunc", "Temp.jpg");NSData *data;if (UIImagePNGRepresentation(image)==nil) {data = UIImageJPEGRepresentation(image, 1);}else{data = UIImagePNGRepresentation(image);}[data writeToFile:path atomically:YES];
}
// 打开相册后点击“取消”的响应
- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{NSLog(@" --- imagePickerControllerDidCancel !!");[self interfaceOrientation:UIInterfaceOrientationLandscapeRight];UnitySendMessage( "MainScriptHolder", "PicCallFunc", (@"").UTF8String);[self dismissViewControllerAnimated:YES completion:nil];
}
#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 contextCGImageRef cgimg = CGBitmapContextCreateImage(ctx);UIImage *img = [UIImage imageWithCGImage:cgimg];CGContextRelease(ctx);CGImageRelease(cgimg);return img;
}+(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( "MainScriptHolder", "SaveImageToPhotosAlbumCallBack", result.UTF8String);
}
//videoPath为视频下载到本地之后的本地路径
+ (void)saveVideo:(NSString *)videoPath{NSLog(@"路径:%@",videoPath);if (videoPath) {NSURL *url = [NSURL URLWithString:videoPath];if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(url.path) == NO) {NSLog(@"可以保存 ");}else{ NSLog(@"不可以保存 ");}//保存相册核心代码UISaveVideoAtPathToSavedPhotosAlbum(url.path, self, @selector(savedVedioImage:didFinishSavingWithError:contextInfo:), nil);}
}
//保存视频完成之后的回调
+ (void) savedVedioImage:(UIImage*)image didFinishSavingWithError: (NSError *)error contextInfo: (void *)contextInfo {NSString* result;if (error) {result =@"视频保存失败";}else {result =@"保存视频成功";}UnitySendMessage( "MainScriptHolder", "SaveVedioToPhotosAlbumCallBack", result.UTF8String);
}
@end#if defined (__cplusplus)
extern "C" {
#endif// 打开相册void _iosOpenPhotoAlbums(){IOSAlbumCameraController *app = [[IOSAlbumCameraController alloc]init];UIViewController *vc = UnityGetGLViewController();[vc.view addSubview:app.view];[app OpenCamera:UIImagePickerControllerSourceTypePhotoLibrary];}void _iosSaveImageToPhotosAlbum(char* readAddr){NSString* temp = [NSString stringWithUTF8String:readAddr];[IOSAlbumCameraController saveImageToPhotosAlbum:temp];}void _iosSaveVideoToPhotosAlbum(char* readAddr){NSString* temp = [NSString stringWithUTF8String:readAddr];[IOSAlbumCameraController saveVideo:temp];}#if defined (__cplusplus)
}
#endif
unity与iOS交互代码IOSAlbumCamera.cs :
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;public class IOSAlbumCamera : MonoBehaviour
{
#if UNITY_IOS [DllImport ("__Internal")]private static extern void _iosOpenPhotoAlbums();[DllImport ("__Internal")]private static extern void _iosSaveImageToPhotosAlbum(string readAddr);[DllImport("__Internal")]private static extern void _iosSaveVideoToPhotosAlbum(string readAddr);/// <summary>/// 保存图片到相册/// </summary>/// <param name="readAddr"></param>public static void iosSaveImageToPhotosAlbum(string readAddr){_iosSaveImageToPhotosAlbum (readAddr);}public static void iosSaveVideoToPhotosAlbum(string readAddr){_iosSaveVideoToPhotosAlbum(readAddr);}public static void iosOpenPhotoAlbums(){_iosOpenPhotoAlbums();}
#endif
}
注意修改回调哦
二.录屏
unity代码请参考Unity插件(二) ------ NatCorder(录屏保存到相册)
保存到相册请参考一中iOS所有代码
![](/assets/blank.gif)
Unity功能记录(一) ------ 截图/录屏保存到相册(Android/iOS横屏竖屏都可以)相关推荐
- Android 模拟器横屏竖屏切换设置
Android 模拟器横屏竖屏切换设置 时间:2012-07-04 来源:设计与开发 作者:Daniel 点击:5571 摘要: Android 模拟器旋转,横屏.竖屏切换设置,andr ...
- Android手机横屏竖屏的应用
学习了一下在Android手机横屏的应用,记录下来以备查用. if(getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDS ...
- css多媒体竖屏,css3 媒体查询方向:横屏竖屏教程
大家好,今天给大家分享的是css3 媒体查询方向:横屏竖屏教程,希望大家喜欢. 说道媒体查询,很多人会感觉陌生,但是对于做响应式开发的同学来说,那是再熟悉不过了. 结合CSS媒体查询,可以创建适应不同 ...
- Android 设置 横屏 竖屏 (转)
http://2960629.blog.51cto.com/2950629/701227 方法一:在AndroidManifest.xml中配置 如果不想让软件在横竖屏之间切换,最简单的办法就是在项目 ...
- Android 设置 横屏 竖屏
方法一:在AndroidManifest.xml中配置 如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上androi ...
- android相机横屏竖屏,GitHub - qixuefeng/CameraAdapt: Android相机屏幕适配
CameraAdaptDemo Android相机屏幕适配 该项目主要是为了做相机下的屏幕适配 具体思路可以参见我的这篇文章 Android 相机屏幕适配 测试: 机型:华为荣耀8 (厂商:honor ...
- android 设置横屏竖屏
在android应用开发过程中,尤其是在界面布局当中,经常会碰到要指定布局为横屏或是竖屏显示,下面是一些设置android横竖屏的方法: 代码控制 getWindow().setFlags(Windo ...
- Android禁止横屏竖屏切换
在Android中要让一个程序的界面始终保持一个方向,不随手机方向转动而变化的办法: 只要在AndroidManifest.xml里面配置一下就可以了. 在AndroidManifest.xml的ac ...
- android横屏竖屏设置
Android横竖屏切换总结(Android资料) Android横竖屏要解决的问题应该就两个: 一.布局问题 二.重新载入问题 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 ...
最新文章
- Free 4 months Serial License Key Of Outpost Security Suite Pro 8.1
- CNN基础知识(1)
- 心灵之光、思想之树:推荐《作家曰》
- C#中Array.Sort()方法分析
- 单片机外围模块漫谈之二,如何提高ADC转换精度
- 利用Power Designer反向数据库结构
- QEMU中音频模拟工作过程(十)
- hbuilder调试代码_【移动端】hbuilder创建app并利用真机运行调试
- java串口rxtx_Java串口操作RXTX
- 实验二:大数据可视化工具-Tableau
- 海信智能电视如何看电视直播
- 如何在iPhone应用中避免内存泄露
- python3可视化-pyecharts图形库,利用Map进行地图的创建和使用
- SLCP验厂辅导,工厂进行社会劳工整合项目(SLCP认证)验证的具体步骤是
- 二十个经典管理学定律
- android16进制编辑器,16进制编辑器app
- 乐变热更新SDK的集成
- 模型预测控制(MPC)的公式推导与理解 (转)
- SVM——(三)对偶性和KKT条件(Lagrange duality and KKT condition)
- echartsdemo
热门文章
- 电子科技大学计算机学院录取名单,电子科技大学研究生拟录取名单2021整理汇总(各学院)...
- python控制树莓派风扇_三极管打造树莓派温控风扇
- 幼儿园计算机基础知识,幼儿园计算机教学总结
- 没有软件测试经验的计算机毕业生如何准备面试测试工程师这一职位?
- 如何判断CRM软件的好坏?2023年CRM系统排行榜前三名是什么?
- Eclipse_阿里代码规范插件下载
- hdu 6169 - 容斥
- BJDCTF-writeup
- UVALive 6619 LIKE vs CANDLE(树形DP)
- kafka 重复消费场景及解决方案