2013년 5월 20일 월요일

android - launcher source code link

ADWLauncher source Link
-

Launcher2 Link

https://android.googlesource.com/platform/packages/apps/Launcher2


구동하기 위해서는 코드 수정이 필요합니다.
수정된 코드는  아래 링크

ADWLauncher source code download
https://docs.google.com/file/d/0BymucYK5y3ENWmNuRklHYWsyLVU/edit

Launcher2 source code download
https://docs.google.com/file/d/0BymucYK5y3ENbWhPcG1pOGFMbkk/edit





android - adt version 22 update

Android ADT를 22.x 로 버전업을 하게되면 기존에 만들어 놓은 프로젝트로 APK를 생성하여 실행하면 에러가 발생할 수 있다.

기존 버전에서는 프로젝트의 libs 디렉토리에 존재하는 라이브러리를 Android Dependencies로 자동으로 적용하여 APK에 포함시켰으나 22.x로 버전업 되면서 해당 라이브러리를  Android Private Libraries로 적용하게된다.
이 라이브러리는 APK를 만들때 포함되지 않는 라이브러리로 처리가되어 라이브러리를 사용한 코드에서 해당 클래스를 찾을 수 없다는 에러가 발생하게 된다.

이를 해결하려면 .classpath 파일에서 붉은색 부분을 추가시켜주면 해당 라이브러리들 또한 APK 생성시 라이브러리를 포함시키게된다.

<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>

2013년 5월 8일 수요일

android - jarsigner


android APK 직접 서명하기

jarsigner -keystore [keystore 파일] -storepass [암호] -keypass [암호] -signedjar [서명된apk경로] [서명안된apk경로] [키 alias]

2013년 5월 7일 화요일

android - map api v2

1. key 추출

디버그용 키의 경우

keytool -list -v -keystore c:\Users\[사용자ID]\.android\debug.keystore

배포용의 경우도 keystore 파일만 배포용으로 변경하면 된다.


결과

인증서 지문:
         MD5: C5:7A:A6:65:23:FE:FC:8D:96:04:59:8E:E5:AB:D4:36
         SHA1: 0C:9E:83:A2:6A:3F:52:8D:B9:21:4C:CE:80:D0:25:03:CB:C0:7B:4F
         SHA256: 95:FB:82:B4:8F:06:44:A9:8D:B2:F2:42:8D:E2:09:42:A1:5B:D2:C0:A5:
38:EB:D1:D4:96:CA:45:9D:AC:9F:DD
         서명 알고리즘 이름: SHA256withRSA
         버전: 3


2. Google Project 생성

아래 URL에 접속하여 APIs project를 생성한다. (이미 프로젝트를 생성했다면 패스)

 https://code.google.com/apis/console/



3. Google Services에서  Android Map 활성화

아래 URL에서 Google Maps Android API v2 활성화

https://code.google.com/apis/console/#project:[ProjectID]:services



4. OAuth 2.0으로 API KEY 획득

 2) OAuth 2.0 Client ID  생성 (이미 OAuth 2.0을 갖고 있다면 패스)
  - 좌측 API Access 메뉴에서 Create an OAuth 2.0 client ID 버튼을 클릭하여 생성 위자드에 따라 생성한다.
  - Project 이름 입력
  - Application Type을 Installed Application으로 선택
  - Installed application type을  Android로 선택
  - Package name과 1번에서 추출된 SHA1 지문 입력

 3) OAuth 2.0 Client ID가 이미 있는 경우
  - Client ID for installed applications 항목의 Create another client ID 버튼을 클릭한다.
  - Project 이름 입력
  - Application Type을 Installed Application으로 선택
  - Installed application type을  Android로 선택
  - Package name과 1번에서 추출된 SHA1 지문 입력


5, Simple API Access로 API KEY 획득

 1) 아래 URL 로 접속하여 Simple API Access 항목의 create new android key 버튼을 클릭하여 [SHA1];[PackageName] 형식으로 입력 후 create 버튼 클릭한다.

https://code.google.com/apis/console/#project:[ProjectID]:access

 2) API KEY가 생성되면 화면에 API key, Android apps, Activated on, Activated by 정보가 표시된다.


6. AndroidManifest.xml에 추가

 1) OpenGL 2.0 지원

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

 2) 지도 데이터 수신용 퍼미션 생성

 <permission android:name="[PackageName].permission.MAPS_RECEIVE" android:protectionLevel="signature" />

 3) 지도용 퍼미션 사용
 ACCESS_FINE_LOCATION이 ACCESS_COARSE_LOCATION 퍼미션을 포함하는 의미이나 Google MAP v2 가이드에 두개가 따로 명시되어 있네요.

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

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="[PackageName].permission.MAPS_RECEIVE" />

 4) API KEY 설정
 application tag 안에 넣음

<meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="[API KEY]" />


7. 적용
 1) 레이아웃 적용
 맵을 표시하고자 하는 뷰의 layout xml에 아래 fragment 추가

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/my_map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment" />

 2) Code 적용
 SupportMapFragment에서 getMap() 메소드로 GoogleMap을 얻을때 바로 획득하지 못하고 null이 리턴되는 경우가 있다. Google play service 내에서 초기화 하는데 다소 시간이 소요될 수 있기때문으로 이를 대비하여 아래와 같은 형태로 적용하였다.

public class MainActivity extends FragmentActivity {
private static final MAX_RETRY_COUNT = 6;

private SupportMapFragment mSupportMapFragment;
private GoogleMap mGoogleMap;
private Handler mMapCheckHandler = new Handler();

private int mRetryCount = 0;

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

mSupportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.my_map);

mMapCheckHandler.postDelayed(mMapCheckRunnable, 500L);
}

private Runnable mMapCheckRunnable = new Runnable() {
public void run() {
if(mRetryCount == MAX_RETRY_COUNT) {
// 맵 로드 실패
    return;
}

mRetryCount++;
mGoogleMap = mSupportMapFragment.getMap()
if(mGoogleMap == null) {
    // google play service에 의해 map이 초기화가 되지 않은 상태
mMapCheckHandler.postDelayed(mMapCheckRunnable, 500L);
} else {
// 맵 사용...
}
}
}
}