Android 2015. 8. 28. 10:49

Java finished with non-zero exit value 2 - Android Gradle


자바 함수 길이가 64k가 넘어가면 생기는 문제

제한을 늘려주거나, 필요없는 라이브러리를 지운다.

http://chrononsystems.com/blog/method-size-limit-in-java

해결 방법 링크 참조!


posted by 수면시간보장
:
Android 2015. 2. 5. 16:40

최근 업데이트된 카톡과 롤리팝으로 업그레이드 되면서 새롭게 바뀐 구글 주소록.

스크롤뷰는 아닌데 스크롤이 되고 아래로 스와이프를 하면 꺼지게 되어있다.



요로코롬 아래로 스와이프를 하면 액티비티가 종료되게 되어 있는데

이걸 만들기 위해서 그동안 삽질했던 내용을 정리하려고 한다!


구현 방법은 크게 다음과 같다.

1. android.view.GestureDetector 를 통해서 gesture snipping

2. android.widget.OverScroller 를 통해서 Fling시의 동작 처리

scroller.getCurrVelocity() 를 하지 않으면 속도가 바뀌지 않아서 Fling의 max값 까지 일정한 속도로 계속 스크롤 하게 된다. 

scroller의 default Friction은 0.015f다.


삽질하고 나니까 그닥 어려워보이진 않는데 맨첨에는 멘붕이 엄청 심했다.. 나중에 다시 한번 정리해야지!

posted by 수면시간보장
:
Android 2015. 1. 30. 10:23

어제 RecyclerView를 이용해서 리스트 구현중에 스크롤뷰가 나타나지 않아서 고생을 했던 적이 있다.

다음은 안드로이드 개발자 센터에 나와있는 RecyclerView 사용법중 일부분이다.

https://developer.android.com/training/material/lists-cards.html

<!-- A RecyclerView with some commonly used attributes -->

<android.support.v7.widget.RecyclerView

    android:id="@+id/my_recycler_view"

    android:scrollbars="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent"/>


    android:scrollbarSize="" //스크롤바 사이즈

    android:scrollbarStyle="" //스크롤바 스타일

    android:fadeScrollbars="false" //스크롤바가 사라지는지 여부

그런데 암만 해도 스크롤바가 나타나지 않는것이다. 

그래서 이것저것 건들여보다가 갑자기 생각난게 테마였다.

다음은 안드로이드 개발자 센터에 나와있는 마테리얼 디자인이다.

http://developer.android.com/design/material/index.html

안드로이드가 제공하는 기본 테마는 세가지로

@android:style/Theme.Material (dark version)

@android:style/Theme.Material.Light (light version)

@android:style/Theme.Material.Light.DarkActionBar

인데 나는 액션바의 글자와 아이콘 색을 하얀색으로 하기 위해서 android:style/Theme.Material (dark version) 테마를 사용했고 기본 화면을 흰색으로 하기 위해서 background에 하얀색을 맞춰논 상태였다.

그리고 다음은 마테리얼 디자인의 색 부분인데

http://www.google.com/design/spec/style/color.html#color-ui-color-application



검은색 테마를 사용했으므로 text와 icon 색은 왼쪽의 white에서 가져온다.

즉 스크롤바의 색은 #FFFFFF의 12% 였던 것이다.

하얀색 위에 하얀색(알파)를 올려놓으니 당연히 보일리가 없는 것이었다..


해결방법은 간단했다. 테마를 @android:style/Theme.Material.Light.DarkActionBar으로 바꾸면서 해결되었다.

앞으로를 뷰가 잘 보이지 않을때는 다른 뷰에 겹쳐서 그런건 아닐까 생각해보자.


posted by 수면시간보장
:
Android 2015. 1. 21. 18:41

알림바의 알림을 통해 앱을 실행 할 경우 activity stack이 꼬이는 경우가 있다.

