Android/기본스킬 | Posted by 덩치 2014. 6. 24. 17:49

LocationManager로 위치값 받아오기

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


LocationManager를 사용하기 위한 퍼미션 ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION 


모바일의 Gps 또는 Network 정보로 위치좌표를 받아오는 방법에 대해 알아보겠다.


LocationManager mLM = (LocationManager) getSystemService(Context.LOCATION_SERVICE);


이렇게 로케이션 매니저를 선언 한 뒤, 위치값 갱신을 호출 해 보자.


위치 제공자는 총 2가지 종류가 있다.


1. GPS_PROVIDER

2. NETWORK_PROVIDER


실내에서는 GPS_PROVIDER를 호출해도 응답이 없다. 응답을 기다리는 형태로 코딩을 했다면


별다른 처리를 하지 않으면 실내에서는 무한정 대기한다.


따라서 타이머를 설정하여 GPS_PROVIDER를 호출 한 뒤 일정 시간이 지나도 응답이 없을 경우


NETWORK_PROVIDER를 호출 하거나,


또는 둘 다 한꺼번에 호출하여 들어오는 값을 사용하는 방식으로 코딩을 하는것이 일반적이겠다.


private void registerLocationUpdates() {

        mLM.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,

1000, 1, mLocationListener);

mLM.requestLocationUpdates(LocationManager.GPS_PROVIDER,

1000, 1, mLocationListener);

//1000은 1초마다, 1은 1미터마다 해당 값을 갱신한다는 뜻으로, 딜레이마다 호출하기도 하지만

//위치값을 판별하여 일정 미터단위 움직임이 발생 했을 때에도 리스너를 호출 할 수 있다.

}



private final LocationListener mLocationListener = new LocationListener() {

public void onLocationChanged(Location location) {

//여기서 위치값이 갱신되면 이벤트가 발생한다.

//값은 Location 형태로 리턴되며 좌표 출력 방법은 다음과 같다.


    if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) {

//Gps 위치제공자에 의한 위치변화. 오차범위가 좁다.

double longitude = location.getLongitude();    //경도

double latitude = location.getLatitude();         //위도

float accuracy = location.getAccuracy();        //신뢰도

    }

    else {

//Network 위치제공자에 의한 위치변화

//Network 위치는 Gps에 비해 정확도가 많이 떨어진다.

    }

   }

public void onProviderDisabled(String provider) {

}


public void onProviderEnabled(String provider) {

}


public void onStatusChanged(String provider, int status, Bundle extras) {

}

}


위와같이 사용하면 된다. 그리고 더이상 위치값을 호출하지 않아도 되는 경우에는

mLM.removeUpdates(mLocationListener);자원해제를 반드시 해 준다. 누락하면 딜레이마다 계속 호출한다.





Android/기본스킬 | Posted by 덩치 2013. 12. 31. 10:33

자바/안드로이드 HashMap 사용법

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

HashMap은 Map인터페이스의 한 종류로, key와 value 한 쌍을 데이터로 가진다.

쉽게 이해하려면 리스트 형태에 값을 키와 벨류로 가지고 있다고 생각하면 된다.

리스트와의 큰 차이점은 위에처럼 키값을 가진다는것이고, 또 순서를 보장하지 않는다는점이다.

순서대로 입,출력이 되고 순서에 의해 자료를 처리하는 작업에는 알맞지 않다.

입력된 key값을 이용해 value를 구하며(리스트에서 인덱스를 이용해 벨류를 구하는 이치)

key값은 중복되지 않으며 value는 중복 가능하다.


즉, key값으로 1을 5번 입력한다면 맨 처음의 key,value만 입력되고 나머지는 입력되지 않아

이 특성을 잘 이용하면 중복검사를 매우 편하게 할 수 있다.


HashMap의 기본적인 사용법을 알아보겠다.


HashMap<Integer, String> map = new HashMap<Integer, String>();


입력 -

map.put(1, "치킨");

map.put(2, "피자");

map.put(3, "탕수육");


출력 -

Iterator<Integer> iter = map.keySet().iterator();

while(iter.hasNext()) {

int key = iter.next();

String value = map.get(key);

Log.d("fureun", "key : " + key + ", value : " + value);

}

이렇게 하면 모든 키와 벨류 쌍이 다 출력된다.


다른 사용법으로는 map.get(1);을 하면 키 1에 대응하는 value "치킨"이 반환된다.


if(map.containsKey(1)) {


}

이렇게 하면 키값 1이 존재할 경우 true가 반환된다.


이외에도 활용법은 엄청 많으니, 공부를 통해 자신이 원하는 형태로 사용 할 수 있도록 노력하자.


Android/구글맵 v2 | Posted by 덩치 2013. 12. 27. 16:38

구글맵(GoogleMap) v2 띄우기 (최신)

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

작성일에 직접 만들어가면서 포스팅한것이기 때문에,

작성일 기준으로 가장 최신 자료입니다.


1. 맵 표시를 위해 SDK Manager를 이용해 Google Play Service 최신버전 업데이트 


작은 빨간네모안의 SDK Manager를 누르면 Android SDK Manager 창이 위와같이 뜬다.

휠을 내려서 Extras 를 찾아서 하위의 Google Play services 를 체크하고 Install packages... 를 누른다

