Unity ShareREC Android、iOS接入記錄

一句旱、接入前準(zhǔn)備

  1. 下載ShareREC SDK地址 :下載Android_unity3d和iOS_unity3d
  2. android集成文檔 ---- ios集成文檔

二阳藻、Android端

將下載的ShareRec-xxx-for-Unity.unitypackage導(dǎo)入工程中,將ShareREC組件加入場景中谈撒,配置參數(shù)如下(Key和Secret填入在mob注冊應(yīng)用的信息):

shareREC參數(shù)設(shè)置.png

之后按照文檔只需調(diào)用相應(yīng)的開啟錄制結(jié)束錄制方法即可以實現(xiàn)錄制

// 判斷是否支持錄制腥泥,在啟動錄制之前判斷(在虛擬機上不可用一直false)
ShareREC.IsAvailable();

// 啟動錄制
ShareREC.StartRecorder();
 
// 暫停錄制
ShareREC.PauseRecorder();
 
// 恢復(fù)錄制
ShareREC.ResumeRecorder();
 
// 停止錄制
ShareREC.StopRecorder();

2.1 接入中遇到的問題

  • 按照文檔的配置完成后,在真機上測試IsAvailable()一直返回false啃匿,shareREC的demo工程可以運行蛔外,這種情況下,修改打包選項playerSeeting中的設(shè)置溯乒,下面是配置項:
    shareRec Seeting設(shè)置.png

    重要的是矩形框里的設(shè)置夹厌,Multuthreaded Rendering、 Graphics Jobs裆悄、 Protect Graphics Memory設(shè)置錯誤在錄制結(jié)束時會閃退
    在plugins/Android/ShareREC中的AndroidManifest文件中<application>節(jié)點下加上秘鑰信息:<meta-data android:name="Mob-AppKey" android:value="xxx"/> <meta-data android:name="Mob-AppSecret" android:value="xxx"/>
  • 在固定屏幕方向為橫屏?xí)r矛纹,通過ShareREC.ShowVideoCenter()打開視頻中心播放視頻程序會崩潰,豎屏下不會光稼,沒找到shareRec具體原因崖技,只得通過再打開shareREC的頁面時候改變屏幕方向,在頁面返回的回調(diào)Screen.orientation = ScreenOrientation.Portrait;

三钟哥、加入shareSDK分享

下載shareSDK導(dǎo)入迎献,有幾點需要注意

  • 在導(dǎo)入shareREC的時候的時候Plugins/Android/shareRec下和ShareSDK重復(fù)的jar包需要刪除,打包過程中AndroidManifest文件中沖突的部分也要刪除


    ShareREC下jar包一覽.png

    ShareSDK下jar包一覽.png
  • shareSdk中的一個jar包需要在android環(huán)境下重新生成jar替換腻贰,清單文件中包名吁恍、key信息也要改,以后會整理一篇詳細說明

  • 分享模塊配置完成后,在錄制完成后調(diào)用ShareREC.ShowShare ()如果分享的結(jié)果是一張圖片冀瓦,檢查清單文件中是否正確加入mob的key信息(2.1)伴奥,同時在shareRec組件掛載的物體上加上shareSDK組件,組件上的ByPass Approval設(shè)置為false翼闽,表示不繞過微信的包名簽名驗證拾徙,同時正確填入申請的微信的key信息,測試時把生成的包按照微信開發(fā)平臺填寫的包進行簽名感局,因為分享視頻的時候不能繞過驗證 附:不同平臺分享內(nèi)容的詳細說明

四尼啡、接入iOS ShareREC

  1. 導(dǎo)入在導(dǎo)入ios的shareREC包時千萬不要直接覆蓋,否則會把android的ShareREC文件覆蓋(ios和android的ShareREC腳本不同)询微,如果導(dǎo)入前已經(jīng)導(dǎo)入過ShareSDK包崖瞭,要取消勾選MiniJson(shareSDK中有),Editor下的sdk目錄不勾選是因為編譯成ios工程時在Xcode打開庫工程并未加入,還需手動導(dǎo)入撑毛,所以在unity中就不加入了;


    iOS端導(dǎo)入ShareREC文件.png
  2. 沒有導(dǎo)入ios的ShareREC.cs是因為會覆蓋书聚,更名后復(fù)制內(nèi)容加入工程,讓人想吐槽的是這個文件有兩處還是錯誤的藻雌,更正后如下雌续。這個腳本也需要掛載在場景中iOS才能分享
