SELECT * FROM mytable LIMIT N OFFSET (SELECT COUNT(*) FROM mytable) - N;


출처: http://stackoverflow.com/questions/14018394/android-sqlite-query-getting-latest-10-records

아래 3가지 방법중에 하나를 통해서 썸네일 이미지를 가져올 수 있다.


1. ContentResolver를 통해 직접 썸네일 이미지를 가져오기

MINI_KIND: 512 x 384 thumbnail

MICRO_KIND: 96 x 96 thumbnail


Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnail(

getContentResolver(), selectedImageUri,

MediaStore.Images.Thumbnails.MINI_KIND, null );


2. 썸네일 Uri가져오기

Cursor cursor = MediaStore.Images.Thumbnails.queryMiniThumbnail(

                             getContentResolver(), selectedImageUri,

                             MediaStore.Images.Thumbnails.MINI_KIND,

                             null );

if(cursor.moveToFirst() && cursor.getCount() > 0 ) {

String uri = cursor.getString( cursor.getColumnIndex( MediaStore.Images.Thumbnails.DATA ) );

BitmapFactory.decode.....

}


3. 일반 이미지 파일에서 썸네일 추출하기

ExifInterface exif = new ExifInterface(pictureFile.getPath());

byte[] imageData=exif.getThumbnail();

Bitmap  thumbnail= BitmapFactory.decodeByteArray(imageData,0,imageData.length);



출처: http://stackoverflow.com/questions/5548645/get-thumbnail-uri-path-of-the-image-stored-in-sd-card-android

카톡의 대화입력 창 처럼 자동으로 늘어나도록 하고싶어서 검색을 하는데 대부분이 커스텀 EditText 클래스를 만들어 xml에서 사용하는 것이었다.


하지만 난 순수한 xml로만 하고싶어서 계속 찾던중에 다음과 같이 xml로만 가능한 방법을 찾았다.

maxHeight는 textSize의 크기에 맞춰서 변경해야 하며, 나는 4줄만 표시되도록 설정한 크기가 84dp이다.


android:layout_height="wrap_content" android:isScrollContainer="true" android:maxHeight="84dp" android:textSize="17.6sp"android:inputType="textMultiLine"

출처: https://snipt.net/orastem/android-multiline-edittext-that-dynamically-increases-height-to-always-display-whole-text/


사용자가 설치한 앱만 가능


adb shell "run-as {패키지명} chmod 666 /data/data/{패키지명}/databases/data.db"

adb pull /data/data/{패키지명}/databases/data.db


'develop > android' 카테고리의 다른 글

썸네일 이미지 가져오기  (0) 2016.01.08
EditText 높이 자동조절  (1) 2015.12.24
ImageButton enable 설정  (0) 2015.12.15
Screen On/Off 이벤트 받기  (2) 2015.10.29
webview youtube 백그라운드 재생 정책위반 해결  (1) 2015.10.23

ImageButton은 Layout xml에서는 enable속성을 설정할 수 없다.


오로지 ImageButton.setEnabled() API로만 설정이 가능하다.

슬립모드에 들어갈때와, 슬립모드 해제할때에 무언가 동작을 하기 위해서는 2가지 이벤트를 받아야 한다.


android.intent.action.SCREEN_ON

android.intent.action.SCREEN_OFF


이 두가지 이벤트는 안드로이드 정책 변경으로 인해 Manifest에 기술해서는 받을 수 없고, registerReceiver()를 이용하여 동적으로 등록해야만 정상적으로 이벤트를 받을 수 있다.


다음처럼 등록을 하여 사용하였다.


ScreenOnReceiver screenOnReceiver = new ScreenOnReceiver();

IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.SCREEN_ON");
filter.addAction("android.intent.action.SCREEN_OFF");
registerReceiver(screenOnReceiver, filter);


class ScreenOnReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.d("SmartPortal", "ScreenOnReceiver, onReceive:" + action);
        if (action.equals(Intent.ACTION_SCREEN_ON)) {
            ...
        }
        else if (action.equals(Intent.ACTION_SCREEN_OFF)) {

...

        }
    }
}



어플 등록중 구글 플레이스토어에서 정책 위반이라면서 다음과 같은 메일이 왔다.


아래 설명된 문제를 해결한 다음 변경한 업데이트를 제출하시기 바랍니다.

거부 이유: 콘텐츠 정책의 금지 사항 조항 위반

정기 검토 결과 앱에서 YouTube 동영상의 백그라운드 재생을 허용하는 것으로 확인되었으며, 이는 YouTube API 서비스 약관의 다음 부분을 위반하는 것입니다.

