구글 맵 사용하기(Google Maps Android API v2)

Posted on 2013. 8. 6. 15:10
Filed Under IT/안드로이드

핵심

1. google-play-services-lib 필요

2. 구글 지도를 사용하기 위한 api key 필요

 

간만에 구글 지도 사용하기에 대해서 적어 볼까 합니다.

작업하면서 느낀점은 이상하게 그냥 안될때가 있더라는점 입니다.

 

웹 상에 보시면 안될때 이것저것 하라고 하는게 몇가지 있던데 그래도 안되면 그냥 Google APIs에서 프로젝트를 새로 생성하거나 이클립스에서 프로젝트를 삭제하고 다시 만든 후에 코드를 붙여넣기로 넣어보세요.

 

저는 하루종일 뻘짓하다가 Google APIs에서 프로젝트 새로 생성해서 키 생성하니까 잘 되네요.

 

구글 지도 사용 순서는 웹상에 많으므로 간단히 정리하는 차원에서 적어봅니다.

 

1. Android SDK Manager를 통해서 Google Play services를 다운 받습니다.

 

2. 다운 받은 Google Play services를 워크스페이스로 가지고 와야 합니다.

이클립스에서 File > New > Other > Android Project from Existing Code 를 선택합니다.

 

아래의 경로를 선택해서 프로젝트를 가져옵니다.

android SDK 폴더\extras\google\google_play_services\libproject\google-play-services_lib

 

3. Package Explorer에서 구글 지도를 사용할 프로젝트 이름에서 우클릭하여 Properties > Android를 선택합니다.

그러면 아래와 같이 아래쪽에 Library부분이 비어 있을 텐데요.

 

 

Add...버튼을 누르고

 

 

google-play-services_lib를 선택합니다.

 

 

짜잔... 위와 같이 나오면 1차 설정은 끝.

 

4. 이제 구글에서 API키를 발급 받아야 합니다.

먼저 google api console로 들어갑니다. 여기서 프로젝트를 따로 관리하실 분은 프로젝트명을 바꾸셔도 되구요.. 테스트니까 일단 그냥 ㄱㄱ

요렇게 Services로 들어갑니다. 프로젝트 이름은 모자이크...

 

서비스를 내리다보면 Google Maps Android API v2 항목이 있습니다. 이것을 체크해서 ON으로 설정합니다. 주의 사항은 Google Maps API 가 아니라는 점입니다.

 

 

체크를 했으면 다음 단계로...

 

이제 Google APIs에서 API Access 메뉴를 선택합니다.

그리고 아래쪽의 Create New Android Key버튼을 선택해서 키 생성 다이얼로그를 띄웁니다.

 

 

다이얼로그 하단에 예제가 있습니다. 사용중인 서명파일의 SHA1 인증키와 패키지 명을 이용해서 키를 생성하면 됩니다.

 

현재는 디버깅 모드에서 사용할 것이므로 디버그용 서명파일의 키를 이용합니다.

 

적다보니 할일이 참 많네요.

 

디버그용 서명파일의 키는 이클립스에서 Window > Preferences > Android > Build에서 확인할 수 있습니다. 아래의 이미지를 참고하세요.

 

 

(내용추가)

정식 인증서에서 인증서 지문(SHA1) 얻을때는 아래와 같이 넣어주면 됩니다.

keytool.exe -list -keystore test.keystore(인증서명) -keypass aaa123(패스워드) -storepass aaa123(패스워드)

 

 

위에서 얻은 키를 아래와 같이 SHA1키;패키지명 형식으로 넣습니다.

 

생성하면...

 

짜잔~ 이제 이렇게 키가 추가되었네요.

 

이제 사용만 하면 끝.

 

5. 쓰는 김에 사용법까지 올려야 겠네요.

내용은 별게 아닌데 무지 기네요. 성의 없이 대충 적고있습니다.

 

먼저 AndroidManifest.xml 파일에 권한과 키값을 적습니다.

 

먼저 권한입니다. 아래의 권한을 추가해 주세요. 위치는 application바깥쪽에 위치하게 하면 됩니다.

 

<permission
        android:name="com.u_kids.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.u_kids.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

 

두번째 키값을 넣습니다. 키값도 AndroidManifest.xml에 넣으면 됩니다.

application태그 사이에 요렇게 넣습니다.

4번 과정에서 마지막에 얻은 API Key입니다..

 

... 

<meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyAoBXPGU_2ShfPingNFlQT-tYlBKIC9rPE" />
</application>

 

사용할 때는 fragment를 이용하면 간단하게 사용할 수 있습니다.

 

 

써놓고 정리를 좀 하려고 했는데 정리가 안되네요. 쓴지 좀 지났지만 이제라도 올려봅니다.

저도 시간이 지나니까 기억이 안나서 정리가 필요하네요.

GCM메시지 사용법도 올려야 하는데... 요즘 너무 바쁘네요.ㅠㅠ

