Windows에서 MinGW 란 것을 이용해서 Android 용으로 ffmpeg 을 빌드해 보자


1. NDK 설치

 - https://developer.android.com/ndk/downloads/index.html

 - android-ndk-r13b-windows-x86_64.zip

 - C:/dev/Android/android-ndk-r13b 에 풀었음


2. MinGW 설치 

 - http://www.mingw.org/

 - 버전 0.6.2-beta-20131004-1

 - C:/MinGW 에 설치했음

 - MinGW Installation Manager 실행됨

   -> mingw-developer-tookit, mingw32-base, msys-base 설치


3. ffmpeg

 - https://ffmpeg.org/download.html

 - ffmpeg-3.2.2.tar.bz2

 - D:/ffmpeg/ffmpeg-3.2.2 에 풀었음

 - build-android.sh 작성 후 D:/ffmpeg/ffmpeg-3.2.2 에 집어 넣음


build-android.sh 예 

- arm, armv7-a 용

- 디코딩만할거라 encoders, muxers 등을 제외함

#!/bin/bash


NDK=C:/dev/Android/android-ndk-r13b

SYSROOT=$NDK/platforms/android-24/arch-arm

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

ARCH=arm

CPU=armv7-a

PREFIX=./android/$CPU


ADDI_CFLAGS=""

ADDI_LDFLAGS=""


TEMPDIR=D:/ffmpeg/temp

TMP=D:/ffmpeg/temp


./configure \

--prefix=$PREFIX \

--disable-programs \

--disable-doc \

--disable-avdevice \

--disable-encoders \

--disable-muxers \

--disable-devices \

--disable-filters \

--arch=$ARCH \

--cpu=$CPU \

--cross-prefix=$TOOLCHAIN/bin/$TOOLCHAIN_PREFIX- \

--enable-cross-compile \

--sysroot=$SYSROOT \

--target-os=android \

--extra-cflags="-Os -ftree-vectorize $ADDI_CFLAGS" \

--extra-ldflags="$ADDI_LDFLAGS" \

--enable-pic \

--disable-debug


make clean

# Adapt the jobs count 

make -j3 

make install



4. C:/MinGW/msys/1.0/msys.bat 실행

> cd /d/ffmpeg/ffmpeg-3.2.2

> ./build-android.sh


5. D:/ffmpeg/ffmpeg-3.2.2/android 폴더안에 결과물이 똵!


끝!



옵션관련 참고 

 - http://blog.k-tai-douga.com/article/47044816.html



저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스

아.. retrofit 2.0은 정보가 많이 없구나...

xml 이 제대로 된 형태가 아니라서 어쩔수 없이 일부 모델에 대해선 직접 파싱을 해야해서 어케어케 해보니 아래와 같이 하면 되더이다.. 

맞는 방법인지는 몰겠음 -_-;;


Retrofit.Builder builder = new Retrofit.Builder();

builder.baseUrl(baseUrl);
builder.addConverterFactory(new ConverterFactory());

public static class ConverterFactory extends Converter.Factory {
SimpleXmlConverterFactory defaultConverter;

public ConverterFactory() {
defaultConverter = SimpleXmlConverterFactory.create();
}

@Override
public Converter<?, RequestBody> toRequestBody(Type type, Annotation[] annotations) {
return defaultConverter.toRequestBody(type, annotations);
}

@Override
public Converter<ResponseBody, ?> fromResponseBody(Type type, Annotation[] annotations) {
if (!(type instanceof Class)) {
return null;
}
Class<?> cls = (Class<?>) type;
if (cls == MyModel.class) {
return new MyModel.MyModelConverter();
}
return defaultConverter.fromResponseBody(type, annotations);
}
}

public class MyModel{


// has members..


public static class MyModelConverter implements Converter<ResponseBody, MyModel> {


@Override
public MenuList convert(ResponseBody value) throws IOException {
MyModel model = new MyModel();

InputStream is = value.byteStream();

try {
InputNode read = NodeBuilder.read(is);

// make model...

} catch (Exception e) {
e.printStackTrace()
;
} finally {
is.close()
;
}
return model ;
}
}
}


저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스


주로 영어 단어를 축약해서 쓰는 단어들임..

인터넷 돌아다니다가 알게된 단어들 그때그때 정리.. 



サプリ

- サプリメント

- supplement

- 비타민, 보충제

- 줄여서 사프리 라고 하는듯



リプ

