안드로이드 개발2011.03.09 18:46
개발을 하다보면 아이폰이나 아이팟 혹은 아이패드처럼 딱 지정된 몇개의 해상도만 쓰는것이 아니라.

워낙 기기별로 뒤죽박죽이라서 디스플레이를 멀 쓰는지 필요할때가 생겼다.

간단하게 해당 소스를 사용해서 디스플레이의 width 및 height 값을 가져올 수 있다.

Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
    int display_width = display.getWidth();
    int display_height = display.getHeight();
Posted by 해악사마
안드로이드 개발2011.02.17 15:56
안드로이드 어플을 개발하면서

Activity중 어느 Activity가 현재 최상위에 나와있는지 조건문으로 확인을 하려고 했는데,

어디서 봐야할지를 몰라서 고민하던중 찾은 방법이다.

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> Info = am.getRunningTasks(1);
ComponentName topActivity = Info.get(0).topActivity;
String topactivityname = topActivity.getPackageName();

해당 소스를 작성한뒤

Log.d(TAGNAME, topactivityname);

위와 같이 로그를 찍어보면 최상위 Activity 명이 나오게 된다.

p.s : 위의 사항을 그냥 실행하려고 하면 에러가 발생하게 된다.
        Manifest 에서 아래의 user permission을 추가해 주어야 한다.
        android.permission.GET_TASKS
Posted by 해악사마
안드로이드 개발2011.02.16 15:30
안드로이드 앱을 만들면서 앱자체가 죽어버리지는 않는데, LogCat 상에서 붉은색 글씨로

Finalizing a Cursor that has not been deactivated or closed. 이라는 메시지가 나왔다.

검색을 해보았더니 메모리 릭이 발생하는 부분이라서 어찌되었든 수정이 필요한 부분이었다.


처음에는 단순히

try {
} catch(SQLException e){} 정도로만 처리해주면 될 줄 알았는데, try 문 안에 넣어줘도 결과는 마찬가지였다.

소스를 전체적으로 다시 보면서

커서 사용시 닫아줘야 하는데 실제로 안닫아 주고 그냥 넘어간 부분들이 많았다.

예를 들면
Cursor mCursor = null;
mCursor = mDb.query(true, DATABASE_TABLE, new String[]{"test"},"test" + "=" + 'hi', null, null, null, null, null);
mCursor.close();

이런식으로 그냥 Cursor 사용이 끝났으면 .close();로 닫아주기만 하면 된다.

일단 해당 에러로 어플이 죽지 않는다면 자칫 넘어가기 쉬운 일이지만 차후에 메모리 릭이라던가 하는 부분으로 귀찮을 수

있는 부분이니 잘 꼭 잡고 넘어가야겠다.
Posted by 해악사마
안드로이드 개발2011.02.15 15:01

기기별 혹은 브랜드 별로 구분을 해야 할 필요등이 생겼을때 유용한 방법 입니다.

        import android.os.Build; // android.os.Build 를 참조하기 위해서 import 합니다.

        Log.i("BOARD", Build.BOARD);
        Log.i("BRAND", Build.BRAND);
        Log.i("CPU_ABI", Build.CPU_ABI);
        Log.i("DEVICE", Build.DEVICE);
        Log.i("DISPLAY", Build.DISPLAY);
        Log.i("FINGERPRINT", Build.FINGERPRINT);
        Log.i("HOST", Build.HOST);
        Log.i("ID", Build.ID);
        Log.i("MANUFACTURER", Build.MANUFACTURER);
        Log.i("MODEL", Build.MODEL);
        Log.i("PRODUCT", Build.PRODUCT);
        Log.i("TAGS", Build.TAGS);
        Log.i("TYPE", Build.TYPE);
        Log.i("USER", Build.USER);

각 해당 하는 항목의 값을 적절히 사용하시면 될 것 같습니다.

삼성 갤럭시S의 경우는

LOGCAT에

NFO/BOARD(32174): SHW-M110S
INFO/BRAND(32174): samsung
INFO/CPU_ABI(32174): armeabi-v7a
INFO/DEVICE(32174): SHW-M110S
INFO/DISPLAY(32174): FROYO.SK22
INFO/FINGERPRINT(32174): samsung/SHW-M110S/SHW-M110S/SHW-M110S:2.2/FROYO/SK22:user/release-keys
INFO/HOST(32174): sep-57
INFO/ID(32174): FROYO
INFO/MANUFACTURER(32174): samsung
INFO/MODEL(32174): SHW-M110S
INFO/PRODUCT(32174): SHW-M110S
INFO/TAGS(32174): release-keys
INFO/TYPE(32174): user
INFO/USER(32174): root

이런식으로 찍히는것을 확인 할 수 있습니다.


에뮬레이터의 경우는

INFO/BOARD(1601): unknown
INFO/BRAND(1601): generic
INFO/CPU_ABI(1601): armeabi
INFO/DEVICE(1601): generic
INFO/DISPLAY(1601): sdk-eng 2.2 FRF91 43546 test-keys
INFO/FINGERPRINT(1601): generic/sdk/generic/:2.2/FRF91/43546:eng/test-keys
INFO/HOST(1601): android-test-25.mtv.corp.google.com
INFO/ID(1601): FRF91
INFO/MANUFACTURER(1601): unknown
INFO/MODEL(1601): sdk
INFO/PRODUCT(1601): sdk
INFO/TAGS(1601): test-keys
INFO/TYPE(1601): eng

이런식으로 찍히는 것을 확인 할 수 있습니다.
Posted by 해악사마
안드로이드 개발2011.02.15 13:42

프로그래밍을 하다보면 특정 장치라는것을 식별하기 위한 값들을 가져와서 각 장치별로 구분이 가능해야 하는데,
이때 쓸만한 것이 전화번호, IMEI값(?), MAC주소 같은것이 될것 같네요.

// 고유 값 알아보기
// 휴대폰의 전화번호 가져오기
        TelephonyManager mgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        String phoneNumber = mgr.getLine1Number();

        WifiManager wifi = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);
       
        String imei = mgr.getDeviceId();
        WifiInfo info = wifi.getConnectionInfo();

// 위와 같은 소스를 통해서 phoneNumber 변수와, imei에는 특정값이 들어가게 될 것입니다.
// 맥주소의 경우는 info.getMacAddress 로 가져와서 바로 출력하도록 했네요.
       
        Log.d("Device Id : ", "휴대폰 번호 = " + phoneNumber + "  단말기 번호 =" + imei + "  맥주소 : " + info.getMacAddress());


해당 내용을 작성하시고 에뮬레이터 상에서 테스트 하시면, phoneNumber 를 제외하고는 제대로 나오지 않을 것입니다.
아마도 imei 는 16자리의 숫자 0이 찍히게 될 것이고, Mac주소는 null 값이 나오게 됩니다.

imei값은 들어있지 않고, Mac주소의 경우는 에뮬레이터에서 Wifi 드라이버를 로딩해오지 않기 때문에 없는것으로 나온답니다.

Posted by 해악사마
안드로이드 개발2011.02.08 13:22
이미지 기본상태와 Press 상태에 따라서 다른 효과를 보여주고 싶었는데,
소스에서 하나하나 조건식으로 하려니까 별로 좋은거 같지 않았는데,
쉬운 방법을 찾았다.

xml 파일을 drawable 폴더쪽에 하나 생성해서 쓰면 되는데

아래와 같은 방식으로 만들어서 넣으면 되고, 이후에 이미지 버튼을 선언할때
ImageButton btn = (ImageButton) findViewById(R.id.생성한xml파일) 식으로 선언해 주면 된다.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Pressed -->
    <item android:state_pressed="false" android:drawable="@drawable/누르지 않았을때 보여질 이미지" />
    <item android:state_pressed="true" android:drawable="@drawable/Press시 보여질 이미지" />
</selector>
Posted by 해악사마