此方法采用U3D和ios和安卓交互方法完成 具体内容是U3D写出调用IOS和安卓方法 传递录像和照片的沙盒路径 存储由安卓和ios来完成 好了我们先上U3D代码

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;public class SelectPlatform : MonoBehaviour {#if UNITY_ANDROID/// <summary>/// Android平台接口/// </summary>public static AndroidInterface android=new AndroidInterface();#elif UNITY_IPHONE/// <summary>/// IOS平台接口/// </summary>public static IOSInterface ios=new IOSInterface();#endif/// <summary>/// 对Android或IOS接口进行调用/// </summary>public static void SendMessage(string funName,string data){#if UNITY_ANDROIDType type = typeof(AndroidInterface);type.GetMethod(funName).Invoke(android,new object[]{data});#elif UNITY_IPHONEType type = typeof(IOSInterface);type.GetMethod(funName).Invoke(ios,new object[]{data});#endif}
}
#if UNITY_ANDROID
using UnityEngine;
using System.Collections;
/// <summary>
/// 安卓方法列表
/// </summary>
public class AndroidInterface : AbstractClass {/// <summary>/// 关闭U3D/// </summary>/// <param name="data"></param>public override void CloseUnity(string data){Debug.Log("CloseUnity");MyAndroidPlayer.SendMessage("CloseUnity", data);}/// <summary>/// 保存照片/// </summary>/// <param name="data"></param>public override void PreservationSPhoto(string data){Debug.Log("PreservationSPhoto");MyAndroidPlayer.SendMessage("PreservationSPhoto", data);}/// <summary>/// 保存录像/// </summary>/// <param name="data"></param>public override void PreservationSvideotape(string data){Debug.Log("PreservationSvideotape");MyAndroidPlayer.SendMessage("PreservationSvideotape", data);}
}
#endif
using UnityEngine;
using System.Collections;
/// <summary>
/// 方法列表
/// </summary>
public  abstract class AbstractClass  {/// <summary>/// 关闭U3D/// </summary>/// <param name="data"></param>public abstract void CloseUnity(string data);/// <summary>/// 保存照片/// </summary>/// <param name="data"></param>public abstract void PreservationSPhoto(string data);/// <summary>/// 保存录像/// </summary>/// <param name="data"></param>public abstract void PreservationSvideotape(string data);
}
using UnityEngine;
using System.Collections;
#if UNITY_ANDROID
public class MyAndroidPlayer : MonoBehaviour {public delegate void ObtainMessageDelegate(string messageType, string message);public static ObtainMessageDelegate ObtainMessage;private static AndroidJavaClass androidJavaClass;private static AndroidJavaObject androidJavaObject;private char SEPARATOR = '~';void Awake(){if (Application.platform != RuntimePlatform.Android) return;androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");//  androidJavaObject = androidJavaObject.Get<AndroidJavaObject>("functionUnity");}public static void SendMessage(string method, string msgArgs){Debug.Log(method);androidJavaObject.Call(method, new string[] { msgArgs });}
}#endif
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
using System;public class IOSInterface : AbstractClass {[DllImport("__Internal")]private static extern void _CloseUnity(string wenwen);public override void CloseUnity(string wenwen){_CloseUnity(wenwen);}[DllImport("__Internal")]private static extern void _PreservationSPhoto(string wenwen);public override void PreservationSPhoto(string wenwen){_PreservationSPhoto(wenwen);}[DllImport("__Internal")]private static extern void _PreservationSvideotape(string wenwen);public override void PreservationSvideotape(string wenwen){_PreservationSvideotape(wenwen);}
}

以上是我对调用ios 安卓方法做的一个小模块处理 然后我们在以后的项目里就很好的调用了 例如

