视频服务(HUAWEI Video Kit)提供视频播放服务,后续将提供视频编辑和视频托管服务,助力开发者快速构建视频特性,帮助开发者向用户提供视频媒体体验。
在这个Codelab中,您将使用已经创建好的示例Sample实现对Video Kit的API调用,通过示例Sample您可以体验到:
Android基础开发能力
集成HUAWEI HMS Core能力,需要完成以下准备工作:
build.gradle
文件中,添加HUAWEI agcp插件以及Maven代码库。
buildscript {
repositories {
......
maven {url 'https://developer.huawei.com/repo/'}
}
dependencies {
......
classpath 'com.huawei.agconnect:agcp:1.6.0.300' // HUAWEI agcp plugin
}
}
allprojects {
repositories {
......
maven {url 'https://developer.huawei.com/repo/'}
}
}
HUAWEIagcp插件。
apply plugin: 'com.android.application'
// Add the following line
apply plugin: 'com.huawei.agconnect' // HUAWEI agconnect Gradle plugin
android {
......
}
build.gradle
中配置Maven依赖。
dependencies {
......
implementation 'com.huawei.hms:videokit-player:1.0.14.300'
}
HMS Core(APK)
的场景下使用Video Kit
,则需在"dependencies"
中添加如下编译依赖,集成两个fallback
。
dependencies {
implementation 'com.huawei.hms:videokit-player-fallback:1.0.14.300'
}
build.gradle
中配置ndk
配置。
android {
defaultConfig {
......
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
......
}
AndroidManifest.xml
中添加权限。
// 获取访问网络权限
<uses-permission android:name="android.permission.INTERNET" />
// 获取网络状态信息权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
// 获取访问wifi网络状态权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
// 获取写入存储权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
// 获取读取存储权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
// (可选)获取读取手机信息权限,可以更好的体验播放器功能
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
// 获取检查手机是否root权限
<uses-permission android:name="com.huawei.permission.SECURITY_DIAGNOSE" />
// (可选)获取设置手机唤醒状态权限,调用setWakeMode方法需要添加该权限
<uses-permission android:name="android.permission.WAKE_LOCK" />
开发者编译APK前需要配置混淆配置文件,避免混淆HMS Core SDK导致功能异常。
Android Studio开发环境里的配置文件是"proguard-rules.pro
"。
-ignorewarnings
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}
-keep class com.huawei.hianalytics.**{*;}
# 集成fallback SDK需要添加动态加载dynamic不混淆
-keep class com.huawei.hms.feature.dynamic.descriptors.huawei_module_videoplayer.AssetModuleDescriptor{*;}
"R.string.hms*",
"R.string.connect_server_fail_prompt_toast",
"R.string.getting_message_fail_prompt_toast",
"R.string.no_available_network_prompt_toast",
"R.string.third_app_*",
"R.string.upsdk_*",
"R.layout.hms*",
"R.layout.upsdk_*",
"R.drawable.upsdk*",
"R.color.upsdk*",
"R.dimen.upsdk*",
"R.style.upsdk*",
"R.string.agc*"
App需要实现一个继承Application的类,在onCreate()方法中调用播放器SDK初始化接口WisePlayerFactory.initFactory()。
public class VideoKitApplication extends Application {
private static final String TAG = "VideoKitApplication";
private static WisePlayerFactory factory;
@Override
public void onCreate() {
super.onCreate();
// setDeviceId方法需要传入手机的DeviceId
// setServeCountry方法需要传入国家/地区码
WisePlayerFactoryOptionsExt.Builder factoryOptions =
new WisePlayerFactoryOptionsExt.Builder().setDeviceId("xxx");
// 设置日志配置信息
LogConfigInfo logCfgInfo = new LogConfigInfo(1, "", 20, 1024);
factoryOptions.setLogConfigInfo(logCfgInfo);
// Application onCreate在多进程的场景下会被调用多次
// App需要在App进程(App包名)和播放器进程(App包名:player)的Application onCreate中调用WisePlayerFactory.initFactory()接口
WisePlayerFactory.initFactory(this, factoryOptions.build(), new InitFactoryCallback() {
@Override
public void onSuccess(WisePlayerFactory wisePlayerFactory) {
Logger.d(TAG, "onSuccess wisePlayerFactory:" + wisePlayerFactory);
factory = wisePlayerFactory;
}
@Override
public void onFailure(int errorCode, String msg) {
Logger.e(TAG, "onFailure errorcode:" + errorCode + " reason:" + msg);
}
});
}
public static WisePlayerFactory getWisePlayerFactory() {
return factory;
}
}
import android.view.SurfaceHolder.Callback;
import android.view.TextureView.SurfaceTextureListener;
public class PlayActivity extends AppCompatActivity implements Callback, SurfaceTextureListener, WisePlayer.ErrorListener, WisePlayer.ReadyListener, WisePlayer.EventListener, WisePlayer.PlayEndListener,WisePlayer.ResolutionUpdatedListener, WisePlayer.SeekEndListener, WisePlayer.LoadingListener
WisePlayer player = VideoKitApplication.getWisePlayerFactory().createWisePlayer();
// 方式1:SurfaceView显示界面
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surface_view);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// 方式2:TextureView显示界面
TextureView textureView = (TextureView) findViewById(R.id.texture_view);
textureView.setSurfaceTextureListener(this);
// 设置播放器错误信息上报监听器
player.setErrorListener(this);
// 设置播放器媒体以及播放信息上报监听器
player.setEventListener(this);
// 设置播放视频分辨率发生变化监听器
player.setResolutionUpdatedListener(this);
// 设置媒体内容已经完成准备监听器
player.setReadyListener(this);
// 设置播放器缓冲相关事件的监听器
player.setLoadingListener(this);
// 设置播放完成监听器
player.setPlayEndListener(this);
// 设置seek操作完成的监听器
player.setSeekEndListener(this);
player.setVideoType(PlayMode.PLAY_MODE_NORMAL);
player.setBookmark(10000);
player.setCycleMode(CycleMode.MODE_CYCLE);
// 方式1:设置单个播放地址
player.setPlayUrl("https://videoplay-mos-dra.dbankcdn.com/P_VT/video_injection/92/v3/C072F990370950198572111872/MP4Mix_H.264_1920x1080_6000_HEAAC1_PVC_NoCut.mp4");
// 方式2:设置多个播放地址(同一个视频内容,主备播放地址)
// player.setPlayUrl(new String[] {"https://videoplay-mos-dra.dbankcdn.com/P_VT/video_injection/92/v3/C072F990370950198572111872/MP4Mix_H.264_1920x1080_6000_HEAAC1_PVC_NoCut.mp4", "https://videoplay-mos-dra.dbankcdn.com/P_VT/video_injection/92/v3/C072F990370950198572111872/MP4Mix_H.264_1920x1080_6000_HEAAC1_PVC_NoCut.mp4"});
// SurfaceView监听回调
@Override
public void surfaceCreated(SurfaceHolder holder) {
player.setView(surfaceView);
}
// TextureView监听回调
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
player.setView(textureView);
// 切换到前台需要调用resume接口,通过传入参数可以控制是否自动播放
player.resume(ResumeType.KEEP);
}
player.ready();
@Override
public void onReady(WisePlayer wisePlayer) {
player.start();
}
在Android Studio中,点击图标,在设备上启动示例应用程序。程序运行界面如下:
首页界面
首页设置界面
播放界面
播放设置界面
干得好,您已经成功完成了Codelab并学到了
您可以阅读下面链接,了解更多相关的信息。
相关文档
您可以点击下方按钮下载源码。