总结iOS和Android视频存相册

对iOS和Android端的视频存相册进行初步总结

最近,由于项目需要对android和ios端的视频保存进行的学习,以下将遇到的问题和积累的经验进行总结,方便今后的使用和调整。

ios端的开发

iSO端的步骤如下:

  1. 完善unity3d端的代码,将交互接口留好;
  2. 通过unity3d生成新的Xcode工程;
  3. 为新的Xcode工程添加工作组;
  4. 添加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

  1. 添加Xcode对应库,注意在Targets中的每个link binary with libraries中都要添加相应的库,没有这些库的支持将报clang: error: linker command failed with exit code 1 (use -v to see invocation)错误;
  2. 为info.plist中添加相应的权限Privacy - Photo Library Usage Description-是否允许调用相册。没有调用权限,app将直接退出。

Android端的开发

Android端的步骤如下:

  1. 完善unity3d端的代码,将交互接口留好;
  2. 通过unity3d生成新的Android Studio工程;
  3. 在AS工程的java文件夹中新建要对接的包package,在包内建立对接的类class
  4. 在unity3d中建立plugin/android文件夹,文件夹内粘贴进AS中的AndroidManifest清单文件,将清单中的activity android:name="com.unity3d.play.UnityPlayerActivity"改为activity android:name=“自定义包名.自定义类名”。
  5. 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);
                    
                }
                
            }
  1. 在AS中同步然后运行,真机测试。

总结

iOS的实现相对麻烦,需要添加photos库和依赖,oc的语法也较为难掌握,可能出现各种小错误,Android的实现相对简单,但是接口的交互比较绕,搞明白AndroidJavaClass这个类其实还是很好理解和掌握的,以上总结,是我工作的记录,也希望可以帮助遇到同样问题的小伙伴。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值