using UnityEngine;
using System.Collections;
using System;

namespace com.mob
{
    /// <summary>
    /// Finished record event.
    /// </summary>
    public delegate void FinishedRecordEvent (Exception ex);

    /// <summary>
    /// Close event.
    /// </summary>
    public delegate void CloseEvent ();

    /// <summary>
    /// Edit result event.
    /// </summary>
    public delegate void EditResultEvent (bool cancelled);

    /// <summary>
    ///Custom platform event
    /// </summary>
    public delegate void CustomPlatformEvent(string platformName, string title, Hashtable recording);


    public delegate void ShareEvent (SocialShareState state);

    public delegate void ConfirmEditLastRecordingResultEvent (string mainVideoPath);

    public enum SocialPageType
    {
        Share = 0,          // share
        ViewCenter = 1,     // video center
        Profile = 2         // profile
    }

    public enum SocialShareState
    {
        ShareStateBegin = 0,
        ShareStateSuccess = 1,
        ShareStateFail = 2,
        ShareStateCancel = 3
    }

    /// <summary>
    /// Share rec.
    /// </summary>
    public class ShareRecIOs : MonoBehaviour 
    {
        /// <summary>
        /// _callback the specified data.
        /// </summary>
        /// <param name="data">Data.</param>
        private void shareRECCallback (string data)
        {
            if (Application.platform == RuntimePlatform.IPhonePlayer)
            {
                #if UNITY_IPHONE
                ShareRECIOS.shareRECCallback(data);
                #endif
            }
            else if (Application.platform == RuntimePlatform.Android)
            {
                #if UNITY_ANDROID
                #endif
            }
        }

        /// <summary>
        /// Sets the name of the callback object.
        /// </summary>
        /// <param name="objectName">Object name.</param>
        public static void setCallbackObjectName(string objectName)
        {
            if (objectName == null)
            {
                objectName = "Main Camera";
            }

            if (Application.platform == RuntimePlatform.IPhonePlayer)
            {
                #if UNITY_IPHONE
                ShareRECIOS.setCallbackObjectName(objectName);
                #endif
            }
            else if (Application.platform == RuntimePlatform.Android)
            {
                #if UNITY_ANDROID
                #endif
            }
        }

        /// <summary>
        /// Pause the recoring.
        /// </summary>
        public static void pauseRecoring ()
        {
            #if UNITY_IPHONE
            ShareRECIOS.pauseRecoring();
            #elif   UNITY_ANDROID

            #endif
        }

        /// <summary>
        /// Resume the recoring.
        /// </summary>
        public static void resumeRecoring ()
        {
            #if UNITY_IPHONE
            ShareRECIOS.resumeRecoring();
            #elif   UNITY_ANDROID

            #endif
        }

        /// <summary>
        /// Starts the recoring.
        /// </summary>
        public static void startRecoring ()
        {
            #if UNITY_IPHONE
            ShareRECIOS.startRecording();
            #elif   UNITY_ANDROID

            #endif
        }

        /// <summary>
        /// Stops the recording.
        /// </summary>
        public static void stopRecording (FinishedRecordEvent evt)
        {
            #if UNITY_IPHONE
            ShareRECIOS.stopRecording(evt);
            #elif   UNITY_ANDROID

            #endif
        }

        /// <summary>
        /// Plaies the last recording.
        /// </summary>
        public static void playLastRecording()
        {
            #if UNITY_IPHONE
            ShareRECIOS.playLastRecording();
            #elif   UNITY_ANDROID

            #endif
        }

        /// <summary>
        /// Sets the bit rate.
        /// </summary>
        /// <param name="bitRate">Bit rate.</param>
        public static void setBitRate(int bitRate)
        {
            #if UNITY_IPHONE
            ShareRECIOS.setBitRate(bitRate);
            #elif   UNITY_ANDROID

            #endif
        }

