ETC/무더위 쉼터

공공데이터 + Google Map API Android 어플리케이션(2)

[ 관련 포스팅 ]

2019/06/03 - [앱 개발/무더위 쉼터] - 공공데이터 + Google Map API Android 어플리케이션(1)

2019/06/04 - [앱 개발/무더위 쉼터] - 공공데이터 + Google Map API Android 어플리케이션(3)

 

 

 

전 포스팅에서는 공공데이터에서 데이터를 받고 GoogleAPI를 발급받는 방법을 알아보았고 이번에는 발급받은 데이터와 키를 내 프로젝트에 등록해보겠습니다.

 

1. Google API Key 등록

 

생성한 프로젝트를 보면 상단에 AndroidMainFest파일이 있습니다. 

 

 AndroidMainFest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
  <meta-data
      android:name="com.google.android.geo.API_KEY"
      android:value="your_google_maps_key" />
  <uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />
</application>

위의 코드를 AndroidMainFest에 넣어줍니다.

your_google_maps_key부분에 발급받은 Google key를 넣으시면 됩니다.

 

2. Google Play services 라이브러리 설치

 

Google Maps Android API를 사용하려면 Google Play services 라이브러리 패키지를 설치해야합니다.

Tools - SDK Mangner - Android SDK - SDK Tools - Google Play services항목울 체크해 주세요.

 

[Google Play services 라이브러리 패키지]

 

3. build.gradle(Module : app)

 

[build.gradle(Module : app)]

build.gradle(Module : app) Google Play Services 라이브러리를 프로젝트에서 사용할 수 있게 등록 해야 합니다.

아래 코드를 추가해 주세요.

android {
	compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
dependencies{
    implementation 'com.android.support:support-media-compat:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.google.android.gms:play-services-maps:16.1.0'
    implementation 'com.google.android.gms:play-services-location:16.0.0'
    implementation 'com.roughike:bottom-bar:2.3.1'
    implementation 'com.android.support:design:28.0.0'
    implementation 'android.arch.lifecycle:extensions:1.1.1'
    implementation 'jexcelapi:jxl:2.6'
    implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
    implementation 'com.google.maps.android:android-maps-utils:0.4'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
}

 

4.  레이아웃 작성

 

지도를 띄우기 위한 레이아웃을 작성합니다.

위쪽에 지역을 선택 할 수 있도록 Spinner와 ImageButton을 넣었습니다.

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <fragment
        android:id="@+id/g_map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.MapFragment" />

</LinearLayout>

 

5. Map을 보여주는 Activity 작성

 

레이아웃에서 선언한 fragment를 선언해 g_map을 가져옵니다.

위도와 졍도를 정해주고 마커를 선언 후 마커의 옵션을 작성해합니다.

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

  FragmentManager fragmentManager = getFragmentManager();
  MapFragment mapFragment = (MapFragment)fragmentManager.findFragmentById(R.id.g_map);
  mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(final GoogleMap map) {

  LatLng latlng = new LatLng(37.56, 126.97);

  MarkerOptions markerOptions = new MarkerOptions();
  markerOptions.position(latlng);
  markerOptions.title("서울");
  markerOptions.snippet("서울특별시 중구 의주로2가 16-8");
  map.addMarker(markerOptions);

  map.moveCamera(CameraUpdateFactory.newLatLng(latlng));
  map.animateCamera(CameraUpdateFactory.zoomTo(10));
}

 

6. 지역 선택 Spinner 작성

 

지역을 선택하기 위해 레이아웃 상단에 만들어둔 Spinner에 넣을 값을 아이템으로 작성해 주어야 합니다.

strings 안에 item을 선언해 주세요.

<string-array name="spinner01">
  <item>강원도</item>
  <item>경기도</item>
  :
</string-array>
<string-array name="spinner02">
  <item>강릉시</item>
  <item>고성군</item>
  :
</string-array>
:

도시를 선택하면 해당 지역을 나타날 수 있게 하기 위해서 spinner를 여러개로 나누어 작성하였습니다.

spinner01은 도시(특별시)가 될것 이고, spinner02~는 각 시의 지역이 됩니다.

 

string-array로 값을 주었기 때문에 받아올때는 ArrayAdapter<CharSequence>로 받아와야 합니다.

 

ArrayAdapter<CharSequence> spinner01, spinner02, ... ;
spinner01 = ArrayAdapter
	.createFromResource(this, R.array.spinner01, android.R.layout.simple_spinner_dropdown_item);
Spinner spin01 = (Spinner) findViewById(R.id.spinner1);
Spinner spin02 = (Spinner) findViewById(R.id.spinner2);
spin01.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  //spinner1를 누르면 나타나는 코드 작성
  spin02.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  	//spinner2에 표시할 내용 작성
  }
}