ADT업데이트 후 java.lang.NoClassDefFoundError에러 발생하는 문제

Posted on 2012. 4. 6. 14:12
Filed Under IT/안드로이드

 

금요일이고해서 일도 쉬엄쉬엄 할 겸 안드로이드 글이나 좀 보면서 이클립스 ADT를 업데이트했는데요.

업데이트 후에 잘 되면 앱이 에러를 뿜네요.

DDMS에서 메시지를 보니 대략 이런 메시지가 보이네요.

 04-06 13:50:46.567: E/AndroidRuntime(3901): Caused by: java.lang.NoClassDefFoundError: tool.parameter.Parameters

ADT를 업데이트했더니 이클립스에선 잘 인식하는데 실제 동작에서 클래스를 못 찾습니다.

무슨 일인가 찾아보니 ADT 17에서 뭔가 바뀐것 같습니다.

원래 저는 라이브러리를 lib폴더에 넣고 빌드패스를 넣어서 쓰고 있었는데요.

문제를 해결하려면 libs폴더에 사용자가 추가한 라이브러리를 넣으면 되는것 같네요.

추가적으로 빌드패스도 필요없어졌네요.

제 경우엔 lib폴더를 libs로 이름만 바꾸니까 되네요. 빌드패스도 필요없어서 뺐습니다.

 

살짝 궁금해서 찾아봤는데요.

이클립스 패키지 익스플로러를 잘 보면

Android Dependencies라는 못보던 폴더가 생겨있고 속성을 보면

com.android.ide.eclipse.adt.LIBRARIES 이런게 보이네요.

이제 실행되니까 뭐 깊게 팔 필요있을까 싶어 더이상 찾는것은 접었습니다.

여기까집니다.ㅎㅎㅎ

 

안드로이드에서 static 변수의 사용

Posted on 2010. 11. 14. 03:14
Filed Under IT/안드로이드

안드로이드 앱 실행 중 화면의 가로세로 방향이 변하거나 하면 OnCreate가 다시 호출되게 되는데요. 문제는 이때 변수들이 초기화 된다는 거죠.

잘 실행하고 있던 애들이 폰 방향 한번 바꿨다고 초기화 되니 문제가 됩니다.

보통 액티비티에 이런 속성을 추가해서 문제를 해결하는데요.

android:configChanges="keyboardHidden|orientation"

이게 문제가 되는게 가로UI를 따로 지정하는 경우에 가로/세로UI가 바뀌질 않고 그냥 쭉 나와서 사람을 곤란하게 만듭니다.

그래서 저는 위의 속성을 주지 않고 값을 유지해야 하는 속성들을 static으로 많이 사용했는데요.(일일이 변수들을 저장해뒀다가 복원하는 과정이 무지하게 싫고 귀찮더만요...쩝) 당연히 액티비티가 종료되고 다시 시작하면 static변수들이 초기화 된다고 생각했습니다.

그.런.데. 한참 개발을 진행하고 있는데 안드로이드 2.2를 사용하는 폰들에게서 문제가 나타납니다. 분명히 종료하고 다시 실행했는데 객체들이 초기화가 되지 않고 남아있어서 오동작을 하고 앱이 맛이 갑니다.

그래서 찾아보니 안드로이드가 왠만해선 프로세스를 종료시키지 않고 찌꺼기를 자꾸 남긴답니다. 요렇게 찌꺼기로 나아 있는 static 변수들이 다음에 실행할때 초기화도 없이 다시 사용되는 겁니다.ㅠㅠ
2.1버전에서는 프로세스를 완전히 종료시키는 루틴이 동작해서 문제를 발견하지 못했는데,
2.2버전에서는 기존에 사용하던 프로세스 종료 루틴이 완전하게 동작을 하지 않아서 문제가 생겼습니다.

일단 문제 되는 static객체들은 수정을 했는데, 너무나 많은 곳에서 static을 사용하는 바람에 시한 폭탄처럼 수시로 문제가 발생하더군요.ㅎㅎ
테스트 꼼꼼히 진행하면서 문제가 되는 부분을 찾아내서 수정했지요.ㅋㅋ(힘들었습니다...)

static을 사용할 때는 항상 조심히, 신중히 사용합시다.ㅋ

참고로 static을 빼는 경우에는 아래와 같이 onSaveInstanceState에서 상태값을 저장하고 onRestoreInstanceState에서 저장된 값을 복원하는 방식으로 처리하면 됩니다.
    @Override
    protected void onSaveInstanceState(Bundle outState)
    {
        outState.putInt(HOUR, m_nHourVal);
        outState.putInt(MIN, m_nMinVal);
        outState.putInt(SEC, m_nSecVal);

        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState)
    {
        m_nHourVal = savedInstanceState.getInt(HOUR);
        m_nMinVal = savedInstanceState.getInt(MIN);
        m_nSecVal = savedInstanceState.getInt(SEC);

        super.onRestoreInstanceState(savedInstanceState);
    }

 

그리고 static을 사용할 때는 액티비티나 앱이 종료될때 항상 static변수를 초기화 해줍시다.ㅎ

안드로이드 그라데이션(gradient) 각도별 생성 이미지

Posted on 2010. 11. 14. 02:39
Filed Under IT/안드로이드

안드로이드에서 그라데이션 사용 방법은 많이 아실 겁니다.

한번씩은 쓰면 좋은데 그라데이션 많이 쓰면 지저분하고 보기 안 좋더군요.

적당히 보기좋게 써주세요.ㅎㅎ

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
	<gradient
		android:startColor="#ff323232"
		android:centerColor="#ff323232"
		android:endColor="#ff787878"
		android:angle="270"
		android:centerY="0.9" />
	<corners
		android:radius="2dp" />
</shape>

단순히 startColor, endColor만 사용하면 정말 단조로운 이미지를 생성하실 수 있습니다.
이때 centerColor를 추가로 사용하시면 중앙부위만 다른 색을 가지는 그라데이션도 만들 수 있구요, centerY속성을 추가해서 center의 위치를 지정해 주면 하단이나 상단 부위에만 살짝 입체감을 줄 수도 있습니다.

그리고 corners를 이용해서 모서리 부분에 라운드 처리 가능하구요... 이건 그냥 검색하면 다 나오네요.ㅎㅎ

몇 번 사용해 보니까 각도별 이미지가 어떻게 생기는지 햇갈리더군요. 할 때 마다 원하는 그림 나올때까지 다시 실행하기도 힘들구요.
그래서 각도별 이미지를 살짝 그려봤습니다. 참고하세요~




안드로이드의 android:layout_weight 속성

Posted on 2010. 7. 28. 10:39
Filed Under IT/안드로이드


LinearLayout의 속성 중에 android:layout_weight 이라는 속성이 있는데요.

이 것을 이용하면 LinearLayout의 항목들 배치에 아주 도움이 됩니다.

<LinearLayout
     android:orientation="horizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:background="#ffffffff"
     android:gravity="center|right"
     android:padding="1dp">

     <TextView
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:text="@string/update_time"
      style="@style/text_item.preference"
      android:layout_weight="1"
      android:gravity="right" />

     <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/edit"/>
</LinearLayout>

layout_weight 란 한마디로 UI영역에서 차지하는 중요도라고 할 수 있습니다. 이 중요도 비중을 높이면 그만큼 많은 영역을 UI영역에서 차지할 수 있죠. 설정을하지 않으면 디폴트로 0으로 설정됩니다.

위의 코드에서 TextView의 layout_weight가 1이고 Button은 설정을 하지 않았습니다. 그러면 Button이 높이가 wrap_content로 설정되어 있으니까 먼저 필요한 영역을 차지한 후 나머지 영역은 모두 TextView로 채워집니다. 만약 TextView와 Button에 layout_weight를 모두 1로 두면 어떻게 될까요? 중요도가 1:1로 설정이 되니까 화면을 절반씩 나우어 가지게 됩니다. 사용하실때 3:4든 5:5든 정수값이기만하면 비율을 맞추어 줍니다.
LinearLayout을 사용하면서 화면에 꽉차는 UI를 개발할 때는 필수품이라고 할 수 있겠죠~

그런데 만약 TextView의 layout_width를 0dp가 아닌 match_parent로 하면 어떻게 될까요? 음 다른 분들은 다들 알고 계신지 모르겠는데 layout_weight를 줄때는 layout_width를 wrap_content를 쓰던지 아니면 0dp를 줘야 합니다.
전 이걸 모르고 match_parent로 지정을 했더니 속성값이 반대로 움직이더군요.ㅋ
TextView와 Button부분의 layout_width를 match_parent로 해두고 layout_weight를 조절 했더니 양쪽이 반대로 움직이더군요. 1:9로 두고 실행시키면 9:1이 되는...
꼭 반대로 동작하지는 않을지도 모르지만 어쨋든 정상적인 동작은 기대할 수가 없으니깐 절대 꼭 wrap_content나 0dp로 하시고 사용하세요. 전 이거 잡는데 하루 걸렸습니다. 레이아웃을 너무 복잡하게 만든후에 문제를 발견해서ㅋㅋ

그리고 한가지 더, wrap_content를 지정하고 화면 비율을 나눈 경우에는 레이아웃 안쪽에 많은 항목이 있어서 크기가 커질 경우에 비율을 무시하고 내용물의 크기 많큼 레이아웃이 커집니다. 안쪽에 많은 항목이 있으면 나눈 비율보다 커질 수 도 있는거죠. 그리고 0dp를 사용한 경우에는 정확히 설정한 비율까지만 보여지게 됩니다. 나머지 항목은 가려지게 되겠죠~


About

by 쏜다

Notice

Counter

· Total
:
· Today
:
· Yesterday
: