본문 바로가기

Programming/Tasker 프로필/프로젝트

Tasker로 구현한 파일 선택기

몇몇 어플의 경우 sdcard 등에서 파일을 직접 골라서 그 어플의 알림 소리로 지정 한다던가, 배경화면으로 지정할 수 있도록 하는 설정이 존재 합니다.

Tasker로 만든 프로젝트에서도 가끔 sdcard 의 파일을 선택 해야 하는 경우가 있는데요.
이 때 애초에 그 파일을 선택 해놓고 배포를 해도 되기는 하지만 사용자마다 경로가 달라서 다운받은사람이 다시 직접 Tasker에 들어가서 재 지정을 해야 합니다.
이럴 경우 변수로 파일의 경로+파일 이름 을 받으면 조금 더 융통성 있는 파일 선택이 가능 하기는 하나 다른 정식 어플리케이션 처럼 파일 선택기(Astro, 갤러리, ES 파일 탐색기) 등을 열어서 직접 폴더로 들어가서 파일을 선택하는 작업이 불가능 합니다.
Tasker의 액션 중 Browse file이라는 액션이 있기는 하나 Tasker 만든 회사에서 만든 파일 탐색기를 다운로드 받아야 사용 할 수 있다는 불편한 점이 있습니다.
그래서 메뉴 + list file 액션으로 파일 선택기를 구현 해 보았습니다.

제가 필요해서 예전부터 이 작업을 하려고 했으나 Tasker에서 list file액션이 기본적으로 sdcard의 어떤 폴더경로를 입력 해야만 하더라구요.(sdcard자체를 직접 설정 할 수는 없고 sdcard의 하위폴더나 파일 중 하나를 선택 해야만 해서 sdcard 전체를 살펴보고 파일을 선택 하기에는 조금 부족했습니다.)
그런데 엊그제 경로로 '/' 를 주니 sdcard 윗부분 경로가 잡히고, /sdcard를 주니 sdcard 경로가 잡히는것을 발견하고 드디어 이 작업을 완성 하게 되었습니다.






위의 스크린샷이 sdcard 경로를 보여주는 것이며 최초 실행시 보여주는 화면 입니다. 폴더를 선택하면 그 폴더 내부로 들어가서 다시 그 폴더내의 파일 및 폴더를 보여주는 구조 이며, 폴더 또는 파일을 길게 터치하면 %SAMPLE_SELECT  전역 변수에 그 폴더 및 파일의 경로 명이 set 되어져서 배경화면을 바꾼다던가 벨소리를 바꾼다던가 할때 바로 %SAMPLE_SELECT 변수로 파일을 지정 할 수 있습니다.

샘플이라서 간단하게 필요한 부분만 집어 넣었기에 예외 처리가 거의 안되어있는데 만약 jpg 파일만 선택 하게 하고 싶다면 scene의 menu 부분에서 파일을 선택하는 부분의 제일 윗 부분에 if 문으로 선택된 파일이 *.jpg를 포함하고 있을 경우만 선택 되게 하도록 하는 구문을 추가 하는등의 수정을 조금만 가하시면 됩니다.





[구현 특이사항]




위 스샷의 4번, 5번 액션을 보시면 array pop으로 999999번째 원소를 삭제하는 구문이 있는데 이는 파일 선택기의 '위로' 가기 버튼을 구현 하기 위함입니다. 바로 전 폴더경로로 가기 위해서는 현재 경로명에 보여진 것들 중 하나를 / 로 split해서 마지막 원소 및 마지막에서 두번째 원소를 삭제하고 다시 / 로  join을 하면 되는데 variable clear (%file%file(#<)) 등의 액션이 제대로 작동하지 않더라구요. variable clear (%file4)등은 되는데 변수로 마지막 원소를 표현하는것은 안되서 고민을 하다가(%file(%file(<))등등 몇가지 가능 한 것을 해보고 했는데 전부 안되더라구요) array pop으로 현재 배열의 크기보다 큰 위치 값을 주게 되면 마지막 원소를 pop한다는것을 알게되어 위치값으로 최대값인 999999을 주니 제대로 작동 하더라구요.






위 스샷에서 빨간 동그라미 부분이 핵심입니다. 저부분에 꼭 경로를 입력 해야만 하는데(빈칸은 안됩니다.) sdcard 전체를 보여 주고 싶은데 sdcard가 기본 경로라서 저기에 무언가 입력 하게 되면 sdcard 하위 경로를 잡게 되더라구요. 그래서 이것저것을 실험해 보다보니 저렇게 입력 하면 sdcard 전체 경로를 잡고 / 만 입력하면 sdcard 윗 경로(system 폴더등이 있는 경로)를 잡게 되더군요. 
그런데 이는 OS 버전과 폰에따라 경로가 조금 달라질거라 예상이 되는 부분 이기도 합니다. ICS 부터 sdcard 경로가 storage0 또는 sdcard0 로 이름이 바뀌 었다는 말이 있어서 제대로 작동하지 않는 기기가 있을수도 있습니다.(저는 젤리빈 OS 인데 sdcard로 하니 제대로 작동합니다. 그런데 루트폴더로 가서 확인해보면 storage/sdcard가 원래 이름이고 그냥 sdcard는 이에 symlink를 걸어 놓은것 같은데 다른폰은 잘 모르겠네요....


현재 되어 있는 예외처리는 '위로'버튼을 눌렀을 때 sdcard 윗부분으로는 못가게 하는 예외처리가 전부 일 겁니다.
만약 sdcard 윗 부분으로도 갈 수 있게 하려면 '위로'버튼의 if문 및 else 문을 제거 하시면 됩니다.


[사용 및 테스트 방법]
프로젝트 파일을 import 하시고 '파일 탐색기' task를 실행 하시면 됩니다.

테스트.prj.xml