레이블이 ICS인 게시물을 표시합니다. 모든 게시물 표시
레이블이 ICS인 게시물을 표시합니다. 모든 게시물 표시

2012년 1월 17일 화요일

ICS 에서 USB tethering API 사용 방법 막힘

ICS 이전 버전까지는 Tethering API 를 사용하기 위해 java reflection 기법을 이용하여 ConnectivityManager 클래스에 가려져 있던 tethering 관련 함수들을 사용하면 되었다.

ICS 버전에는 tethering 연결 및 해제하는 tether()/untether() 함수가 setUsbTethering() 함수로 바뀌었고 인자도 tethering interface 문자열에서 true/false 인 boolean 형으로 바뀌었다.

int setUsbTethering(Context, boolean) 의 형태이다.
true 를 넣어주면 연결된 usb 장치와 tethering 하고 false 를 넣어주면 tethering 연결을 끊는다. 이전처럼 tethering interface 를 명시하지 않아도 된다.

하지만 setUsbTethering() 함수를 부르게 되면 SecurityException 이 발생하면서 android.permission.MANAGE_USB 라는 권한이 필요하다는 내용의 에러를 출력한다.

그래서 android.permission.MANAGE_USB 를 AndroidManifest.xml 에 추가해 보지만 결과는 마찬가지 였다.

확인결과 android.permission.MANAGE_USB 권한은 시스템 앱인 경우에만 취득이 가능했다.

결과적으로 현재로써 배포용 앱은 ICS 에서 Tethering API 를 사용할 수 없다.


참고 - http://tjandroid.blogspot.com/2010/12/enabledisable-usb-tethering.html
(Android Tethering API (froyo or above))

2011년 12월 23일 금요일

HttpURLConnection 의 HTTP 연결 문제

HttpURLConnection 을 이용하여 HTTP 로 많은 통신을 요구하게 되는 경우 연결이 불안정한 경우가 있었다.

그 증상은 폰 제조사에 따라서 또는 안드로이드 버전에 따라서 문제가 발생하고 하지 않는 경우가 있었다.

Nexus S ICS 4.0.3 으로 업데이트 후 HTTP 연결 실패 확률이 상당히 높았다.

문제를 확인하던 중 아래 자료들을 찾을 수 있었다.

ssl - Android ICS: Problems to get the server certificate of the HttpsUrlConnection - Stack Overflow:
http://stackoverflow.com/questions/8398622/android-ics-problems-to-get-the-server-certificate-of-the-httpsurlconnection
Android Developers Blog: Android's HTTP Clients:
http://android-developers.blogspot.com/2011/09/androids-http-clients.html

요지는 HttpURLConnection 은 기본적으로 connection pool 을 사용하게 되는데 froyo 이전 버전까지는 connection pool 에 버그가 있어서 해당 기능을 사용하지 않게 했다는 것이다.

System.setProperty("http.keepAlive", "false");

그런데 몇몇 폰이나 ICS 4.0.3 으로 업데이트 되면서 문제가 다시 생긴 건지 아니면 뭔가 안드로이드 개발자들의 설명이 부족했던 것인지 모르겠으나 http.keepAlive 값을 false 로 설정함으로써 문제가 해결되었다.

Nexus S 공식 아이스크림 샌드위치 4.0.3 롬 수동 업데이트

xda-developers - [INFO] Nexus S Official ICS 4.0.3 Released Dec 16!!! (download links): http://forum.xda-developers.com/showthread.php?t=1395828

위 링크 내용을 아래와 같이 정리한다.

1. 롬 업데이트 파일을 다운로드 한다. - 링크 (위 링크 안에 있는 다운로드 링크와 같다)

2. 폰의 외부 저장공간에 'update.zip' 이라는 파일명으로 변경하여 복사한다.

3. fastboot 모드로 부팅한다.
 ㄱ. 폰 전원을 끈다.
 ㄴ. 볼륨 업 키와 파워 키를 동시에 누르고 부팅이 될때 까지 있는다.

4. Recovery 를 선택한다.
 !) 볼륨 업/다운 키로 위 아래로 선택을 이동할 수 있다.
 !) 파워 키를 누르면 해당 메뉴로 이동한다.

5. 느낌표 그림이 나오면 파워키와 볼륨 업 키를 동시에 누른다.
 !) 파워 키와 볼륨 업 키를 동시에 누르려 하지 말고 파워 키를 누르고 있는 상태에서 볼륨 업 키를 누르면 편이 낫다.

6. 메뉴가 나오면 'apply update from /sdcard' 를 선택한다.

7. 'update.zip' 파일을 선택하면 업데이트가 진행된다.

8. 업데이트 완료 후 재부팅 된다. 끝.


업데이트 시 문제 사항: 업데이트 과정에서 아래와 같은 에러 메시지가 나왔다.
assert failed: file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/soju/crespo:2.3.6/GRK39F/189904:user/release-keys" || file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/soju/crespo:4.0.3/IML74K/239410:user/release-keys"

에러 내용: 에러 내용을 확인해 보면 현재 설치된 빌드 버전이 GRK39F 나 IML74K 이어야 하는데 아니기 때문에 에러가 발생한다는 것을 알 수 있다.

!) 빌드 버전 확인 방법
안드로이드 폰을 부팅하고 '설정' -> '휴대전화 정보' -> '빌드 번호' 를 확인한다.
내 경우 GRJ22 이었다.

해결 방법: GRJ22 에서 GRK38F 로 업데이트 후 ICS 4.0.3 업데이트를 진행할 수 있었다.
GRJ22 에서 GRK38F 로 업데이트 방법: http://www.redmondpie.com/download-and-install-android-2.3.6-gingerbread-grk39f-on-google-nexus-s-how-to-tutorial/

 - 업데이트 방법은 동일하다.


참고: Nexus S 2.3.3 수동 업데이트 방법 - http://tjandroid.blogspot.com/2011/03/nexus-s-233.html