'귀하의 API 클라이언트 및 귀하는 사용자 또는 기타 제3자에게 다음 작업을 장려하거나 이를 가능하게 하는 기능을 만들어서는 안 됩니다. (8) YouTube API를 통해 이용하도록 제작된 모든 YouTube의 시청각 콘텐츠의 오디오 또는 동영상 요소를 구분, 분리, 수정하는 작업'


기존에 개발 된 어플을 수정만하고 있던차라 처음에는 full wake lock을 하는 서비스 때문에 문제가 있는거라 생각하여 쓸모없는 서비스라 제거를 하고 다시 시도를 했지만 2번째엔 앱이 삭제되었다고 메일이 왔다. 정책 위반사항은 위의 빨간색으로 표시한 것과 같은 내용이었다.


어플이 실제로는 webview를 통해서 모바일페이지를 보여주는 형태의 껍데기이기 때문에 계속 찾다보니 회사 사이트에서 youtube 사이트로 가는 링크가 있는것을 알게되었고, 거기서 영상을 재생하고 슬립모드로 들어가도 영상이 계속 재생(소리가 계속 재생됨)되는것을 확인하였다.


기본 인터넷 어플은 전혀 그런현상이 없는것을 확인하고 이리저리 알아본 결과 다음과 같이 해결할 수 있었다. webview가 있는 activity의 onPause를 추가한다.


protected void onPause() {
    super.onPause();
    try {
        Class.forName("android.webkit.WebView")
            .getMethod("onPause", (Class[]) null)
            .invoke(webView, (Object[]) null);
    } catch(Exception e) {
        e.printStackTrace();
    }
}


WebView.onPause()도 있으나 이 API는 Android 11에서부터 지원한다.


이제 영상은 정상적으로 pause되나 웹뷰 동작이 정상적이지 않게된다. 그것은 onResume을 호출해줌으로써 해결했다.




2017.1.10 추가

protected void onResume() {
    super.onResume();
    try {
        Class.forName("android.webkit.WebView")
            .getMethod("onResume", (Class[]) null)
            .invoke(webView, (Object[]) null);
    } catch(Exception e) {
        e.printStackTrace();
    }
}






쿼리시 다음을 입력하면 보기 좋게 출력된다.

sqlite> .header on

sqlite> .mode column



- 참조

- http://www.colm.net/open-source/ragel/

- http://www.colm.net/wp-content/uploads/2014/10/ragel-guide-6.9.pdf


- Ragel 사용이 더 좋은 작업

- 문자열 파싱

- 프로그래밍 언어 분석(컴파일러 제작)

- 사용자 입력 검증


- 지원 언어

- C, C++, Obj-C, C#, D, Java, Go, Ruby


- 코드

- Ragel은 유한상태머신(Finite State Machine, FSM)을 구현

- 여러줄 인 경우 "%%{"와 "}%%"로 감싸고, 한줄 인 경우 라인의 앞에 "%%"를 입력한다.

- C언어처럼 한 줄의 마지막에 ";"을 입력한다.

예)

%%{

machine atoi;

...

%%}

%%write init;


- 코드 삽입

- FSM의 이름 삽입

%% machine {FSM 이름};


- Ragel 코드 시작은 main이다.

- ":=" 연산자는 R-Value의 표현식을 나타내는 상태 셋을 생성한다.

%% main := {수식};


- 수식

- 사용자 정의 된 이름 혹은 미리 정의된 이름, 사용자 정의 Action이 올 수 있다.

- Action은 사용자 입력이 수식과 매칭되는 경우 실행할 코드를 넣는 일종의 함수로 각 언어별 실행 코드를 넣는다.

%% action on_word {printf("%n\n", n);}

- 사용자 정의 수식을 정의하려면 "=" 을 사용한다.

%% word = ^space+;


- FSM 초기화 및 시작

- FSM 에서 필요한 상수 선언

%% write data;

- FSM 데이터 초기화

%% write init;

- FSM 실행

- 실제 FSM이 실행 될 위치에 다음과 같이 삽입한다.

%% write exec;


- Action 종류

- Action은 연산자에 따라서 실행하는 방법이 달라진다.

- {수식} > {Action}: Entering Action(FSM state: from the start state)

- 수식에 진입하는 시점에서 Action이 실행된다.

- 예를들어, 문자열을 파싱할 때, 처음 한번만 실행하는 경우

%% action onStart {puts("Start Parsing");}

%% main := alpha+ > onStart;

- {수식} @ {Action}: Finishing Action(FSM state: into a final state)

- 수식의 마지막에 Action이 실행된다.

- 다음은 a-z까지의 소문자가 하나 있을때마다 lower Action이 실행된다.