        /// <summary>
        /// Sets the FPS.
        /// </summary>
        /// <param name="fps">Fps.</param>
        public static void setFPS(int fps)
        {
            #if UNITY_IPHONE
            ShareRECIOS.setFPS(fps);
            #elif   UNITY_ANDROID

            #endif
        }

        /// <summary>
        /// Sets the minimum recording time.
        /// </summary>
        /// <param name="time">Time.</param>
        public static void setMinimumRecordingTime(float time)
        {
            #if UNITY_IPHONE
            ShareRECIOS.setMinimumRecordingTime(time);
            #elif   UNITY_ANDROID

            #endif
        }

        /// <summary>
        /// Lasts the recording path.
        /// </summary>
        /// <returns>The recording path.</returns>
        public static string lastRecordingPath()
        {
            #if UNITY_IPHONE
            return ShareRECIOS.lastRecordingPath();
            #elif   UNITY_ANDROID

            #endif

            return null;
        }

        /// <summary>
        /// Edits the lasting recording.
        /// </summary>
        /// <param name="title">Title.</param>
        /// <param name="userData">User data.</param>
        /// <param name="evt">Evt.</param>
        public static void editLastingRecording(string title, Hashtable userData, CloseEvent evt)
        {
            #if UNITY_IPHONE
            ShareRECIOS.editLastRecording(title, userData, evt);
            #elif   UNITY_ANDROID

            #endif
        }

        /// <summary>
        /// Edits the last recording.
        /// </summary>
        /// <param name="evt">Evt.</param>
        public static void editLastRecording(EditResultEvent evt)
        {
            #if UNITY_IPHONE
            ShareRECIOS.editLastRecording(evt);
            #elif   UNITY_ANDROID

            #endif
        }

        /// <summary>
        /// Sets the sync audio comment.
        /// </summary>
        /// <param name="flag">If set to <c>true</c> flag.</param>
        public static void setSyncAudioComment(bool flag)
        {
            #if UNITY_IPHONE
            ShareRECIOS.setSyncAudioComment(flag);
            #elif   UNITY_ANDROID

            #endif
        }

        /// <summary>
        /// Opens the social.
        /// </summary>
        /// <param name="title">Title.</param>
        /// <param name="userData">User data.</param>
        /// <param name="pageType">Page type.</param>
        /// <param name="evt">Evt.</param>
        public static void openSocial(string title, Hashtable userData, SocialPageType pageType, CloseEvent evt)
        {
            #if UNITY_IPHONE
            ShareRECIOS.openSocial(title, userData, pageType, evt);
            #elif   UNITY_ANDROID

            #endif
        }

        public static void addCustomPlatform(string platformName, CustomPlatformEvent evt)
        {
            #if UNITY_IPHONE
            //          ShareRECIOS.addCustomPlatform();
            #elif UNITY_ANDROID
            #endif
        }

        public static void closeSocial()
        {
            //#if UNITY_IPHONE
            //          ShareRECIOS.
            //#elif #elif UNITY_ANDROID
//          #endif
        }

        public static void setShareAfterUploadCompleted(bool flag)
        {
            #if UNITY_IPHONE
            ShareRECIOS.setShareAfterUploadCompleted(flag);
            #elif UNITY_ANDROID

            #endif
        }

        public static void openSocialWithShareResult (string title, Hashtable userData, SocialPageType pageType, CloseEvent evt, ShareEvent shareEvt)
        {
            #if UNITY_IPHONE
            ShareRECIOS.openSocialWithShareResult(title, userData, pageType, evt, shareEvt);
            #elif UNITY_ANDROID

            #endif
        }

        public static void confirmEditLastRecording(ConfirmEditLastRecordingResultEvent evt)
        {
            #if UNITY_IPHONE
            ShareRECIOS.confirmEditLastRecording(evt);
            #elif UNITY_ANDROID
                
            #endif
        }
    }

}

修改了文件名,對應(yīng)的Plugins/iOS/ShareREC/Editor/ShareRECConfigEditor.cs文件中的對原來文件名的引用處也要改為修改后的[CustomEditor(typeof(ShareRecIOs))]

  1. 在調(diào)用錄制方法處通過判斷平臺進行錄制,以下腳本我實現(xiàn)了簡單的ios和android的錄制胯杭,有需要可以參考
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using cn.sharerec;
using System;
using com.mob;

