테스트 하려는 APK를 일일이 설치하는 것도 일이다.

batch파일로 만들어서 한 방에 설치하자.


dir/d/b/a:-d > list.txt

FOR /F %%i IN (list.txt) DO (adb install %%i)


dir/d/b/a:-d > list.txt ==> 현재 폴더에 있는 파일 목록을 만든다.

FOR /F %%i IN (list.txt) DO (adb install %%i) ==> 목록을 읽어서 설치한다.


list.txt를 만들지 않고 설치하려면,

FOR %%f IN (*.apk) do adb install -rf %%f





가로 세로 회전 시 Activity의 상태를 유지하는 방법은 아래 블로그를 참고

위 방법대로 했음에도 불구하고, 
IME (Soft Keyboard)를 띄운 상태에서 가로 세로로 전환했을 때 입력한 내용이 표시가 되지 않는다면, AndoidMenifest.xml 파일을 확인해 보라.

만약 아래 처럼 android:minSdkVersion를 정의해서 쓰고 있다면 이를 삭제해서 테스트를 해 보자.
<uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="16" />

android:minSdkVersion은 안드로이드 OS버전이 얼마 이상 되야 이 앱이 설치될 수 있다는 것을 기술하는 부분인데, 
왜 도대체 이 부분이 문제가 되는 지는 잘 모르겠다.

IME 버그인지.. 안드로이드 버그인지..




LCD가 꺼져 있을 때 강제로 켜고 싶을 때가 있다. 

  • 메세지가 도착했을 때. (카톡과 같은 메신저류에서의 요구사항)
  • 설정한 알람 시간이 됐을 때
    : 알람 이벤트가 되면 자동으로 LCD가 켜지는 지는 모르겠다..
  • 또는 이와 같이 LCD가 꺼진 상태에서 특정 이벤트가 왔는데, 화면에 표시해야 할 때

이럴 때는 PowerManager를 이용해서 아래와 같이 wake lock을 걸어주면 된다.

먼저 AndroidMenifest.xml에 다음 퍼미션을 추가하자.
<users-permission android:name="android.permission.WAKE_LOCK"/>

wake lock을 걸 때
private void acquireWakeLock(Context context) { PowerManager pm = (PowerManager)context.getSystemService (Context.POWER_SERVICE); screenWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP
, context.getClass().getName());
if (screenWakeLock != null) { screenWakeLock.acquire(); } }


wake lock을 걸고 할 일을 마쳤다면 반드시 lock을 풀어서 소모전류 이슈가 발생하지 않도록 하자.

wake lock을 풀 때
private void releaseWakeLock() { if (screenWakeLock != null) { screenWakeLock.release(); screenWakeLock = null; } }




앱을 개발하다 보면 미디어 스캐닝을 강제로 하고 싶은 경우가 있다.

네트웍에서 음원이나 사진을 다운받았는 데 뮤직이나 갤러리에서 표시가 안되는 경우가 그렇다.


미디어 스캐너에게 파일정보가 업데이트가 되었다는 인텐트를 보낸다.


sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,

Uri.parse("file://" + path)));




아래 내용은 KitKat부터 사용 불가합니다. 

미디어 스캐닝이 너무 자주 불려 성능저하를 일으키는 문제로 앱단에서 호출하지 못하도록 되었습니다.

여하튼 KK 이전 버전이라면...


이럴 때는 아래처럼 인텐트를 하나 날려주자.

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,

Uri.parse("file://" + Environment.getExternalStorageDirectory())));


adb로 바로 미디어 스캐닝을 하고 싶다면 이렇게..

(URI 부분을 file:///storage하면 전체 storage에 대해 스캐닝을 수행함)

adb shell am broadcast -a android.intent.action.MEDIA_MOUNTED

file:///storage/sdcard0



Android 4.2 에뮬레이터의 기본 이미지는 한글이 인식이 안된다.

이럴 땐 시스템 이미지를 다음처럼 바꾸면 된다.


먼저 Android SDK Manager에서 "MIPS System Image"를 다운로드 받자.



AVD에서 위에서 받은 이미지를 사용하도록 설정




요즘트위터페이스북더보기


TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 

if (tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT){
    // 유심이 없는 경우
else {
    // 유심이 존재하는 경우
}


먼저 Rooting이 되어 있어야 가능.


adb remount

adb shell rm system/app/app.apk

adb uninstall packagename


tee가 실행 안된다...

걍 cygwin bash에서 아래 명령어로 저장하자.


$ adb logcat -v time | tee . logcat.txt

$ adb shell cat proc/kmsg | tee . kmsg.txt


원문: http://blog.daum.net/bluebread/8


저는 보통 ddms보다는 logcat을 사용하는데요.

로그를 실시간으로 보면서 자동저장할 수도 있다는 점에서 ddms보다 훨씬 강력합니다.


 logcat.pl

첨부한 파일은 자동으로 로그파일명에 날짜_시간 형식의 timestamp를 붙여서 저장하도록 한 perl script 입니다.

 
실행하면 다음과 같이 cmd 창에 메시지가 스크롤됩니다.

 
동시에 로그파일 디렉토리에 다음과 같이 파일이 생성되어 있게 됩니다.


요구사항
1. perl 이 설치되어 있어야 합니다. (당연!)


2. tee를 사용하기 위해 cygwin이 설치되어 있어야 합니다. 

   만약 리눅스 환경이라면 이미 tee가 있을 겁니다.

   (tee는 화면에 표시하는 동시에 파일로 저장하는 기능을 하는 유틸리티입니다.)


사용법

1. c:\ 에다가 logcat.pl을 복사합니다.
   다른 디렉토리를 사용하셔도 무방합니다.
 
2. 에디터로 log_dir을 자기가 쓰는 프로젝트 로그 파일 위치로 변경합니다.
   바꾸지 않으시면 현재 디렉토리(C:\)에 로그가 만들어집니다.
 
3. 다음 명령행을 입력하시면 실행됩니다.
   C:\> logcat.pl
 
   "-v time" 이 아닌 다른 파라미터를 주고 싶으시면 원하는 파라미터를 붙여서 실행하십시오.
   C:\> logcat.pl -v thread ActivityManager:I
 
 
파라미터를 주지 않으면 "-v time" 이 디폴트 파라미터로 주어집니다.
타임스탬프가 찍혀 나오므로 대개의 경우 가장 유용합니다.
 
다음 페이지에 가보시면 adb logcat에서 어떤 파라미터를 사용할 수 있는지 보실 수 있습니다.


http://ecogeo.tistory.com/251?srchid=BR1http://ecogeo.tistory.com/251


  • Default로 설정할 때
ResolverActivity.OnClick() {
.....
if (filter != null) {
                final int N = mAdapter.mList.size();
                ComponentName[] set = new ComponentName[N];
                int bestMatch = 0;
                for (int i=0; i<N; i++) {
                    ResolveInfo r = mAdapter.mList.get(i).ri;
                    set[i] = new ComponentName(r.activityInfo.packageName,
                            r.activityInfo.name);
                    if (r.match > bestMatch) bestMatch = r.match;
                }
                getPackageManager().addPreferredActivity(filter, bestMatch, set,
                        intent.getComponent());
            }
}
}
  • Default 해제 할 때 (Settings>Launch by default>Clear defaults)
InstalledAppDetails.onClick() {
........
else if(v == mActivitiesButton) {
mPm.clearPackagePreferredActivities(packageName);
mActivitiesButton.setEnabled(false);
}
........
}