对iOS和Android端的视频存相册进行初步总结
最近,由于项目需要对android和ios端的视频保存进行的学习,以下将遇到的问题和积累的经验进行总结,方便今后的使用和调整。
ios端的开发
iSO端的步骤如下:
- 完善unity3d端的代码,将交互接口留好;
- 通过unity3d生成新的Xcode工程;
- 为新的Xcode工程添加工作组;
- 添加Xcode对应的.h和.m文件;
.h的代码
//
// PhotoManage.h
// Unity-iPhone
//
// Created by 龙翔 on 2021/3/9.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface PhotoManage : NSObject
- ( void ) imageSaved: ( UIImage *) image didFinishSavingWithError:( NSError *)error
contextInfo: ( void *) contextInfo;
@end
#ifndef PhotoManage_h
#define PhotoManage_h
#endif /* PhotoManage_h */
.m的代码
//
// PhotoManage.m
// Unity-iPhone
//
// Created by 龙翔 on 2021/3/9.
//
#import <Foundation/Foundation.h>
#import "PhotoManage.h"
#import <Photos/Photos.h>
#import <UIKit/UIKit.h>
@interface PhotoManage();
@end
@implementation PhotoManage : NSObject
- ( void ) imageSaved: ( UIImage *) image didFinishSavingWithError:( NSError *)error
contextInfo: ( void *) contextInfo
{
NSLog(@"保存结束");
if (error != nil) {
NSLog(@"有错误");
}
}
void _SaveVideo(char *readAddr)
{
NSString *strReadAddr = [NSString stringWithUTF8String:readAddr];
PHPhotoLibrary *photoLibrary = [PHPhotoLibrary sharedPhotoLibrary];
[photoLibrary performChanges:^{
[PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:[NSURL
fileURLWithPath:strReadAddr]];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success) {
NSLog(@"已将视频保存至相册");
} else {
NSLog(@"未能保存视频到相册");
}
}];
}
@end
- 添加Xcode对应库,注意在Targets中的每个link binary with libraries中都要添加相应的库,没有这些库的支持将报clang: error: linker command failed with exit code 1 (use -v to see invocation)错误;
- 为info.plist中添加相应的权限Privacy - Photo Library Usage Description-是否允许调用相册。没有调用权限,app将直接退出。
Android端的开发
Android端的步骤如下:
- 完善unity3d端的代码,将交互接口留好;
- 通过unity3d生成新的Android Studio工程;
- 在AS工程的java文件夹中新建要对接的包package,在包内建立对接的类class
- 在unity3d中建立plugin/android文件夹,文件夹内粘贴进AS中的AndroidManifest清单文件,将清单中的activity android:name="com.unity3d.play.UnityPlayerActivity"改为activity android:name=“自定义包名.自定义类名”。
- unity3d中Android的接口如下,首先判断平台为android:
if (Application.platform == RuntimePlatform.Android)
{
//destination = "/storage/emulated/0/DCIM/Camera";
destination = "/storage/emulated/0/DCIM/1Videoshow";
if (!Directory.Exists(destination))
{
Debug.Log(destination + ",Directory Not Exist!");
Directory.CreateDirectory(destination);
}
destination = destination + "/" + filename;
Debug.Log(destination);
File.Copy(path, destination);
File.Delete(path);
// 安卓中androidmanifest必须改为自定义包.类,不然相册显示不出来
using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
currentActivity.CallStatic("init", currentActivity,destination);
}
}
- 在AS中同步然后运行,真机测试。
总结
iOS的实现相对麻烦,需要添加photos库和依赖,oc的语法也较为难掌握,可能出现各种小错误,Android的实现相对简单,但是接口的交互比较绕,搞明白AndroidJavaClass这个类其实还是很好理解和掌握的,以上总结,是我工作的记录,也希望可以帮助遇到同样问题的小伙伴。