Android 10.0及以上的版本由于沙盒机制的原因,无法直接通过路径访问外部存储下的媒体文件,请通过ContentResolver获取媒体文件的Uri。
全景服务有应用外全景展示调用和应用内全景展示调用两种用法:
应用外全景展示调用是指通过全景SDK的API获取一个Intent,然后跳转至全景服务中的Activity进行全景图的浏览。该调用方式全景服务会在调用该服务的应用外新建一个窗口进行全景信息展示,与之有关的接口为loadImageInfo 和loadImageInfoWithPermission 。
应用内全景展示调用是指应用在自己进程内,通过全景SDK的API进行全景图的浏览。该方式更为灵活,全景服务相当于返回一个全景图层,调用该服务的应用可以灵活确定这个图层的展示位置以及在图层上叠加其他图层信息,如广告信息。与之有关的接口为getLocalInstance 及PanoramaLocalInterface 中包含的接口。
使用应用外全景展示调用时,需要先从全景服务获取用于跳转到全景Activity的Intent,然后通过startActivity传入此Intent,并完成跳转来展示全景图。详细步骤如下:
将全景图的Uri作为输入参数,随后获取可跳转到全景展示Activity的Intent,并完成跳转。
与之相关的接口为:
PendingResult<ImageInfoResult> loadImageInfo (Context context, Uri uri);
PendingResult<ImageInfoResult> loadImageInfoWithPermission (Context context, Uri uri);
| Parameter name | Parameter desc |
|---|---|
| context | 应用上下文,如果需要主动触发升级,需要传入Activity。 |
| uri | 将要加载的全景图URI,支持以file、content及android.resource开头的三类Uri。 |
Android 10.0及以上的版本由于沙盒机制的原因,无法直接通过路径访问外部存储下的媒体文件,请通过ContentResolver获取媒体文件的Uri。
获取Intent的方法分为同步调用和异步调用,示例代码如下:
- new Thread(new Runnable() {
- @Override
- public void run() {
- PanoramaInterface.ImageInfoResult panoramaResult = Panorama.getInstance().loadImageInfo(MainActivity.this, uri).await();
- if (panoramaResult == null) {
- Log.e(LOG_TAG, "ImageInfoResult is null");
- return;
- }
- if (panoramaResult.getStatus().isSuccess()) {
- Intent intent = panoramaResult.getImageDisplayIntent();
- if (intent != null) {
- startActivity(intent);
- }
- } else {
- Log.e(LOG_TAG, "error: " + panoramaResult);
- }
- }
- }).start();
- Panorama.getInstance().loadImageInfo(this, uri).setResultCallback(
- new ResultCallback<PanoramaInterface.ImageInfoResult>() {
- @Override
- public void onResult(PanoramaInterface.ImageInfoResult panoramaResult) {
- if (panoramaResult == null) {
- Log.e(LOG_TAG, "ImageInfoResult is null");
- return;
- }
- if (panoramaResult.getStatus().isSuccess()) {
- Intent intent = panoramaResult.getImageDisplayIntent();
- if (intent != null) {
- startActivity(intent);
- }
- } else {
- Log.e(LOG_TAG, "error: " + panoramaResult);
- }
- }
- });
目前仅支持以file、content及android.resource开头的三类Uri。
loadImageInfoWithPermission与loadImageInfo的用法相似,区别在于通过该接口获取的Intent将会带有对第三方应用提供的Uri拥有临时访问授权。
某些全景图没有元数据信息,但是开发者需要展示该全景图,那么就必须强制指定全景图类型,与之相关的接口为:
PendingResult<ImageInfoResult> loadImageInfo(Context context, Uri uri, int type);
PendingResult<ImageInfoResult> loadImageInfoWithPermission(Context context, Uri uri, int type);
| Parameter name | Parameter desc |
|---|---|
| context | 应用上下文,如果需要主动触发升级,需要传入Activity。 |
| uri | 将要加载的全景图URI,支持以file、content及android.resource开头的三类Uri。 |
| type | 图片类型,当前支持球形全景图、柱状全景图。 |
上述接口获取跳转Intent的方式与loadImageInfo完全相同,示例代码如下:
- new Thread(new Runnable() {
- @Override
- public void run() {
- PanoramaInterface.ImageInfoResult panoramaResult = Panorama.getInstance().loadImageInfo(MainActivity.this, uri, PanoramaInterface.IMAGE_TYPE_SPHERICAL).await();
- if (panoramaResult == null) {
- Log.e(LOG_TAG, "ImageInfoResult is null");
- return;
- }
- if (panoramaResult.getStatus().isSuccess()) {
- Intent intent = panoramaResult.getImageDisplayIntent();
- if (intent != null) {
- startActivity(intent);
- }
- } else {
- Log.e(LOG_TAG, "error: " + panoramaResult);
- }
- }
- }).start();
- Panorama.getInstance().loadImageInfo(this, uri, PanoramaInterface.IMAGE_TYPE_SPHERICAL).setResultCallback(
- new ResultCallback<PanoramaInterface.ImageInfoResult>() {
- @Override
- public void onResult(PanoramaInterface.ImageInfoResult panoramaResult) {
- if (panoramaResult == null) {
- Log.e(LOG_TAG, "ImageInfoResult is null");
- return;
- }
- if (panoramaResult.getStatus().isSuccess()) {
- Intent intent = panoramaResult.getImageDisplayIntent();
- if (intent != null) {
- startActivity(intent);
- }
- } else {
- Log.e(LOG_TAG, "error: " + panoramaResult);
- }
- }
- });
目前仅支持以file、content及android.resource开头的三类Uri。
目前支持IMAGE_TYPE_SPHERICAL和IMAGE_TYPE_RING两种格式的全景图。
loadImageInfoWithPermission与loadImageInfo的用法相似,区别在于通过该接口获取的Intent将会带有对第三方应用提供的Uri拥有临时访问授权。