이를 해결하기 위해서 DummyActivity를 사용하거나 LauncherActivity에 SingleTask를 주는 방법등이 있는데

둘다 프로세스종료->알림으로 앱 실행->런쳐에서 앱 실행 이 상황에서 앱이 두번씩 실행된다.


더미 액티비티를 이용한 해결 방법은 아래 주소에서 확인할 수 있다.

http://www.androidpub.com/796480 


주요 내용은 인텐트에 

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK 

                | Intent.FLAG_ACTIVITY_CLEAR_TOP 

                | Intent.FLAG_ACTIVITY_SINGLE_TOP);

이렇게 주니까 어떤 상황에서든지 Activity가 하나만 뜬다는 내용.


Intent.FLAG_ACTIVITY_NEW_TASK 

기존의 Task에 해당 Activity가 있다면 해당 Task에서 Activity를 추가함. onNewIntent()부터 시작.

없으면 새로운 Task생성 후 RootActivity가 됨. onCreate()부터 시작.


Intent.FLAG_ACTIVITY_CLEAR_TOP 

기존의 Task에 해당 Activity가 있다면 해당 Activity를 TopActivity로 만들고 기존의 Activity위에 있던 다른 Activity들을 finish시킴. 해당 Activity는 onNewIntent()부터 시작

없으면 새로운 액티비티가 TopActivity로 추가됨. onCreate()부터 시작.


Intent.FLAG_ACTIVITY_SINGLE_TOP 

TopActivity가 해당 Activity 라면 해당 Activity의 onNewIntent()부터 시작.

없으면 새로운 액티비티가 TopActivity로 추가됨. onCreate()부터 시작.



LauncherActgivity에 SingleTask를 줄 경우에는 Launcher에서 실행할때 무조건 onNewIntent부터 실행해서 가장 최근의 액티비티 스택을 기억하지 못한다는 단점이 있다.


나는 아래 세가지 플로우를 만족하는 방법을 써야하는데

나는 이 방법을 ParentActivity를 설정해주면서 해결했다.




posted by 수면시간보장
:
Android 2015. 1. 21. 16:23


ActivityTest.zip

앱을 나갔다 왔을때 비밀번호를 입력하는 엑티비티 수행후 원래 동작으로 하던 도중 생긴 문제.

사용자가 앱을 나갔음을 알때는 Activity의 onUserLeaveHint()로 찾게 되는데 이게 다른 액티비티로 넘어갈때도 onPause()전에 onUserLeaveHint()를 수행하게 된다.

MainActivity

AActivity

해당 로그는 이렇게 나온다.

MainActivity에서 AActivity로 갈때 Intent.FLAG_ACTIVITY_NO_USER_ACTION을 추가했을때

AActivity에서 BActivity로 갈때 Intent.FLAG_ACTIVITY_NO_USER_ACTION을 추가했을때

둘다 Intent.FLAG_ACTIVITY_NO_USER_ACTION을 추가했을때


결과를 정리하면

ParentActivity에서 ChildActivity를 부를때 Intent에 No_User_Action을 추가하면

ParentActivity가 onPause() 되기전에 onUserLeaveHint()가 호출되지 않는다!

ParentActivity에서 home key나 recent key를 누를경우는 정상적으로 onUserLeaveHint()가 호출된다.


안드로이드 레퍼런스에서 설명되어 있는  FLAG_ACTIVITY_NO_USER_ACTION는 다음과 같다.

If set, this flag will prevent the normal onUserLeaveHint() callback from occurring on the current frontmost activity before it is paused as the newly-started activity is brought to the front.

설정할 경우, 이 플래그는 새로운 액티비티(자식)가 앞으로 와서 가장 최근의 액티비티(부모)가 paused하기 전에 발생하는 onUserLeaveHint() 콜백을 방지한다.

Typically, an activity can rely on that callback to indicate that an explicit user action has caused their activity to be moved out of the foreground. The callback marks an appropriate point in the activity's lifecycle for it to dismiss any notifications that it intends to display "until the user has seen them," such as a blinking LED.