/// <summary>
/// 錄制視頻和分享的主要腳本.
/// </summary>
public class RecoderController : MonoBehaviour {
    private bool isrecing = false;
    public GameObject luzhiBtn; // 錄制顯示的按鈕
    private Text timeText; // 顯示錄制時間的文本
    float duration = 10f;
    // Use this for initialization
    void Start () {
        timeText = luzhiBtn.transform.Find ("Text").GetComponent<Text> ();
    }
    
    // Update is called once per frame
    void Update () {
        if (isrecing) {
            duration -= Time.deltaTime;
             
            timeText.text = (int)duration + "''";
        }   
    }

    // 開始錄制視頻
    public void recoderStart() {
        // 正在錄制中
        if (isrecing)
            return;

        duration = 10;
        timeText.text = "10''";

        #if UNITY_ANDROID
        // 設(shè)備不支持錄制
        if (!ShareREC.IsAvailable())
            return;

        ShareREC.OnRecorderStartedHandler = onStarted;
        ShareREC.StartRecorder ();
        #elif UNITY_IPHONE
         // ios如果ShareRec腳本不在Main Camera上掛載需要說明
        ShareRecIOs.setCallbackObjectName("shareRec");
        ShareRecIOs.startRecoring();
        onStarted();
        #endif
    }

    // 開始錄制的監(jiān)聽
    void onStarted() {
        // 開始錄制驯杜,倒計時10S
        isrecing = true;
        Invoke("stopRecorder",10f);
        // 顯示錄制UI
        luzhiBtn.SetActive(true);
    }

    void stopRecorder() {
        #if UNITY_ANDROID
        ShareREC.OnRecorderStoppedHandler = onStopped;
        ShareREC.StopRecorder ();
        #elif UNITY_IPHONE
        FinishedRecordEvent fin = new FinishedRecordEvent(recordFinishedHandler);
        ShareRecIOs.stopRecording(fin);
        #endif
        luzhiBtn.SetActive(false);
    }

    // ios停止錄制
    void recordFinishedHandler(Exception ex)
    {
        
        isrecing = false;
        if (ex == null)
        {
            //調(diào)到分享界面
            //Hashtable userData = new Hashtable();
            //userData["DayOfWeek"] = System.DateTime.Today.DayOfYear;
            Screen.orientation = ScreenOrientation.Portrait;
            ShareRecIOs.openSocial ("分享一個視頻", null, SocialPageType.Share, new CloseEvent(()=>{
                onShareReturn();
            }));
        }
    }

    // 停止錄制的監(jiān)聽
    void onStopped() {
        isrecing = false;
        #if UNITY_ANDROID
        // 視頻上傳完畢才能分享,不然上傳失敗也沒辦法觀看
        // 修改屏幕方向歉摧,不然mob在觀看視頻會崩潰
        Screen.orientation = ScreenOrientation.Portrait;
        ShareREC.OnReturnFromShareHandler = onShareReturn;
        ShareREC.setShareAfterUpload ();
        ShareREC.ShowShare ();
        #elif UNITY_IPHONE
        #endif
    }

    // android 從分享界面返回
    void onShareReturn() {
        Screen.orientation = ScreenOrientation.LandscapeLeft;
    }
}

  1. 在Xcode下需要加入SDK包到工程根目錄,在加入libz.td libicu.td libstdc.td javascript libsqlite 等設(shè)置不再詳細說明

五腔呜、將shareRec錄制的視頻顯示在相冊中

錄制結(jié)束后android端會保存一個視頻文件在設(shè)備上(位置可在shareREC上指定),在相冊中顯示把這個路徑通知到相冊就可以了
ios 錄制的視頻位置不能指定叁温,錄制的視頻存放在沙盒里的,同樣的通過sdk提供的方法得到路徑核畴,在根據(jù)路徑保存視頻膝但,相冊顯示

(1)、android

獲取剛錄制視頻的路徑

        long[] aaa = ShareREC.ListLocalVideos();
        //得到最后一個視頻的視頻id
        long b = aaa[aaa.Length - 1];
        //通過id得到視頻的存儲路徑
        string videoPathAndroid = ShareREC.GetLocalVideoPath(b);
        StartCoroutine (ScreenshotManager.SaveExisting (videoPathAndroid, false));
(2)谤草、iOS
            string videoPathIos = ShareRecIOs.lastRecordingPath ();
            saveVideoAtPathToPhotoalbum (videoPathIos);
(2.1) saveVideoAtPathToPhotoalbum 說明

此方法是一個插件方法跟束,在Plugins/iOS下加入兩個文件
1.PhotoAlbumUtil.h

#import <Foundation/Foundation.h>
#import <Security/Security.h>

@interface PhotoAlbumUtil : NSObject

+ (bool)saveVideoAtPathToPhotoalbum:(NSString *)path;

@end

2.PhotoAlbumUtil.m

#import "PhotoAlbumUtil.h"
#import <AssetsLibrary/AssetsLibrary.h>

@implementation PhotoAlbumUtil
+ (bool)saveVideoAtPathToPhotoalbum:(NSString *)path {
    NSLog(@"存入視頻地址%s-------------",path);
    if (path == NULL) {
        return false;
    }
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:path]
                                completionBlock:^(NSURL *assetURL, NSError *error) {
                                    if (error) {
                                        NSLog(@"Save video fail:%@",error);
                                    } else {
                                        NSLog(@"Save video succeed.");
                                    }
                                }];
    
    return true;
}


@end

最后,在調(diào)用方法的腳本中加入

[DllImport("__Internal")]
    private static extern void saveVideoAtPathToPhotoalbum( string path );

說明:本文接入的shareREC版本 android:ShareREC for Unity Android 2.0.11.unitypackage iOS:v2.0.3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丑孩,隨后出現(xiàn)的幾起案子冀宴,更是在濱河造成了極大的恐慌,老刑警劉巖温学,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件略贮,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機逃延,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門览妖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揽祥,你說我怎么就攤上這事讽膏。” “怎么了拄丰?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵府树,是天一觀的道長。 經(jīng)常有香客問我愈案,道長挺尾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任站绪,我火速辦了婚禮遭铺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恢准。我一直安慰自己魂挂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布馁筐。 她就那樣靜靜地躺著涂召,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敏沉。 梳的紋絲不亂的頭發(fā)上果正,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音盟迟,去河邊找鬼秋泳。 笑死,一個胖子當(dāng)著我的面吹牛攒菠,可吹牛的內(nèi)容都是我干的迫皱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辖众,長吁一口氣:“原來是場噩夢啊……” “哼卓起!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凹炸,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤戏阅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啤它,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饲握,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡私杜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了救欧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衰粹。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖笆怠,靈堂內(nèi)的尸體忽然破棺而出铝耻,到底是詐尸還是另有隱情,我是刑警寧澤蹬刷,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布瓢捉,位于F島的核電站,受9級特大地震影響办成,放射性物質(zhì)發(fā)生泄漏泡态。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一迂卢、第九天 我趴在偏房一處隱蔽的房頂上張望某弦。 院中可真熱鬧,春花似錦而克、人聲如沸靶壮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腾降。三九已至,卻和暖如春碎绎,著一層夾襖步出監(jiān)牢的瞬間螃壤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工筋帖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奸晴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓幕随,卻偏偏與公主長得像蚁滋,于是被迫代替她去往敵國和親宿接。 傳聞我的和親對象是個殘疾皇子赘淮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評論 25 707
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,981評論 3 119
  • 總感到有做不完的事睦霎,而又無所事事梢卸,稍不留神時間就在滑動手機瀏覽微信或獵奇新聞中溜走了。焦慮無聊的感覺襲上心頭副女,整個...
    石頭心語閱讀 366評論 0 2
  • 保險是賣的一份信仰蛤高。給客戶一份值得信任的保障,讓他們在生活變故時不至于全然崩盤。最大限度上保護了我們的人生安全戴陡,甚...
    左眼殤暮光閱讀 194評論 0 2
  • 1/30筆墨里的時光打卡第一天 我們每個人都知道自律有多重要塞绿,但是多數(shù)人只是知道而已,付諸于行動的少之又少恤批。 去年...
    真真1閱讀 651評論 7 3