- リプライ

- reply

- 영어 그대로 답변

- 넷상에서는 "리프"로 줄여서 사용하는듯



アポ

- アポイント

- アポイントメント

- appointment

- 약속을 주로 "아포"로 쓰는듯..

- アポを取る : 약속을 잡다




リーク

- leak

- (비밀 등의)누설


ガセ

- 가짜, 위조, 거짓말


リークなのかガセなのか

- 진짜를 흘린건지 가짜인지



저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스

아래로~


2화 : http://haiyuu.tistory.com/3

3화 : http://haiyuu.tistory.com/4

4화 : http://haiyuu.tistory.com/6

저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스

am start 쓰면됨..


adb shell am start -a (action) -d (data uri) -t (mimetype) -n (component : packagename/activity)

ex) adb shell am start -a android.intent.action.VIEW -d http://www.google.com


usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]

               [--R COUNT] [-S] [--opengl-trace]

               [--user <USER_ID> | current] <INTENT>


am start: start an Activity.  Options are:

    -D: enable debugging

    -W: wait for launch to complete

    --start-profiler <FILE>: start profiler and send results to <FILE>

    -P <FILE>: like above, but profiling stops when app goes idle

    -R: repeat the activity launch <COUNT> times.  Prior to each repeat,

        the top activity will be finished.

    -S: force stop the target app before starting the activity

    --opengl-trace: enable tracing of OpenGL functions

    --user <USER_ID> | current: Specify which user to run as; if not

        specified then run as the current user.


<INTENT> specifications include these flags and arguments:

    [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]

   [-c <CATEGORY> [-c <CATEGORY>] ...]

    [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]

    [--esn <EXTRA_KEY> ...]

    [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]

    [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]

    [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]

    [--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]

    [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]

    [--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]

    [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]

    [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]

    [--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]

    [-n <COMPONENT>] [-f <FLAGS>]

    [--grant-read-uri-permission] [--grant-write-uri-permission]

    [--debug-log-resolution] [--exclude-stopped-packages]

    [--include-stopped-packages]

    [--activity-brought-to-front] [--activity-clear-top]

    [--activity-clear-when-task-reset] [--activity-exclude-from-recents]

    [--activity-launched-from-history] [--activity-multiple-task]

    [--activity-no-animation] [--activity-no-history]

    [--activity-no-user-action] [--activity-previous-is-top]

    [--activity-reorder-to-front] [--activity-reset-task-if-needed]

    [--activity-single-top] [--activity-clear-task]

    [--activity-task-on-home]

    [--receiver-registered-only] [--receiver-replace-pending]

    [--selector]

    [<URI> | <PACKAGE> | <COMPONENT>]



저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스
TAG android

대부분의 모바일 앱, 웹에서

authentication (인증, 넌 누구냐) / authorization (허가, 권한 부여) 과정을 sns 계정을 통해 많이 한다 


새로운 서비스에 가입하려면 메일쓰고 이름쓰고 또 해야 하는데

어차피 다 똑같은 정보이고 또 쓰기 귀찮으니까 이미 가입한 서비스의 정보를 가져가 쓸게~ 하는거다..


facebook, twitter, google (plus) 가 대부분이고 OAuth 방식으로 하고 있다


뭐.. 이건 그렇다 치고


google 이 말이지..

그냥 google 계정이 있고 google plus 계정이 있다


google계정을 가진 사람이 google plus 를 사용하지 않을 수도 있는데

google은 google plus 계정을 사용하도록 유도(?) 하고 있고

개발자 사이트에도 google plus login으로 설명을 하고 있다.


하지만 그냥 google 로그인과 google plus 로그인은 다르지 않남!!??


일단 사용자가 google 계정을 가지고 있고 google plus 도 활성화 해둔 상태를 가정했을때


scope을 아래꺼만 쓰면

https://www.googleapis.com/auth/userinfo.profile


아래와 같이 상단에 Google 이라고 적혀있는것을 볼수있고

허가요청도 basic information 에 대해서만 하고 있다





scope 을 아래 것으로 쓰면

https://www.googleapis.com/auth/plus.login


상단에 Google + 라고 적혀있는것을 알수있고

circle 어쩌고 하면서 google + 관련 기능에 대한 권한을 요청하고 있는것을 볼수 있다.



위 두가지 상황은 나머지 소스는 모두 동일하고

scope만 다르게 설정한경우이다.