7. assets에 데이터 넣기

 

Now - Folder - Assets Floder를 선택하면 폴더가 생성되는데 생성된 폴더에 전처리 해서 나눠둔 파일을 넣어주세요.

 

데이터가 .xls 형식으로 되어 있음으로 위의 build.gradle에 추가 해 주었던 jxl를 사용해 데이터를 받아오겠습니다.

InputStream is = getBaseContext().getResources().getAssets().open(filename);
Workbook wb = Workbook.getWorkbook(is);

InputStream를 선언해 filename에 들어갈 이름과 같은 assets폴더안의 파일을 가져옵니다.

MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(testmarker);//위도경도
markerOptions.title(markerTitle);//마커를 눌렀을때 나타나는 말풍선 제목
markerOptions.snippet(markerSnippet);//말풍선 제목 밑의 작은 글씨
markerOptions.draggable(true);

마커를 선언하고 가져온 데이터를 마커 옵션에 넣어줍니다.

 

8. GoogleMap.setOnInfoWindowClickListener

 

마커를 선택하면 말풍선이 나오고 그 말풍선을 클릭했을 때 새로운 화면으로 넘어 가기 위해서 OnInfoWindowClickListener를 사용합니다.

[마커를 선택했을때 나타나는 말풍선]

GoogleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {

  @Override
  public void onInfoWindowClick(Marker marker) {
    Intent intent = new Intent(getBaseContext(), NewActivity.class);

    //넘겨줄 값

    startActivity(intent);
  }
});

Intent를 선언해 값을 저장하고 새로운 Activity에 데이터를 넘깁니다.

 

9. NewActivity

 

화면 위에는 선택한 마커의 지도상의 위치를 보여주고 하단에 쉼터의 상세한 정보를 보여주려고 합니다.

LinearLayout으로 화면을 나눠 작성했습니다.

activity_new.xml

<LinearLayout
  android:layout_width="match_parent"
  android:layout_height="345dp">
  <fragment
    android:id="@+id/mapView"
    class="com.google.android.gms.maps.MapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</LinearLayout>
<LinearLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  android:layout_marginLeft="10pt">
  <TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/imageView1"
    android:text="Naem"
    android:textAppearance="?android:attr/textAppearanceLarge" />
    :
</LinearLayout>

지도를 띄우기 위해 MapFragment를 선언해 줍니다.

FragmentManager fragmentManager = getFragmentManager();
MapFragment mapFragment = (MapFragment)fragmentManager.findFragmentById(R.id.mapView);
mapFragment.getMapAsync(this);

Bundle을 통해 MainActivity에서 넘져준 값을 받아옵니다.

Bundle extras = getIntent().getExtras();

title = extras.getString("title");
address = extras.getString("address");
excelname = extras.getString("excelname");
:

MainActivity에서 넘겨준 값과 엑셀에서 받아온 값이 같다면 같은 값을 리턴받아 TextView에 넣어줍니다.

if (excelname == null && inter2 == 0) {
	//
  }else{
  	Excel(excelname, inter2);
  }
  if (choice_do == null && inter == 0) {
  	//
  }else{
  	Excel(choice_do, inter);
}
private void Excel(String excelname, int inter2) {
	//엑셀 데이터 가져오는 코드
}
TextView tvTitle = tvTitle.setText("쉼터명 : " + title);

 

10. 결과물

[완성 결과물]

[ 관련 포스팅 ]

2019/06/03 - [앱 개발/무더위 쉼터] - 공공데이터 + Google Map API Android 어플리케이션(1)

2019/06/04 - [앱 개발/무더위 쉼터] - 공공데이터 + Google Map API Android 어플리케이션(3)

728x90