 public void  CloseUnity(){SelectPlatform.SendMessage("CloseUnity", "退出U3D");}public void PreservationSPhoto(string data){SelectPlatform.SendMessage("PreservationSPhoto",data);}public void PreservationSvideotape(string data){SelectPlatform.SendMessage("PreservationSvideotape",data);}

然后方法的参数 就是我们做完截屏和录屏的路径 截屏代码我就不提供了 百度一堆 录屏各种插件或者自己写 最后传递参数 例如 Debug.Log(“录像存储地址” + Application.persistentDataPath + “/” + filePath);
注意路径 Application.persistentDataPath

写好方法后 我们先来安卓 导出AS项目 这里说明一些 如果公司有安卓 ios程序最好 和他们沟通好接口
如果没有 就需要自己来写了 下面贴代码 找到 java里 UnityPlayerActivity

package com.itemjia.app.bandian;import com.unity3d.player.*;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;public class UnityPlayerActivity extends Activity
{private Context mContext;protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native codepublic  void CloseUnity(String data){finish();}public  void PreservationSvideotape(String  msg){File file1=new File(msg);
//获取ContentResolve对象,来操作插入视频ContentResolver localContentResolver = this.getContentResolver();
//ContentValues:用于储存一些基本类型的键值对ContentValues localContentValues = getVideoContentValues(this, file1, System.currentTimeMillis());
//insert语句负责插入一条新的纪录,如果插入成功则会返回这条记录的id,如果插入失败会返回-1。Uri localUri = localContentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,localContentValues);//  Log.d(msg, "PreservationSPhoto: .");}public  ContentValues getVideoContentValues(Context paramContext, File paramFile, long paramLong) {ContentValues localContentValues = new ContentValues();localContentValues.put("title", paramFile.getName());localContentValues.put("_display_name", paramFile.getName());localContentValues.put("mime_type", "video/3gp");localContentValues.put("datetaken", Long.valueOf(paramLong));localContentValues.put("date_modified", Long.valueOf(paramLong));localContentValues.put("date_added", Long.valueOf(paramLong));localContentValues.put("_data", paramFile.getAbsolutePath());localContentValues.put("_size", Long.valueOf(paramFile.length()));return localContentValues;}public   void PreservationSPhoto(String  msg){saveImage(msg);DeleteImage(msg);}//保存图片到相册private void saveImage(String path) {FileInputStream input = null;try {input = new FileInputStream(new File(path));} catch (FileNotFoundException e) {e.printStackTrace();}Bitmap bitmap = BitmapFactory.decodeStream(input);String fileName = System.currentTimeMillis() + ".png";ImgUtils.saveBitmap(bitmap, fileName, mContext);}private void DeleteImage(String imgPath) {ContentResolver resolver = getContentResolver();Cursor cursor = MediaStore.Images.Media.query(resolver, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=?",new String[]{imgPath}, null);boolean result = false;if (cursor.moveToFirst()) {long id = cursor.getLong(0);Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;Uri uri = ContentUris.withAppendedId(contentUri, id);int count = getContentResolver().delete(uri, null, null);result = count == 1;} else {File file = new File(imgPath);result = file.delete();}}// Setup activity layout@Override protected void onCreate(Bundle savedInstanceState){requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);mContext = this;mUnityPlayer = new UnityPlayer(this);setContentView(mUnityPlayer);mUnityPlayer.requestFocus();}@Override protected void onNewIntent(Intent intent){// To support deep linking, we need to make sure that the client can get access to// the last sent intent. The clients access this through a JNI api that allows them// to get the intent set on launch. To update that after launch we have to manually// replace the intent with the one caught here.setIntent(intent);}// Quit Unity@Override protected void onDestroy (){mUnityPlayer.destroy();super.onDestroy();}// Pause Unity@Override protected void onPause(){super.onPause();mUnityPlayer.pause();}// Resume Unity@Override protected void onResume(){super.onResume();mUnityPlayer.resume();}@Override protected void onStart(){super.onStart();mUnityPlayer.start();}@Override protected void onStop(){super.onStop();mUnityPlayer.stop();}// Low Memory Unity@Override public void onLowMemory(){super.onLowMemory();mUnityPlayer.lowMemory();}// Trim Memory Unity@Override public void onTrimMemory(int level){super.onTrimMemory(level);if (level == TRIM_MEMORY_RUNNING_CRITICAL){mUnityPlayer.lowMemory();}}// This ensures the layout will be correct.@Override public void onConfigurationChanged(Configuration newConfig){super.onConfigurationChanged(newConfig);mUnityPlayer.configurationChanged(newConfig);}// Notify Unity of the focus change.@Override public void onWindowFocusChanged(boolean hasFocus){super.onWindowFocusChanged(hasFocus);mUnityPlayer.windowFocusChanged(hasFocus);}// For some reason the multiple keyevent type is not supported by the ndk.// Force event injection by overriding dispatchKeyEvent().@Override public boolean dispatchKeyEvent(KeyEvent event){if (event.getAction() == KeyEvent.ACTION_MULTIPLE)return mUnityPlayer.injectEvent(event);return super.dispatchKeyEvent(event);}// Pass any events not handled by (unfocused) views straight to UnityPlayer@Override public boolean onKeyUp(int keyCode, KeyEvent event)     { return mUnityPlayer.injectEvent(event); }@Override public boolean onKeyDown(int keyCode, KeyEvent event)   { return mUnityPlayer.injectEvent(event); }@Override public boolean onTouchEvent(MotionEvent event)          { return mUnityPlayer.injectEvent(event); }/*API12*/ public boolean onGenericMotionEvent(MotionEvent event)  { return mUnityPlayer.injectEvent(event); }
}

新建一个 .java代码 ImgUtils

package com.itemjia.app.bandian;import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class ImgUtils {/** 保存文件,文件名为当前日期*/public static void saveBitmap(Bitmap bitmap, String bitName,Context context) {String fileName;File file;if (Build.BRAND.equals("xiaomi")) { // 小米手机fileName = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/" + bitName;}else if (Build.BRAND.equals("Huawei")){fileName = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/" + bitName;} else {  // Meizu 、OppofileName = Environment.getExternalStorageDirectory().getPath() + "/DCIM/" + bitName;}file = new File(fileName);if (file.exists()) {file.delete();}FileOutputStream out;try {out = new FileOutputStream(file);// 格式为 JPEG,照相机拍出的图片为JPEG格式的,PNG格式的不能显示在相册中if (bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out)) {out.flush();out.close();
// 插入图库MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), bitName, null);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 发送广播,通知刷新图库的显示context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + fileName)));}}

安卓代码完成 下面来做IOS 如果你写了接口 就必须实现 不然会报错 新创建一个.h文件 就叫 u3dmanage.h吧

//
//  u3dmanage.h
//  Unity-iPhone
//
//  Created by Gy on 2020/4/26.
//
@interface u3dmanage : NSObject
void _CloseUnity(char*msg);
void _PreservationSPhoto(char*msg);
void _PreservationSvideotape(char*msg);
@end
#ifndef u3dmanage_h
#define u3dmanage_h#endif /* u3dmanage_h */

这个是接口 在写实现代码
创建一个 .m文件 u3dmanage.m

//
//  u3dmanage.m
//  Unity-iPhone
//
//  Created by Gy on 2020/4/27.
//#import "u3dmanage.h"
@interface u3dmanage ();
@end
@implementation u3dmanagevoid _CloseUnity(char* msg){NSString *string1 = [[NSString alloc] initWithUTF8String:msg];NSString *string2 = [[NSString alloc] initWithUTF8String:msg];NSLog(@"###%@", [NSString stringWithFormat:@"%@ %@", string1, string2]);}
void _PreservationSPhoto(char* msg){NSString *string1 = [[NSString alloc] initWithUTF8String:msg];NSString *string2 = [[NSString alloc] initWithUTF8String:msg];NSString *strReadAddr = [NSString stringWithUTF8String:msg];UIImage *img = [UIImage imageWithContentsOfFile:strReadAddr];NSLog([NSString stringWithFormat:@"w:%f, h:%f", img.size.width,img.size.height]);u3dmanage *instance = [u3dmanage alloc];UIImageWriteToSavedPhotosAlbum(img, instance,@selector(imageSaved:didFinishSavingWithError:contextInfo:), nil);NSLog(@"###%@", [NSString stringWithFormat:@"%@ %@", string1, string2]);}
void _PreservationSvideotape(char* msg){NSString *strReadAddr = [NSString stringWithUTF8String:msg];u3dmanage *instance = [u3dmanage alloc];UISaveVideoAtPathToSavedPhotosAlbum(strReadAddr, instance, nil, nil);}
+ (void) savedVedioImage:(UIImage*)image didFinishSavingWithError: (NSError *)error contextInfo: (void *)contextInfo {NSString* result;if (error) {result =@"视频保存失败";}else {result =@"保存视频成功";}//  UnitySendMessage( "MainScriptHolder", "SaveVedioToPhotosAlbumCallBack", result.UTF8String);
}
- ( void ) imageSaved: ( UIImage *) image didFinishSavingWithError:( NSError *)errorcontextInfo: ( void *) contextInfo
{NSLog(@"保存结束");if (error != nil) {NSLog(@"有错误");}
}@end

最后测试 录像和截屏完美存储系统相册

Unity3D截屏录屏后存储IOS安卓系统相册相关推荐

  1. iphone屏幕镜像如何全屏_苹果系统截屏录屏+标记剪辑功能详解( iPhone/iPad/Mac)

    苹果系统中的截屏和录屏.标记和剪辑功能一如它的其他产品设计,做得非常细致.在我们日常的工作中,不免会遇到这些功能,今天小编就给大家详细讲解下苹果系统截屏录屏.标记剪辑功能,希望对大家有所帮助! 001 ...

  2. 苹果xr截屏怎么截_苹果系统截屏录屏+标记剪辑功能详解( iPhone/iPad/Mac)

    苹果系统中的截屏和录屏.标记和剪辑功能一如它的其他产品设计,做得非常细致.在我们日常的工作中,不免会遇到这些功能,今天小编就给大家详细讲解下苹果系统截屏录屏.标记剪辑功能,希望对大家有所帮助! 001 ...

  3. android 禁止截屏录屏功能,android 应用禁止截屏录屏

    更新记录 1.0.0(2021-02-01) Android 应用禁止截屏录屏 平台兼容性 Android iOS 适用版本区间:4.4 - 11.0 × 原生插件通用使用流程: 购买插件,选择该插件 ...

  4. Win10怎么截屏录屏?Win10截图方法大全 超强大的工具!

    转载自奇它博客,原文链接:[http://qitablog.com/tips/win10怎么截屏录屏?win10截图方法大全-超强大的工具!.html ‎] [infobox title=" ...

  5. 【Ubuntu20.04】好用的快捷键\截屏录屏

    unbuntu20.04好用的快捷键 快捷键很大程度上决定了一个产品的使用体验,作为一个刚刚接触linux的小白根据自身需求学习了一下在编码过程中ubuntu20.04可能会用到的一些,在这里和大家分 ...

  6. Android 禁止截屏录屏

    一.应用中禁止截屏录屏 @Overrideprotected void onCreate(Bundle savedInstanceState) {getWindow().addFlags(Window ...

  7. 多种方式实现web端截屏录屏

    本文通过使用webrtc.dom监听.使用插件三种方式实现截屏,使用webrtc.dom监听来实现录屏 使用webrtc实现截屏录屏 ①实现录屏 // 音频或视频流 let mediaStreamTr ...

  8. 超便携式截屏录屏软件FastStone Capture

    超便携式截屏录屏软件FastStone Capture 转载于:https://www.cnblogs.com/Renyi-Fan/p/8628196.html

  9. 截屏录屏软件分享 FSCapture、Snipaste【目前见过的最好用的录屏软件】

    目录 截屏录屏软件--FSCapture 截屏软件--Snipaste-2.4-Beta-x64.zip 截屏录屏软件--FSCapture 使用教程(17:09):https://www.bilib ...

最新文章

  1. 【程序员归家计划】放假回家之前拜服务器?不存在的,这才是保证程序员过好年的正确打开方式...
  2. linux nfs 读写性能,linux – Debian上的NFS性能问题
  3. 全flash站制作剖析
  4. 用JQUERY为INPUT的TXT类型赋值及取值操作
  5. 【建议珍藏系列】如果你这样回答「什么是线程安全」,面试官都会对你刮目相看!...
  6. Python3解决modulenotfounderror: no module named‘_bz2‘
  7. 怎样从Mysql官网下载linux版本的mysql安装包
  8. 编写一个Applet在屏幕上画一组同心圆
  9. 线上python课程一般多少钱-学习Python这门课程大概需要多久?费用是多少?
  10. linux 分区 LVM 挂载
  11. 布料系统原理浅析和在Unity手游中的应用
  12. 操作系统锁的实现方法有哪几种_深入理解多线程(四)—— Moniter的实现原理
  13. webpack入门学习笔记10 —— 在项目中使用图片资源
  14. 硅基压力传感器—MEMS
  15. 2019年 网络空间安全国赛真题 赛题分析
  16. 工业水处理行业主要壁垒构成及重点企业分析、相关风险、处理规模
  17. 复制移动文件时对于目标文件系统过大的问题解决
  18. 数据结构与算法基础——重要知识点截图【青岛大学-王卓版】
  19. canvas为你的天气预报添加雨雪效果 | 微信小程序
  20. php 做支付宝电脑网站和app支付

热门文章

  1. axios请求失败、请求超时重新发送请求
  2. AgileEAS.NET平台开发指南-数据层开发
  3. NX二次开发-UFUN创建图纸注释uc5540
  4. php 表情 代码_PHP 开发中涉及到emoji表情的几种处理方法
  5. esp32做tcp服务器完成tcp广播
  6. NENU - 字符串处理课后作业(问题A~问题H) 解析+参考代码(含有C++中的string函数库)
  7. LSP到底有什么用?
  8. 心想才能事成!不具备任何优势的我这样叩开网易的大门
  9. 具说看完这21个故事的人,30岁前都成了亿万富翁。
  10. OPPO芯片壮士断腕 但有人依旧负重前行