일반적으로 사용자의 행동으로 인해 해당 액티비티가 foreground에서 background로 이동했다는 것을 알리기 위해 onUserLeaveHint()콜백에 의존한다.

이 콜백은 액티비티 라이프사이클 안에서 사용자가 그들을 볼때까지 보여지는 것으로 계획되어 있던 알림(LED 깜빡이기 등)을 지우기 위한 적당한 지점을 표시한다.

p.s.) 알림을 지우는 조건이 어떤 Activity를 통해서 알림내용을 보는것 이라면 해당 액티비티의 onUserLeaveHint()에서 알림을 지우라는 뜻 같다.

If an activity is ever started via any non-user-driven events such as phone-call receipt or an alarm handler, this flag should be passed to Context.startActivity, ensuring that the pausing activity does not think the user has acknowledged its notification.

만약 액티비티가 전화 수신 혹은 알람 같은 사용자가 하지 않은 이벤트를 통해서 시작 된다면, 이 플래그는 Context.startActivity를 통해 전달된다. 일시정지된 액티비티는 사용자가 그 통지를 인정했다고 생각하지 않는다.

Constant Value: 262144 (0x00040000)

http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NO_USER_ACTION


posted by 수면시간보장
:
Android 2015. 1. 14. 15:47

안드로이드 개발자 센터에 올라오는 샘플 프로젝트들이 전부다 gradle로 빌드하게 되어 있다.

그래서 구글에서는 AndroidStudio를 쓰라고 권장한다.

지금까지 AndroidStudio를 쓰면서 느낀점은 '단축키가 이클립스와 너무 달라서 불편하다.', '너무 느리다.' 여서 Eclipse를 고집하고 있었는데 더이상 고집부리면 도태 될 것 같아 오랜 기간동안 써오던 Eclipse를 포기하고 AndroidStudio를 공부해보려 한다.

먼저 AndroidStudio는 아래 링크에서 받을 수 있다.

http://developer.android.com/sdk/index.html

안드로이드 개발을 위해서는 JDK와 android sdk 세팅 되어 있어야 한다. 나는 이미 이클립스로 작업환경을 만들어 놨기 때문에 해당 과정은 생략한다.

설치 과정은 별로 어렵지 않은데 android sdk는 기존에 있던 sdk를 사용할 수 있다. 만약 새로 받아야 한다면 \Users\<user>\sdk\ 이곳에 sdk가 받아진다.


posted by 수면시간보장
:
Android 2014. 8. 13. 20:07

블루투스 가운데 버튼 롱클릭

HeadsetStateMachine(22734): Connected process message: 101, size: 1
HeadsetStateMachine(22734): event type: 3event device : 48:C1:AC:63:16:09
HeadsetStateMachine(22734): processVrEvent: state=1 mVoiceRecognitionStarted: false mWaitingforVoiceRecognition: false isInCall: false

블루투스 가운데 버튼 클릭

MediaSessionHelper(21887): Attempting to get helper with context com.example.noearphone.MainActivity@3183d806
MediaSessionHelper(21887): dispatched media key KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_MEDIA_PLAY, scanCode=200, metaState=0, flags=0x8, repeatCount=0, eventTime=50437068, downTime=50437068, deviceId=10, source=0x101 }
NoEarphone(21887): 126
NoEarphone(21887): 0

블루투스 가운데 버튼 릴리즈

MediaSessionHelper(21887): Attempting to get helper with context com.example.noearphone.MainActivity@3183d806
MediaSessionHelper(21887): dispatched media key KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MEDIA_PLAY, scanCode=200, metaState=0, flags=0x8, repeatCount=0, eventTime=50437104, downTime=50437068, deviceId=10, source=0x101 }
NoEarphone(21887): 126
NoEarphone(21887): 1