(필자는 이미 최신버전이라 단추가 비활성화상태)


이까지 마친 뒤 SDK 폴더로 이동 한 다음,

sdk/extras/google/google_play_services/libproject/google-play-services_lib 파일을 import해 준다.

밑의 사진을 보고 따라한다.







이 그림은 필자와 약~간 다를건데 필자는 이미 라이브러리를 import 해놨기때문에 위와같이 나온다. 상관하지않는다.




그럼 이렇게 프로젝트가 생성되고,


생성된 프로젝트를 우클릭 > Properties 한 다음 설정을 위와 같이 맞춘다.

Build Target은 꼭 2.3.3 이 아니라도 상관 없다. (보다 낮은것은 추천하지 않는다.)



그리고 이제 지도를 띄울 프로젝트를 만들어 보겠다.


File > New > Android Application Project 순서로 실행 

(Android Application Project 가 없는사람은 당황하지 말고 Other... > Android > Android Activity 순으로 실행한다.



Next 한 다음 대충 다음 다음 Finish 해 주면 프로젝트 생성 완료.



만들어진 프로젝트에 우클릭 > Properties 을 해 주고,





Android 클릭, Add.. 클릭 , google-play-services_lib 클릭 후 ok > ok 해 준다.

아까와는 달리 Is Library는 체크하지 않는다.


이까지 했다면 이제 맵을 띄울 바탕은 끝났다. 본격적으로 맵을 띄워보자.



2. 구글맵 API Console 등록

우선 구글계정이 필수, 로그인 하였다면

https://code.google.com/apis/console로 접속한다.


보는바와 같이 APIs & auth의 APIs 카테고리에서

구글맵 서비스를 이용하기 위해 Google Maps Android API v2 를 OFF > ON 으로 바꿔준다. 필수



3. API Key 발급

맵을 띄우기 위해서는 자신만의 고유한 API Key를 발급받아야한다.


이를 발급받기 위해서는 컴퓨터의 디버그용 키스토어를 발급받아야하는데, 간단히 설명하자면

개발을 할 때는 디버그 키스토어라는것을 이용해 어플에 서명(자신을 각인)하여 개발하고,

상용할 때는 배포용 디버그 키스토어를 이용해 어플에 서명을 하고 배포해야 사용이 가능하다.

여기서는 디버그 키스토어를 사용하는데, 잘 이해가 안간다면 깊히 생각하지 않아도 된다.


시작 > 실행 > cmd 를 이용해 명령프롬프트창을 띄운다(단축키  윈도우키 + R 후 cmd 엔터)

디버그용 키스토어가 저장되는 위치로 이동하기 위해 본인의 운영체제에 따라 다음과 같이 입력한다. 

Windows XP : C:\Documents And Settings\사용자 계정\.android

Windows Vista/7 : C:\Users\사용자 계정\.android

OSX/Linux : ~/.android


필자는 윈7에 사용자계정은 fureun 이므로




엔터를 치면 경로가 이동하게 되고, 그 다음 위 사진과 같이

keytool -list -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android

이렇게 입력후 엔터를 치면


이렇게 나오는데, 여기서 맵을 띄우기 위해 필요한것은 SHA1: 뒤의 16진수이다.

창을 닫기 전에 따로 메모장등에 적어서 보관해놓는다.


그리고 아까 API Console로 돌아가서



누르면 창이하나 뜨는데 Android를 선택 하고,


위와같이 입력한 뒤 Create Client ID 를 누른다.

큰 네모에는 아까 명령프롬프트에서 추출한 SHA1값;패키지명


드디어 API key가 나왔다.


위의 키값을 따로 저장한 뒤, 다시 프로젝트로 돌아가보겠다.


매니패스트를 켠 뒤 AndroidManifest.xml 에서

다음과 같이 빨간네모부분을 추가한다






맨밑의 android:value= 에는 조금전 발급받은 Api key를 입력하면 된다.

따라치기 귀찮으면 밑의 글 복붙


    <uses-feature

        android:glEsVersion="0x00020000"

        android:required="true" />

    

    <permission

        android:name="com.example.SearchMJ.permission.MAPS_RECEIVE"

        android:protectionLevel="signature" >

    </permission>


    <uses-permission android:name="android.permission.INTERNET" />

    <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-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

-------------------------------------------------

<meta-data

            android:name="com.google.android.maps.v2.API_KEY"

            android:value="Api key" />

<meta-data

            android:name="com.google.android.gms.version"

            android:value="@integer/google_play_services_version" />


그리고 메인액티비티의 레이아웃(res > layout > activity_main.xml)으로 이동해서


입력. 소스는

    <fragment

   android:id="@+id/map"

   android:name="com.example.GoogleMapVersion2.Fragment"

   android:layout_width="fill_parent"

   android:layout_height="fill_parent"

   class="com.google.android.gms.maps.SupportMapFragment" />




다음과 같이 MainActivity extends ActivityFragmentActivity 로 바꿔준다

그리고 실행 하면



짜잔 ~ 하고 맵이 나타난다.

최초 시작 위치나 카메라 줌 레벨 등은 동일 카테고리 내의 다른 포스팅을 참조하기 바란다.



혹시 에러사항이 있거나 문의사항이 있다면 댓글 남기면 친절히 답변 달아드리겠음

한참걸렸네 ..