需求
- Mob 平台是一个强大的提供分享功能的平台,为移动开发者提供 ShareSDK 社交分享、ShareREC 手游录像分享、短信验证码 SDK 及 BigApp 等免费服务。
- Unity 使用 ShareREC 来作视频录制分享以及可以满足大部分需求,但是自带的 UI 实在是有点简陋。虽然可以进行 UI 自定义,但是对于没有 UI 的同学来说,使用 Android 或 IOS 自带的分享功能来做即简单又便捷。
- 本文演示的是 Unity 使用 ShareRec 录制视频并调用 Android 自带分享功能进行分享。
一、准备工作
1.1 mob.com账号申请
点击进入 Mob官网,注册账号进入后台,添加应用后会获得 Appkey 和 App Secret 一会儿会用到。
点击左边的 SDK 产品来添加 SDK 功能,本例使用的 ShareRec 视频分享,点击添加。
成功添加后会显示已开通产品今日昨日数据。
1.2 SDK 下载
因为本例使用的是 Unity + Android 开发,所以下载 ShareREC For Android Unity SDK,可以返回首页找到下载,也可以直接点击下方传送门:
ShareREC For Android Unity 下载到本地。
二、Unity 项目准备
2.1 SDK 导入
- 把下载好的文件解压,找到ShareREC的unitypackage,双击导入当前 Unity 项目。
- MainCamera 添加 ShareREC 脚本:点击 MainCamera,属性面板点击 Add ComPonment 搜索 ShareREC 并添加。
-
填写相关参数:
- App Key 和 App Secret 填写刚才申请好的,如果只是测试,使用默认的即可;
- MaxFrameSize表示录制出来的视频最大分辨率;
- VideoQuality表示视频质量,会根据视频分辨率自动调整视频码率;
- MinDuration是视频最短时长,单位为秒;
- RecordAudioFromMic表示从麦克风捕获声音输入;
- SoftwareAudioEncoder和SoftwareVideoEncoder表示强制使用软件音视频编码器对视频进行编码,勾选后兼容性更高;
- CacheFolder表示视频文件输出目录的路径。
2.2 Unity 代码逻辑
- 创建一个 Cube 放到 MainCamera 视野中,挂上让它自转的代码方便看录制效果。
void Update () {
this.transform.RotateAround(this.transform.position, Vector3.up, Time.deltaTime * 50);
}
-
写几个按钮并绑定 ShareRec 提供的相应功能。
- 是否支持 --> ShareREC.IsAvailable(); true 表示当前设备支持录制,反之不支持。
- 开始按钮 --> ShareREC.StartRecorder(); 开始录制。
- 停止按钮 --> ShareREC.StopRecorder(); 停止录制。
- 个人资料 --> ShareREC.ShowProfile(); 打开 SDK 自带个人资料页面。
- 视频列表 --> ShareREC.ShowVideoCenter(); 打开视频列表页面
- 分享前添加描述信息 --> SetText的优先级高于AddCustomAttr,因此一旦两者都调用,后者将不起作用。
// 设置描述
ShareREC.SetText("视频描述");
// 添加自定义字段
ShareREC.AddCustomAttr("字段名称", "字段数值");
- 分享按钮 --> ShareREC.ShowShare(); 将直接调用 ShareREC 自带的分享页面。
没什么特殊要求的话,直接使用ShareREC.ShowShare();就可以进行分享。
但是本文要实现的是通过与 Android 交互来进行分享,所以点击分享按钮后发送消息给 Android 处理。录制完成后将视频路径发送给 Android 来分享:
private void AndrShareVedio(string path)
{
// 调用 UnityPlayer 类
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
// 调用该类的 share 方法,path 是 Share 方法的参数,传入视频地址
jo.Call("share", path);
}
2.3 Unity 导出为 Android Studio 项目
三、合并到 Android 项目
3.1 新建 Android 项目
新建 Android 项目,包名与 Unity 导出的 Android 项目保持一致。
3.2 添加 libs
-
拷贝 Unity 导出的 Android 项目下的 libs 文件夹下的 jar 文件到 Android 项目。
-
添加为项目依赖,右键 unity-classes.jar 文件并 Add As Library。
3.3 拷贝 main 目录下文件
-
拷贝 Unity 导出的 Android 项目 assets 目录下的文件到 Android 项目,如果没有 assets 文件夹就直接拷贝整个文件夹。
-
拷贝 src/main 目录下的 java 文件到 Android 项目。UnityPlayerActivity 文件一会儿就作为程序的主入口。
-
拷贝 jniLibs 文件夹下的文件,新项目可能没有该文件夹,所以这里直接拷贝整个文件夹。
- res 文件下如果有相关的资源,如 app 图标之类的,拷贝即可。
-
打开Unity 导出的 Android 项目的 AndroidManifest.xml 文件,拷贝 UnityActivity 相关配置到 Android 项目的 AndroidManifest.xml,这里把 UnityActivity 当做启动 Activity,所以原来 MainActivity 的 <intent-filter> 标签可以全部删除。
如果报错抛红线的话,快捷键 Alt + Enter 选 Disable 就可以了。这里是 UnityActivity 设置的一些用不到属性,不用理会就好。
接着拷贝权限相关:
3.4 导入 ShareRec module 作为依赖
-
拷贝 ShareRec module 到项目主目录下
-
打开 Android 项目下的 settings.gradle 文件,添加
include 'ShareRec'
并点击 Sync Now。这是把 ShareRec moudle 作为项目的 module 添加。
报错的话说明本地没有 ShareRec 的相关 Build Tools 或者 SDK,点击更新下载。
如果更新不了,打开 ShareRec 的相关设置,修改它的 Build Tools 版本为你机子上有的版本。
更新成功后可能会报错,提示为某些属性重复了。点击定位到出错的文件,把重复的内容注释掉即可。之后可以 Build --> Make Project 重新编译下。
-
右键打开 Module Settings,选择 app 的 Dependencies 选项,点击加号选择 module dependency,添加 ShareSDK 作为依赖。点击OK。
3.5 Android 接收 Unity 发送的分享操作
因为 UnityPlayerActivity 是程序的主 Activity,所以在这里相应 Unity 调用的方法。打开 UnityPlayerActivity 类,添加如下方法:
// Unity 调用 Share 方法传递视频路径
public void share(final String path){
Log.i("videopath",path);
ShareUtils.shareVideo(this,path);
}
ShareUtils 是一个工具类,包含分享图片、文字、视频等功能。
package com.sky.sharetest;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
/**
* Created by yuetu-develop on 2017/9/22.
*/
public class ShareUtils {
public static void share(Context context, int stringRes, String title) {
share(context, context.getString(stringRes), title);
}
public static void shareImage(Context context, Uri uri, String title) {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("image/jpeg");
context.startActivity(Intent.createChooser(shareIntent, title));
}
public static void share(Context context, String extraText, String extraTitle) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "分享");
intent.putExtra(Intent.EXTRA_TEXT, extraTitle+"\n"+extraText);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(
Intent.createChooser(intent, "分享"));
}
public static void shareVideo(Context context,String videoPath){
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND); //分享视频只能单个分享
shareIntent.putExtra(Intent.EXTRA_STREAM, videoPath);
shareIntent.setType("audio/*");
context.startActivity(Intent.createChooser(shareIntent, "分享到"));
}
}
四、总结
报错看Log,最后项目结构图