이어폰 음량 조절
MediaSessionHelper(21887): Attempting to get helper with context android.app.ContextImpl@1f77e1de
MediaSessionHelper(21887): dispatched volume adjustment
MediaSessionHelper(21887): Attempting to get helper with context android.app.ContextImpl@1f77e1de
MediaSessionHelper(21887): dispatched volume adjustment
audio_hw_primary(192): out_set_parameters: enter: usecase(1: low-latency-playback) kvpairs: routing=6
audio_hw_primary(192): select_devices: out_snd_device(5: speaker-and-headphones) in_snd_device(0: )
backup_data_changed(803): com.android.providers.settings

이어폰 가운데 버튼

MediaSessionHelper(21887): Attempting to get helper with context com.example.noearphone.MainActivity@3183d806
MediaSessionHelper(21887): dispatched media key KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_HEADSETHOOK, scanCode=226, metaState=0, flags=0x8, repeatCount=0, eventTime=50591234, downTime=50591234, deviceId=3, source=0x101 }
NoEarphone(21887): 79
NoEarphone(21887): 0


MediaSessionHelper(21887): Attempting to get helper with context com.example.noearphone.MainActivity@3183d806
MediaSessionHelper(21887): dispatched media key KeyEvent { action=ACTION_UP, keyCode=KEYCODE_HEADSETHOOK, scanCode=226, metaState=0, flags=0x8, repeatCount=0, eventTime=50591440, downTime=50591234, deviceId=3, source=0x101 }NoEarphone(21887): 79
NoEarphone(21887): 1


리모트 컨트롤

http://developer.android.com/reference/android/media/RemoteControlClient.html



posted by 수면시간보장
:
Android 2014. 8. 4. 20:08

https://github.com/JakeWharton/Android-ViewPagerIndicator

먼저 깃허브 주소 글쓴 지금 2.4.1이 최신 버전이다.

사용방법은 깃헙에 친절하게 나와있다. (...)

안드로이드 젤리빈부터 액션바에 인디케이터를 지원해주는데 굳이 이걸 쓰는 이유는 스크롤링할때 스무스한 느낌을 주기 때문이다. 

테마는 xml에서 수정하는게 편한거 같다.



    

    

    

    

    



나같은경우는 기본적으로 테마를 Theme.AppCompat.Light 를 써야해서 Theme.PageIndicatorDefaults를 내 프로젝트에서 오버라이드 해서 썼다. 글씨색을 바꾸려면 TextApperanace.TabPageIndicator을 오버라이딩 해서 쓰면 된다.

posted by 수면시간보장
:
Android 2014. 8. 4. 15:41

한 프로젝트에 같은 라이브러리가 두번 참조됐을때 뜨는 에러.

프로젝트를 진행하면서

appcompat_v7과 viewpager-with-indicator을 둘다 사용하게 되면서 둘다 android-support-v4.jar를 참조하는데 android-support-v4.jar의 버전이 다르기 때문에 생기는 오류 같다. 

일단 방법으로는 하나를 지우거나... 근데 둘다 외부 라이브러리 프로젝트 이기 때문에 하나를 지울순 없다.

android-support-v4.jar를 둘다 최신버전으로 업데이트 하는 방법이 있다.

방법은 프로젝트 우클릭 -> Android Tools -> Add Support Library 로 업데이트 하면 해결!

안드로이드는 수시로 업데이트가 나오기 때문에 이런점은 좀 불편한듯...

posted by 수면시간보장
:
Android 2014. 8. 4. 15:05

http://dante2k.tistory.com/457

테스트앱에만 로그 보이고 배포시에는 로그 안보이게 하는 방법.

나는 그동안 LogUtil에 DEBUG 상수를 만들어 쓰고 있었는데 이방법보다 편한 방법인듯 싶다.

배포할때 실수로 DEBUG를 false로 안바꾸고 배포했을때 난감했던 기억이 있어서

posted by 수면시간보장
: