全景服务(Panorama Kit)是华为为开发者提供的全景图片和全景视频浏览服务。您可以通过SDK集成全景服务,在Android手机上快速将二维的平面图模拟成真实的三维空间,给用户带来沉浸感与真实感。
在这个Codelab中,你将使用已经创建好的Demo Project实现对全景开放服务的API调用,通过Demo Project你可以体验到:
全景SDK为纯端侧能力,无须接入华为AGC即可调用。
下载示例代码后,将代码解压缩至本地路径。
步骤1: 打开Android Studio。
步骤2:
选择"File" ->
"Open",选择示例代码解压缩后的路径。
|
|
步骤3: 点击"ok"按钮。
步骤4:
查看仓库路径、依赖包、权限、混淆脚本的配置。Demo中已配置好,但后续您自己的工程中,需参考并修改。
在项目级build.gradle文件中配置maven仓库路径:
buildscript {
repositories {
...
maven { url 'https://developer.huawei.com/repo/' }
}
...
}
allprojects {
repositories {
...
maven { url 'https://developer.huawei.com/repo/' }
}
}
...
在应用级build.gradle文件中配置了依赖包,如下:
dependencies {
...
implementation 'com.huawei.hms:panorama:4.0.4.301'
...
}
在Manifest中配置了读写外部存储的权限(在Android 6.0及以上的版本,还需要您动态申请该权限),如下:
...
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
配置混淆脚本,在app/proguard-rules.pro文件中配置了如下三行:
-ignorewarnings
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.hianalytics.android.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}
Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请根据您当前的Gradle插件版本,选择对应的配置过程。
7.0以下版本 |
7.0版本 |
7.1及以上版本 |
7.0以下版本
buildscript {
repositories {
google()
jcenter()
// 配置HMS Core SDK的Maven仓地址。
maven {url 'https://developer.huawei.com/repo/'}
}
dependencies {
...
// 增加agcp插[最新版本](https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-sdk-changenotes-0000001058732550)推荐您使用最新版本的agcp插件。
classpath 'com.huawei.agconnect:agcp:1.6.0.300'
}
}
allprojects {
repositories {
google()
jcenter()
// 配置HMS Core SDK的Maven仓地址。
maven {url 'https://developer.huawei.com/repo/'}
}
}
7.0版本
buildscript {
repositories {
google()
jcenter()
// 配置HMS Core SDK的Maven仓地址。
maven {url 'https://developer.huawei.com/repo/'}
}
dependencies {
...
// 增加agcp插件配置,推荐您使用最新版本的agcp插件。
classpath 'com.huawei.agconnect:agcp:1.6.0.300'
}
}
dependencyResolutionManagement {
...
repositories {
google()
jcenter()
// 配置HMS Core SDK的Maven仓地址。
maven {url 'https://developer.huawei.com/repo/'}
}
}
7.1及以上版本
buildscript {
dependencies {
...
// 增加agcp插[最新版本](https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-sdk-changenotes-0000001058732550)推荐您使用最新版本的agcp插件。
classpath 'com.huawei.agconnect:agcp:1.6.0.300'
}
}
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
// 配置HMS Core SDK的Maven仓地址。
maven { url 'https://developer.huawei.com/repo/' }
}
}
dependencyResolutionManagement {
...
repositories {
google()
mavenCentral()
// 配置HMS Core SDK的Maven仓地址。
maven { url 'https://developer.huawei.com/repo/' }
}
}
导入完成后,点击图标进行同步,可在下图所示框中观察同步状况:
同步完成后,点击图标 ,运行Android
Studio工程打包生成APK,并安装在测试手机上,运行效果如下图所示:
前三个按钮分别代表全景图片的三种调用方式,点击其中的一个可看到全景图浏览的效果:
第四个按钮为全景视频的调用方式,点击后可看到全景视频的浏览效果:
并且在进入全景服务后,可以点击或来切换浏览模式。
您可以修改Demo中的图片URI来指定其他任意图片,例如:
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.pano);
如果您需要浏览环形全景图,可以通过API指定类型IMAGE_TYPE_RING来浏览:
Panorama.getInstance().loadImageInfo(this, uri, PanoramaInterface.IMAGE_TYPE_RING).setResultCallback(new ResultCallbackImpl());
如果您想要更灵活的使用全景服务,需要调用全景SDK的LocalInterface,可参考LocalDisplayActivity中的实现代码。
步骤1 新建一个Layout。
Layout用于放置全景显示的View,左下角放置一个ImageButton,显示切换控制方式的图标。
步骤2 获取LocalInterface对象。
mLocalInterface = Panorama.getInstance().getLocalInstance(this);
步骤3 初始化并设置图片Uri和图片类型。
mLocalInterface.init();
mLocalInterface.setImage(uri, PanoramaInterface.IMAGE_TYPE_SPHERICAL);
步骤4 获取View并加入之前新建的Layout中。
RelativeLayout mLayout= findViewById(R.id.relativeLayout);
View mPanoramaView= mLocalInterface.getView();
mLayout.addView(mPanoramaView);
监听Button的事件用来切换控制方式
mChangeModeButton = findViewById(R.id.changeModeButton);
...
initControlMode();
...
private void initControlMode() {
mChangeModeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (controlModeCount % 3 == 0) {
mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_TOUCH);
mChangeModeButton.setText(R.string.button_touch);
} else if (controlModeCount % 3 == 1) {
mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_POSE);
mChangeModeButton.setText(R.string.button_pose);
} else {
mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_MIX);
mChangeModeButton.setText(R.string.button_mix);
}
controlModeCount++;
}
});
mChangeModeButton.performClick();
}
步骤5 将View的触摸事件传给SDK。
mPanoramaView.setOnTouchListener(this);
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (mPanoramaView != null && mPanoramaView.equals(view)) {
if (mLocalInstance != null) {
mLocalInstance.updateTouchEvent(motionEvent);
return true;
}
}
return false;
}
步骤6 点击图标 ,运行Android Studio工程打包生成APK,并安装在测试手机上,点击localInterface即可看到效果:
—-结束
如果您想要在运行过程中加载其他的全景图片,可以调用setImage接口指定不同的全景图:
private void doDisplaySpherical() {
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.pano);
Log.i(LOG_TAG, "test uri " + uri.toString());
int ret = mLocalInstance.setImage(uri, PanoramaInterface.IMAGE_TYPE_SPHERICAL);
if (ret != ResultCode.SUCCEED) {
logAndToast("doDisplaySpherical setImage failed " + ret);
return;
}
addViewToLayout();
}
同理,如果您想要在运行过程中加载其他的全景视频,可以调用getSurface接口指定全景视频类型,调用initMediaPlayer方法播放视频:
private void doDisplayVideo() {
Surface videoSurface = mLocalInstance.getSurface(PanoramaInterface.IMAGE_TYPE_SPHERICAL);
if (videoSurface == null) {
logAndToast("videoSurface is null");
return;
}
Uri videoUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.sample);
initMediaPlayer(videoUri, videoSurface);
addViewToLayout();
}
private void initMediaPlayer(Uri videoUri, Surface surface) {
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(getApplicationContext(), videoUri);
} catch (IOException e) {
e.printStackTrace();
return;
}
mPlayer.setLooping(true);
mPlayer.setSurface(surface);
try {
mPlayer.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "Media Player prepare exception");
}
mPlayer.start();
float ratio = mPlayer.getVideoWidth() / (float) mPlayer.getVideoHeight();
Log.i(LOG_TAG, "ratio = " + ratio);
mLocalInstance.setValue(PanoramaInterface.KEY_VIDEO_RATIO, String.valueOf(ratio));
}
干得好,您已经成功完成了Codelab并学到了:
您可以阅读下面链接,了解更多相关的信息。
开发指南