본문 바로가기

Android/Dev32

Uri 로부터 파일의 실제경로 구하기/외장SD카드의 경로 얻기 안드로이드 앱을 만들다보면 외부의 다운로드 링크나 인터넷 주소가 아니라 기기 내부의 파일을 uri를 사용하여 이용하는 경우가 있습니다. Content Provider를 이용해서 파일에 접근하는 경우에 uri로 해당 파일을 얻게 되는데 보통 아래와 같이 uri를 얻게 됩니다. content://authority/path/id 문제는, Content Provider에서 정보를 읽어온뒤 사용해버리거나 바로 편집하는 경우에는 상관없으나 이때 얻어진 uri를 가지고 Content Provider를 거치치 않고 직접 접근 하기위한 경로를 얻기위해서 Uri.getpath()를 시도하면 /docume/FILE:1234 와 같은 경로가 반환되게 됩니다. 사진파일이나 음악파일등, 프로바이더로 접근한 뒤에 나중에 실제경로로.. 2019. 4. 3.
SwipeRefreshLayout 을 사용할 때 가로 스크롤 과 충돌하지 않게하기 WebView와 같은 객체를 사용할때 주로 같이 사용하는 레이아웃이 SwipeRefreshLayout입니다. 모바일 크롬처럼 화면을 아래로 내리면 웹뷰가 새로 로딩되게 해주는 레이아웃 입니다. 이때 문제가 되는 것이, 웹뷰에 로딩중인 사이트에서 가로스크롤이 가능한 요소가 있을 경우에는 해당 요소를 가로 스크롤 할 때 SwipeRefreshLayout이 오작동 하거나 가로 스크롤 요소의 가로 스크롤이 불가능한 경우가 발생합니다. 아래와 같은 CustomSwipeRefreshLayout 을 사용해 주어야 오작동을 방지하고 가로 스크롤 요소와 SwipeRefreshLayout의 기능을 충돌하지 않게 사용할 수 있습니다. 아래와 같은 클래스를 만들어 주고, xml 레이아웃에서 정의 해주면 사용할 수 있습니다. .. 2019. 3. 17.
오늘이 양력/음력 공휴일인지 확인하는 코드 오늘이 공휴일인지 아닌지를 확인하여 특정 작업을 실행시켜 주어야 할 때가 있습니다. 일반적인 공휴일의 경우에는 날짜 리스트를 만들어 두고 오늘의 날짜가 해당 리스트에 있을 경우로 판단해주면 되지만 설날이나 추석 같은 음력 공휴일이 표시된 경우라면 제법 복잡하게 생각해야 되는것 같습니다. 안드로이드 API24 , N (누가) 버전 이상부터 추가된 ChineseCalendar 를 이용하면 간단하게 확인할 수 있습니다. * ChineseCalendar 의 내용과 자세한 사용법은 안드로이드 개발자 문서의 ChineseCalendar항목을 확인 해 주세요. @RequiresApi(api = Build.VERSION_CODES.N) public boolean checkHoliday(Date date) { boole.. 2019. 3. 17.
ScrollView 사용시 스크롤 중인지 판단하여 작업 제한하기 스크롤 뷰를 사용할 때 스크롤 상태를 확인해야 할 경우가 있습니다. 스크롤 뷰 내에 클릭 리스너가 있는 객체가 있을 경우 스크롤 할때 해당 객체가 클릭되는 경우가 발생하기 때문입니다. 이때, 스크롤 중인지 아닌지를 확인하여, 스크롤 중이라면 클릭을 제한해야 스크롤 중에 클릭되더라도 객체의 클릭리스너나 터치 리스너가 작동하지 않습니다. 돌아다니는 많은 예제를 보면 CustomScrollView를 만들어 내부에서 OnScrollStoppedListener를 구현하는 방법이나 getViewTreeObserver()를 통해 OnScrollChangedListener를 달아서 내부에서 Y 스크롤의 포지션값 비교를 통한 방법이 있는데 전자의 경우는 사용자가 스크롤뷰에서 fling 제스쳐를 주는 등 예상치 못한 이벤.. 2019. 3. 17.
soundpool 사용 시 매너모드/무음모드 연동 soundpool은 안드로이드에서 간단한 소리를 재생할 때 유용하게 사용할 수 있는 방법입니다. 기본적인 사용방법은 1. onstart에서 load Soundpool soundPool @Override public void onStart() { super.onStart(); soundPool = new SoundPool(4, AudioManager.SRTEAM_SYSTEM, 100); soundsMap = new HashMap(); soundsMap.put(1, soundPool.load(getActivity(), R.raw.sound1, 1)); } onStart에서 load해 주어야 soundpool을 사용할 수 있습니다. 이후에는 시스템리소스에서 상주하며 soundPool.play 로 언제든지 재생.. 2018. 5. 5.
특정 작업시 화면이 꺼지지 않게 유지 public void KeepScreenOn(Integer stateKeepScreen) { if (stateKeepScreen == 0) { getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } else if (stateKeepScreen ==1) { getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } } 특정작업을 수행할 때 화면이 꺼지지 않도록 하는 방법. 사용시에는 KeepScreenOn(1); , KeepScreenOn(0); 으로 사용합니다. Flag와 clearFlag로 만들었습니다. 상기.. 2018. 4. 26.
알림바(Notification Bar)를 누를 때 프레그먼트 실행 하기 보통, 앱에서 사용하는 알림바(Notification Bar)를 눌렀을 때는 액티비티로 이동하게 됩니다.하지만, 프레그먼트를 사용할 때는, 프레그먼트로 이동하게 해 주어야 좀 더 다양한 작업들을 할 수 있습니다. 프레그먼트의 경우 단독으로 사용하기 보다는 여러개의 프레그먼트를 묶어서 뷰페이저를 통해서 사용하게 됩니다. 노티피케이션에서 프레그먼트를 실행하는 방법은 아래와 같은 과정을 통해서 동작하게 됩니다. 1. 알림바(Notification Bar)를 사용하여 알림.2. 알림바를 누르면 메인액티비티를 실행.3. 메인액티비티에서 노티피케이션에서 실행된 것을 확인하면 뷰페이저의 특정 프레그먼트로 이동.3. 프레그먼트로 이동 이후, 원하는 작업을 수행. 1. Notification 알림 띄우기 public s.. 2018. 4. 10.
뷰페이저 사용 시 특정 프레그먼트로 이동하기 뷰페이저를 사용할 때 프레그먼트에서 작업 후에 특정 프레그먼트로 바로 이동하는 방법은 아래와 같다. 메인 액티비티에 아래와 같은 메소드를 구현해 준 뒤 프레그먼트에서 호출해 준다. static ViewPager viewPager; public static void MoveFragment() { viewPager.setCurrentItem(2);} 2018. 4. 10.
앱 빌드 후 android.permission.READ_PHONE_STATE 추가현상 안드로이드는 앱의 기능제공을 위해서 AndroidManifest에 권한을 명시해주어야 합니다. 특정한 권한의 경우에는 추가적으로 사용자의 동의를 얻은 이후에야 활성화되고 앱의 기능제공을 위해서 기기를 이용할 수 있게 됩니다. 그런데, 이번에 업데이트를 위해 앱을 빌드하고 출시하는 과정에서 AndroidManifest에 명시해놓지 않았는데도 불구하고 권한이 하나 추가되어 있는것을 확인했습니다. android.permission.READ_PHONE_STATE가 멋대로 추가되어 있는 현상이었는데, 불필요하게 과다한 권한요구에 대해서 유저의 피드백이 좋지않고, 개발에 있어서도 필요한 최소의 권한만을 요청하는것이 맞다고 생각하는데이렇게 의도하지 않은 권한요청이 발생하는 것은 불편한 일입니다. 권한요청이 멋대로 추.. 2018. 3. 31.
구글 플레이 스토어에서 앱 최신버전 가져오기 구글의 플레이스토어에서 가장 문제가 된다고 생각하는 부분은, 어플리케이션이 독립적으로 최신버전을 확인하도록 할 수 있는 방법을 제공하지 않는다는 것입니다. 구글의 안드로이드는 '플레이스토어'라고 하는 앱마켓을 기반으로 앱을 관리하고 있습니다. 보통 앱의 최신버전은 마켓을 통해서 자동 업데이트 되지만 앱마켓의 캐시에 따라 앱의 버전 배포가 일정하지 않아 유저마다 앱이 최신버전으로 자동업데이트 되는 시점이 일치하지 않고 심지어 유저가 앱마켓에서 자동 업데이트를 설정하지 않는 경우에는, 유저가 앱 마켓을 실행하지 않으면 앱의 최신버전 업데이트를 알리거나 강제할 수 있는 방법이 없습니다. 버전 파편화가 심한 안드로이드가 이러한 시스템으로 인하여 앱의 버전 파편화까지 발생하는것이 가장 큰 문제점이라고 생각합니다... 2018. 3. 31.