%% word = ([a-z] @lower)+;

- 다음은 a-z까지의 소문자가 아닌 경우 notLower Action이 실행된다.

%% word = [a-z]+ @notLower;

- {수식} $ {Action}: All Transition Action(FSM state: all state for matched)

- 수식과 매칭될 때마다 Action이 실행된다.

- 다음은 a-z까지의 소문자가 하나 있을때마다 lower Action이 실행된다. (Finishing Action 예제의 변형)

%% word = [a-z]+ $lower;

- {수식} % {Action}: Leaving Action(FSM state: go out of a machine via a final state)

- 수식을 벗어날 때 실행된다.

- 다음은 a-z까지의 소문자가 아닌 경우 lastLower Action이 실행 된 후 notLower Action 실행된다.

%% word = [a-z]+ %lastLower @notLower;

- Action의 순서

>(Entering) $(All) %(Leaving) @(Finishing)


- 주요 연산자

- {수식}+: 1개 이상

- {수식}*: 0개 이상

- {수식}?: 0개 혹은 1개

- ^{수식}: 수식의 반대, ^space 는 공백문자가 아닌 모든 문자를 뜻함.

- ({수식}): 그룹핑, 여러 수식을 하나의 수식으로 처리

- {수식1}|{수식2}: or 연산, 수식1 혹은 수식2와 매칭


- cs(Current State): FSM 상태를 나타내는 변수, 에러, 성공등의 값이 저장.


- 스캐너
- 상태 셋을 생성하는 ":=" 연산자를 사용하여 정의한다.
- 여러가지 패턴 목록을 정의한 후 각 패턴마다 action을 실행할 수 있다.
- main을 정의할 때 스캐너로 정의할 수 있으며, 별도로 정의한 경우 "@{fcall" {스캐너이름}"}" 형태로 실행한다.
- 기본 구조는 다음처럼 스캐너 이름을 정의하고 "|*" 와 "*|" 사이에 패턴과, 패턴 매칭시 실행 될 Action을 정의한다.
- Action을 정의할 때 "=>" 연산자는 생략가능하다.
{스캐너 이름} := |*
{패턴} [{[=>] Action}];
...
*|
- 다음은 영문자와 숫자가 합쳐져 있는 문자열에서 숫자를 검색하는 스캐너이다.
digit_scan := |*
alpha+;
digit+ {puts("digit!");};
*|
- 스캐너는 매칭된 문자열의 시작과 종료를 ts(token start), te(token end)에 저장한다.
- 매칭되기 전의 ts와 te는 같은 값을 가지며, 하나의 패턴이 매칭되면 그 다음 위치를 저장한다.
- 예를들어 90번지에서 100번지까지 패턴이 매칭되었으면 그 다음 패턴 검색시 ts, te의 값은 101이다.
digit_scan := |* ...
digit+ => {char buf[12]; memcpy(buf, ts, te - ts); puts(buf);};
*|


퍼옴: http://www.kaisyu.com/notes/google-android/android-partial-module-build


특정 모듈만 build 하기

  • $ANDROID_HOME/build/envsetup.sh 스크립트를 사용하면 간편하게 특정 module만 build할 수 있다. (envsetup.sh에 대한 더 상세한 내용은여기를 참고하자.)
  • 먼저 shell 상에서 위 스크립트를 현재 환경으로 load 해준다. ($ANDROID_HOME 환경 변수는 Android full source root 경로 값을 저장하고 있는 것으로 미리 정의되어 있어야 한다.)
    $ . $ANDROID_HOME/build/envsetup.sh
  • 자주 사용한다면 그냥 .profile 이나 .bashrc 같은 파일에 추가해두는 것도 좋다.
  • 아무튼, 위 스크립트에서 제공하는 함수들 중 m, mm, mmm 세 가지를 사용하게 된다.
    • m - 현재 경로를 기준으로 소스 트리의 최상위 경로로 이동한 후 make를 실행해준다.
    • mm - 현재 경로를 기준으로 가장 가까운 단위 모듈을 찾아서 그 모듈만 build 해준다.
    • mmm - 파라미터로 주어진 경로들에 대해 단위 모듈 build를 해준다. 마지막에 snod를 추가할 경우 System image 파일까지 새로 생성해준다.
  • 예를 들어보자.
    • Email application package만 새로 build 하고 싶은 경우 다음과 같이 해줄 수 있다.
      $ cd $ANDROID_HOME/packages/apps/Email
      $ mm
    • 혹은 mmm을 사용해서 package build 후 System image까지 새로 생성하는 방법도 있다.
      $ cd $ANDROID_HOME/packages/apps/Email
      $ mmm . snod


+ Recent posts