Android Google Map Street View示例

时间:2020-02-23 14:28:57  来源:igfitidea点击:

在本教程中,我们将在Android应用程序中实现Google Maps的StreetView功能。

要将Google Maps API集成到您的应用程序中,请遵循本教程。

Google Map StreetView

顾名思义,街景视图提供了街景。
使用StreetView,您可以看到整个街道的图像,而无需查看位置的固定位置!

Google街景视图可提供该位置的360度全景视图。
街景视图可用于Android中的Google Maps v2。

要在您的应用程序中查看街景,您需要使用StreetViewPanorama类。
StreetViewPanorama负责在观看者(您)位于球体中心的情况下显示360度全景图像。

要将街景视图集成到您的应用程序中,您需要使用在XML布局中添加片段StreetViewPanoramaFragment

<fragment
      android:id="@+id/googleMapStreetView"
      android:name="com.google.android.gms.maps.StreetViewPanoramaFragment"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"

SupportStreetViewPanoramaFragment用于代替StreetViewPanoramaFragment以支持向后兼容。

要在您的应用程序中加载Google Maps Street View,您需要实现以下接口:OnStreetViewPanoramaReadyCallback

方法" onStreetViewPanoramaReady"被触发。
在此方法中,我们在StreetViewPanaroma实例上设置以下属性:

  • setPosition–我们在这里传递LatLang。
    可选地,我们可以传递一个常量StreetViewSource.OUTDOOR来查看位置(在街道上)的室外视图,而不是内部视图。

  • setStreetNamesEnabled(boolean)-启用此项将在全景图像上显示街道名称(如果存在)。

  • setUserNavigationEnabled(boolean)–启用此选项后,用户可以通过单击导航链接导航到不同的全景图。

  • setPanningGesturesEnabled()和setZoomGesturesEnabled()允许我们更改摄像机角度并分别放大到街道。

要获取街景视图中的当前位置,我们需要执行以下操作:streetViewPanorama.getLocation().position

getLocation()返回一个StreetViewPanoramaLocation实例。
在这种情况下,我们可以检索属性"链接"。

链接基本上是连接到当前全景图的所有全景图像的数组。

街景全景监听

我们可以在StreetViewPanaroma实例上添加侦听器事件:

  • OnStreetViewPanoramaChangeListener
  • OnStreetViewPanoramaCameraChangeListener
  • OnStreetViewPanoramaClickListener

例:

streetViewPanorama.setOnStreetViewPanoramaClickListener(new StreetViewPanorama.OnStreetViewPanoramaClickListener() {
          @Override
          public void onStreetViewPanoramaClick(StreetViewPanoramaOrientation streetViewPanoramaOrientation) {
             //Enter you logic.   
          }
      });

在该方法内部,我们可以添加任何自定义操作,例如,当方向倾斜超过特定水平时禁用缩放手势。

在下一部分中,我们将在Android应用程序中实现Google Maps Street View。

入门

添加您自己的SHA-1密钥并在Google控制台中生成API密钥。

在Android Manifest.xml应用程序标签中添加以下元数据:

<meta-data
          android:name="com.google.android.geo.API_KEY"
          android:value="YOUR_API_KEY" 

还要添加以下权限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" 
<uses-permission android:name="android.permission.INTERNET" 

在build.gradle文件中添加以下依赖项:

implementation 'com.google.android.gms:play-services-maps:15.0.1'
implementation 'com.android.support:design:28.0.0-alpha3'

现在,我们都准备在我们的Android应用程序中实现Google Maps Street View。

代码

下面给出了" activity_main.xml"的代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
  xmlns:app="https://schemas.android.com/apk/res-auto"
  xmlns:tools="https://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MainActivity">

  <fragment
      android:id="@+id/googleMapStreetView"
      android:name="com.google.android.gms.maps.SupportStreetViewPanoramaFragment"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toTopOf="parent" 

  <android.support.design.widget.FloatingActionButton
      android:id="@+id/fab"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginBottom="16dp"
      android:layout_marginEnd="16dp"
      android:layout_marginRight="16dp"
      android:src="@android:drawable/ic_dialog_map"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent" 

</android.support.constraint.ConstraintLayout>

我们添加了一个FloatingActionButton,它将切换StreetView片段以显示新位置。

MainActivity.java的代码如下:

package com.theitroad.androidgooglemapstreetview;

import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.google.android.gms.maps.OnStreetViewPanoramaReadyCallback;
import com.google.android.gms.maps.StreetViewPanorama;
import com.google.android.gms.maps.SupportStreetViewPanoramaFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.StreetViewPanoramaCamera;
import com.google.android.gms.maps.model.StreetViewPanoramaLocation;
import com.google.android.gms.maps.model.StreetViewPanoramaOrientation;
import com.google.android.gms.maps.model.StreetViewSource;

public class MainActivity extends AppCompatActivity
      implements OnStreetViewPanoramaReadyCallback {

  private StreetViewPanorama mStreetViewPanorama;
  private boolean secondLocation = false;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      SupportStreetViewPanoramaFragment streetViewFragment =
              (SupportStreetViewPanoramaFragment) getSupportFragmentManager()
                      .findFragmentById(R.id.googleMapStreetView);
      streetViewFragment.getStreetViewPanoramaAsync(this);

      FloatingActionButton fab = findViewById(R.id.fab);
      fab.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              secondLocation = !secondLocation;
              onStreetViewPanoramaReady(mStreetViewPanorama);
          }
      });

  }

  @Override
  public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) {
      mStreetViewPanorama = streetViewPanorama;

      if (secondLocation) {
          streetViewPanorama.setPosition(new LatLng(51.52887, -0.1726073), StreetViewSource.OUTDOOR);
      } else {
          streetViewPanorama.setPosition(new LatLng(51.52887, -0.1726073));
      }
      streetViewPanorama.setStreetNamesEnabled(true);
      streetViewPanorama.setPanningGesturesEnabled(true);
      streetViewPanorama.setZoomGesturesEnabled(true);
      streetViewPanorama.setUserNavigationEnabled(true);
      streetViewPanorama.animateTo(
              new StreetViewPanoramaCamera.Builder().
                      orientation(new StreetViewPanoramaOrientation(20, 20))
                      .zoom(streetViewPanorama.getPanoramaCamera().zoom)
                      .build(), 2000);

      streetViewPanorama.setOnStreetViewPanoramaChangeListener(panoramaChangeListener);

  }

  private StreetViewPanorama.OnStreetViewPanoramaChangeListener panoramaChangeListener =
          new StreetViewPanorama.OnStreetViewPanoramaChangeListener() {
              @Override
              public void onStreetViewPanoramaChange(
                      StreetViewPanoramaLocation streetViewPanoramaLocation) {

                  Toast.makeText(getApplicationContext(), "Lat: " + streetViewPanoramaLocation.position.latitude + " Lng: " + streetViewPanoramaLocation.position.longitude, Toast.LENGTH_SHORT).show();

              }
          };
}

我们在同一位置显示两个位置。
一个是室内,另一个是室外。
每当全景图片更改时,都会触发panoramaChangeListener
它显示当前位置的Toast。