Google plus login할거면 PlusClient 클래스를 사용하면 더 간단하게 할수 있다. 


그럼

google 계정은 있는데 google plus 에는 가입을 안하는 경우 어떻게 동작을 할까?

이런경우는 한번더 물어보더라 -ㅅ-!




그리고 웹에 가서 google plus 에 가입하여 프로필에 보면

아래와 같이 google+ 로그인을 사용한 앱에 똵 등록이 되어있다!





즉... 주절주절 말이 많았는데..


내맘대로 결론은

1. 그냥 google 계정만 있으면 google plus에 가입했던 안했던 client 에서 google plus login이 가능..

2. google login / google plus login 은 그냥 범위가 다름

3. 어차피 일반 사용자들은 뭐가뭔지 모름

4. 걍 google 이 원하는대로 google plus login 써주자





저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스
TAG android

/system/framework/framework-res.apk


apktool 을 이용해서 풀면

리소스들이 똵!!



저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스


android.R.attr 참조를 이용하여

현재 theme의 리소스 정보 얻어오기..


TypedArray a = getTheme().obtainStyledAttributes(new int[] {  
    android
.R.attr.windowBackground
});
Drawable backgroundDrawable = a.getDrawable(0);
a
.recycle();
TypedArray a = getTheme().obtainStyledAttributes(new int[] {  
    android
.R.attr.colorBackground,
    android
.R.attr.textColorPrimary,
});
int backgroundColor = a.getColor(0, 0);
int textColor = a.getColor(1, 0);
a
.recycle();

저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스

첫번째.


DialogFramgment 를 사용할때 setRetainInstance(true) 를 적용하여 사용하면

orientation 변경등 configuration 이 변경되어 activity 가 재생성이 되었을때 DialogFramgent 가 다시 나타나지 않고 사라지는 문제가 있다. 


http://stackoverflow.com/questions/12433397/android-dialogfragment-disappears-after-orientation-change


이는 아래와 같은 workaround 로 해결 가능하다. 


@Override

public void onDestroyView(){

if (getDialog() != null && getRetainInstance()) {

getDialog().setDismissMessage(null);

}

super.onDestroyView();

}



두번째. 


DialogFragment 가 화면상에 떠있는동안 home 을 눌러 화면에서 사라지게 한다.

그런 상태에서 DialogFragment 의 dismiss 가 호출되면 다음과 같은 에러가 발생한다. 

화면에서 사라지면서 onSaveInstanceSate가 호출된 상태에서 resume 되지 않고 dismiss를 하면 발생하게 된다. 


E/AndroidRuntime(19229): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

E/AndroidRuntime(19229): at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1323)

E/AndroidRuntime(19229): at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1341)

E/AndroidRuntime(19229): at android.app.BackStackRecord.commitInternal(BackStackRecord.java:597)

E/AndroidRuntime(19229): at android.app.BackStackRecord.commit(BackStackRecord.java:575)

E/AndroidRuntime(19229): at android.app.DialogFragment.dismissInternal(DialogFragment.java:292)

E/AndroidRuntime(19229): at android.app.DialogFragment.dismiss(DialogFragment.java:258)


이 경우에는 

dismiss를 호출하지 않고 

dismissAllowingStateLoss() 로 종료해주면 된다. 

개인적으로 dismissAllowingStateLoss() 를 사용하고 싶지 않은데 

dismiss는 어차피 명시적으로 호출해 주는 것이고 확실히 종료시킨다는 의미이므로 써도 상관없을것 같다.


그런데 commit() 도 마찬가지 인데 이에 대한 처리는 좀 신중해야 할것으로 보인다.

참고 : http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html 




저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스
  • 배경을 nine-patch 를 쓸때는 padding 값 지정은 하지 않도록 한다
    • nine-patch 자체가 padding을 고려하여 만든 이미지
    • padding을 적용하면 nine-patch 의 content영역은 무시하고 padding값 우선 적용됨
  • nine-patch 이미지는 서로 overlay가 되지 않는다
    • layer-list 로 설정된 drawable이 모두 nine-patch 인 경우 서로 overlay가 되지 않고 먼저 설정한 nine-patch의 content 영역에 두번째로 설정된 nine-patch 가 들어가게 되고 두번째로 설정된 nine-patch의 content 영역에 text와 같은 content가 위치하게 된다.
  • Fragment 를 inner class로 정의할때는 무조건 public static 이어야 한다. 


저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스