728x90

1. 서론

  • 카카오맵 API는 다음 링크에 가이드가 존재합니다.
    http://apis.map.kakao.com/android/guide/

    먼저 사용했던 네이버 지도는 gradle에 한두줄 적고 설정하면 알아서 되었습니다만...
    카카오맵은 가이드에 라이브러리 파일 추가시 어떻게 해야하는지 불편하고 모호한 점들이 있어서,
    초보였던 제가 겪었던 시행착오 를 작성하여 공유 합니다.

2. 시행착오

1) 라이브러리 파일 추가 경로는?

  • 가이드에는 아래처럼 적혀있습니다.
  • 매우 초보인 저의 궁금증 및 문제:
    1) so 확장자 파일은 뭐지?
    2) 정작 2019년 7월 기준으로 최신 SDK 압축파일 까보니, 가이드에서 3개라는 파일이 4개로 늘어나 있음. (arm64-v8a 폴더?) 그대로 복붙하면 되는건가?
    3) libs 폴더란걸 그냥 생성하고 똑같이 추가했으나 되지 않음.

  • 각 의미를 찾아보니:
    1) 카카오의 SDK 파일인 ".so" 확장자 파일은 JNI library를 의미합니다.

    2) 'arm64-v8a'는 2019년 8월부터 구글플레이에 올라가는 앱 64비트를 대응하기 위한 네이티브 코드 라이브러리 소스를 의미. (안드로이드의 출발은 32비트였으나 2017년 이후로는 64비트 cpu를 지원하는 기기들로 변화하고 있기 때문) --> 즉 현재 대부분의 기기가 64비트이기 때문에, 가이드가 그 전에 작성된 것으로 추정됨. (즉 무조건 4개 파일 전부 추가하세요)

    3) libs 폴더에 so파일 넣는건 과거 Eclipse 개발 환경에서 추가할 때의 경로. Android에서는 .jar파일은 libs 폴더, .so파일은 jniLibs 폴더를 생성하고 추가 해야합니다.

2) 키 해시는 뭘 입력 해야하는가?

- 콘솔에 들어가서 설정 > 일반 > 플랫폼 추가 - 안드로이드 시

아래처럼 키 해시를 입력 해야만 합니다.

만약 해당 키 해시가 등록되지 않으면, 라이브러리를 올바로 추가하고 개발을 잘 해도 화면에 나타나지 않습니다.
그런데 이 키 해시는 debug용과 release용 keyStore에 따라 달라집니다. 따라서 필요에 따라 해당 코드를 이용해서 키 해시를 입력하시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
try{
    PackageInfo info = getPackageManager().getPackageInfo("com.android.패키지 경로",PackageManager.GET_SIGNATURES);
    for(Signature signature : info.signatures){
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        Log.d("keyHash:",Base64.encodeToString(md.digest(),Base64.DEFAULT));
    }
 
}catch(Exception e){
    e.printStackTrace();
}
 
 
cs

작성하다보니까 지도 개발 가이드 문서에는 없지만, 카카오 Android 개발가이드에 설명이 있었네요.
보다 설명이 더 자세히 나와있으므로 설명은 해당 링크 참고하시면 될거 같습니다.
https://developers.kakao.com/docs/android/getting-started#키해시-등록

Reference

728x90
728x90

ImageView에 넣을 이미지의 크기를 조절하는 건 scaleType 속성을 설정하면 된다.

 

 

1
2
3
<ImageButton 
    android:scaleType="centerInside"/>
 
cs

 

MATRIX = 원본 크기 그대로 보여줌 (왼쪽상단 정렬) 
CENTER = 원본 크기 그대로 보여줌 (가운데 정렬)
CENTER_CROP = View 영역에 공백이 있으면 채워서 보여줌(비율유지)
CENTER_INSIDE = View 영역을 벗어나면 맞춰서 보여줌(비율유지)
FIT_START = View 영역에 맞게 보여줌 (왼쪽상단 정렬, 비율유지)
FIT_CENTER = View 영역에 맞게 보여줌 (가운데 정렬, 비율유지)
FIT_END = View 영역에 맞게 보여줌 (왼쪽하단 정렬, 비율유지)
FIT_XY = View 영역을 가득 채워서 보여줌(비율유지 안함)

 

 

Reference

https://isntyet.tistory.com/65

 

 

728x90
728x90

 

간단하게 App 내부에 저장한 리소스를 불러와야할 경우, string과 같은 문자열로 컨트롤 하고 싶다면

 

(context.)getResources().getIdentifier(String name, String defType, String defPackage)

 

- 파일명(name): "@drawable/" (생략가능) + 본인이 저장한 파일명 String

- 디렉토리명(defType): "id", "drawable"

- 패키지명(defPackage): (context.)getPackageName(); 

 

 

 

Reference
https://developer.android.com/reference/android/content/res/Resources

https://kheru.tistory.com/54

728x90
728x90

 

메뉴는 한번 만들어놓으면 대체로 초기에 설정하는걸 까먹는데, 이것도 가끔씩 오래간만에 사용하려고 하면 까먹어서 메모.

 

 

- ViewPager 사용시 페이지를 넘기는데, 갑자기 에러가 나타나는 경우는 여러가지 경우의 수가 있다.

  그 중, instantiateItem에서 IndexOutOfBounds exception이 뜰 경우는

  심플하게 생각하면, ViewPager한테 화면을 얼마나 띄워야하는지 미리 안알려줘서 그렇다.

 

 

방안 1. setOffScreePageLimit 메소드 사용

viewpager.setOffscreenPageLimit(페이지수 int값);  

 

limit을 미리 걸어두면, instantiateItem에서 단순하게

(ViewGroup) container.addView(view, position); 으로 사용해도 에러가 나지 않는다.

 

 

 

방안 2. instantiateItem에서 addView할 때 조건 걸기

((ViewPager)container).addView(view, ((ViewPager)container).getChildCount() > position ? position : ((ViewPager)container).getChildCount())

 

ViewPager가 가지고 있는 자녀의 수가 position값보다 큰 지를 판별해서, index가 초과하지 않도록 하는 방법.

 

 

(미리 알 수 있으면) 개인적으로 2번보단 1번이 간결하고 편한 거 같음.

 

 

 

 

Reference

https://stackoverflow.com/questions/9402970/android-viewpager-throwing-indexoutofbounds-exception-when-setting-current-item

728x90

+ Recent posts