目录
1、目的
实现在Xamarin.Android中实现视频播放的功能
2、具体实现
视频的来源有多种方式,最简单就是本地的形式。
2.1 本地资源
在Resources文件夹,会有不同的子文件夹,具体如下:
序号 | 资源名称 | 内容 |
---|---|---|
1 | animator | 描述属性动画的 XML 文件 |
2 | anim | 描述补间动画的 XML 文件 |
3 | color | 描述颜色状态列表的 XML 文件 |
4 | drawable | 可绘制资源(包括:图像文件(jpg、png等)、位图、XML文件等) |
5 | layout | 用于存放页面布局的XML文件 |
6 | menu | 用于存放菜单定义的XML文件 |
7 | raw | 二进制资源、例如视频等 |
8 | values | 用于存放设定值的XML文件 |
9 | xml | 用于存放配置文件的XML文件 |
这里面有一些重点:
animator
与anim
的区别
里面内容较多,推荐文章:两者的不同
raw
与Assets
的差别
1、raw中的资源会被包括到Resources中。因此可以在代码中直接使用[<PackageName>.]Resource.<ResourceType>.<ResourceName>
方式直接访问资源(例如: Resource.Raw.zl002
)。asset中的内容需要使用AssetManager
来访问资源。
2、也正是因为第1条的原因,在asset文件夹中的文件,在编译后仍为原始文件。
3、raw下不可再创建文件夹(不能有目录);asset下可以有文件夹,有目录。
4、两者之间数据的读取方式略微不同。
asset的读取方式
// Read the contents of our asset
string content;
AssetManager assets = this.Assets;
using (StreamReader sr = new StreamReader (assets.Open ("read_asset.txt")))
{
content = sr.ReadToEnd ();
}
raw资源的读取方式
Stream rsr= this.Resources.OpenRawResource(Resource.Raw.zl002);
5、【?】操作文件的能力不同。Google的Android系统处理Asset有个bug,在AssetManager中不能处理单个超过1MB的文件,不然会报异常,raw没这个限制可以放个4MB的Mp3文件没问题。
xml
与Assets
的区别
与上面讲到基本差别不大。xml文件夹下可以只用资源ID进行访问。xml文件夹与raw文件夹差别为,xml下的资源会被编译为二进制;而raw不会被编译为二进制。
2.2 具体实现
1、添加资源
将资源添加到raw
文件夹中,并设置为AndroidResource
2、添加控件
layout布局中使用VideoView
<VideoView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/videoView2" />
3、初始化控件
在Activity
中进行控件初始化及添加控制器
private Android.Widget.VideoView videoView =null;
private Android.Widget.MediaController mediaController = null;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
SetContentView(Resource.Layout.activity_main);
//控制器,用于控制视频的开始、暂停等操作的
mediaController= new Android.Widget.MediaController(this);
//加载资源,并初始化
videoView = FindViewById<Android.Widget.VideoView>(Resource.Id.videoView2);
var uri = Android.Net.Uri.Parse("android.resource://" + Application.PackageName + "/" + Resource.Raw.zl002);//使用这种方式
videoView.SetVideoURI(uri);
videoView.Visibility = ViewStates.Visible;
videoView.ShowContextMenu();
videoView.SetMediaController(mediaController);
}
然后在某个地方调用Start
方法,开始播放视频
private void FabOnClick(object sender, EventArgs eventArgs)
{
View view = (View) sender;
try
{
videoView.Start();//开始播放视频
}
catch(Exception e)
{
Snackbar.Make(view, e.Message, Snackbar.LengthLong)
.SetAction("Action", (Android.Views.View.IOnClickListener)null).Show();
}
}
4、效果如下
3、参考资料
视频播放的参考资料:参考资料