앱잠금 어플을 만드려는 대학생입니다. 다른앱이 켜지는 것을 막을 방법으로 어떤 것이 있을까요?


안드로이드 수업 텀프로젝트로 앱잠금 어플을 만드려고 합니다.

내가 설정한 어플들에 한해서 키려고 시도하면 그 이벤트를 뺏어와서 제가 만든 앱이 켜지게 하고싶은데 다른앱이 켜지는 것을 캐치하는 방법으로 어떤 것들이 있을까요?

안드로이드의 학습 수준은 이제 막 간단한 계산기 정도나 만들어본 초보입니다만 열심히 공부해서 꼭 만들고 싶습니다.

  • 2016년 06월 01일에 수정됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.
  • 2016년 03월 29일에 작성됨

조회수 535


2 답변


좋아요
4
싫어요
채택취소하기

가능하지만 아무래도 단점들이 있습니다.

Android 2.2 부터는 Device Admin API를 지원하는데, 이걸 사용하면 조금 '강하다' 싶은 기능들을 사용할 수 있습니다. 말 그대로 해당 기기의 관리자/소유자 앱이 되는건데요. 물론 앱을 설치할 때 사용자에게 해당 앱을 기기의 관리자 앱으로 등록할 것인지 묻습니다. (그리고 다른, 이미 설치된 관리자 앱 (MDM 등)이 새로운 관리자 앱 설치를 막을 수 있습니다.)

관련 기능을 직접 구현한적은 없어서 확답은 못드리겠지만, API들을 살펴보니 [addPersistentPreferredActivity][2] 를 사용하면 (교수님께서 말씀하셨다던 방식과 비슷하게) 가능하지 않을까 싶어요.

보통 앱들이 다음과 같은 manifest를 가지고 있기 때문에 해당 intent filter (LAUNCHER 인텐트)를 필터로 하셔서 만드신 Device Admin 앱의 activity를 default 핸들러로 등록하시면 각종 앱들이 실행될때 만드신 앱의 activity로 넘어오게 될 것 같네요.

<activity android:name="MainActivity">
    <!-- This activity is the main entry, should appear in app launcher -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

물론 앞서 언급한 '단점'들을 말씀드리면,

  • 단순히 앱을 홈스크린에서 실행시켜서 시작하는 것이 아니면 위의 intent filter로만으로는 다 잡아낼 수 가 없습니다 (특정 스키마 링크 클릭, 앱 간의 연동, 등등).
  • 또한, adb 등으로 직접 접속하여 앱을 실행하는 경우에도 위의 intent filter로는 한계가 있습니다.
  • Notification 같은 경우는 이 방법으로 막지 못합니다.

모든 intent를 다 필터해서 구분하는 방법을 쓰면 좀더 포괄적으로 중간에서 가로챌 수 있겠지만, 그만큼 복잡해지고 "위험"해질 것 같네요. 관련 API쪽으로 조금 더 알아보시고 테스팅해보시기를 권합니다.

[2]: http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#addPersistentPreferredActivity(android.content.ComponentName, android.content.IntentFilter, android.content.ComponentName)

  • 2016년 06월 01일에 수정됨
    CEO & Researcher @ Theori. Security / Hacking.
  • 2016년 03월 30일에 작성됨
    CEO & Researcher @ Theori. Security / Hacking.

  • 2번 링크가 Markdown 미리보기엔 잘 보이는데, 막상 답글에서는 제대로 처리가 안되네요.. 맨 아래에 [2]: 이후 http부터 "Name)"까지 다 복사하신 후 붙여넣기 하세요.    cai   2016.3.30 11:42     
  • 정성어린 답변에 진심으로 감사드립니다. 답변해주신 내용으로 수업 직후 바로 교수님과 상담을 해보았습니다만 혹여 대체할 수 있는 다른 방법은 없을까요? 예를들어 다른 어플이 일단 '켜진 후' 꺼지게 하는 방법, '켜진 후' 한번 더 탭하는 등 동작을 하면 꺼지게 하는 방법 등 일단 켜지는 것까지는 허용하고 그 다음에 사용을 막는 방법은 좀 더 구현이 쉬울지 궁금합니다. 친절한 답변에 다시 한번 감사를 전합니다.    ShinDongHyuk   2016.3.30 13:06     

설치된 안드로이드에서 특별한 지원을 해주지 않는 한 루팅을 하지 않은 상황에서 그렇게 강력한 권한을 특정 앱이 가지긴 어려울 것입니다.

해당 이슈를 해결할 몇가지 방향은 루팅이나 커스텀 롬의 제작 등이 있을 것 같은데 텀 프로젝트로 만들 규모는 아닐 것 같아요. 차라리 특정 문자에 대해서 앱이 정리해준다는 식으로 쉽게 접근할 수 있지만 개인에게 유용할 수 있는 것을 시도해보는 것이 좋지 않을까 합니다.

  • 2016년 06월 01일에 수정됨
    모바일 데이터 베이스를 만드는 yet another nit picker.
  • 2016년 03월 30일에 작성됨
    모바일 데이터 베이스를 만드는 yet another nit picker.

  • 좋은 조언해주셔서 정말 감사합니다. 교수님이 제안한 대안중 하나로 런처를 만들어서 사용자로 하여금 저희가 만든 런처를 사용하게 하면 그안에서는 앱이 켜지는 이벤트를 가져올수 있다고 하셨는데요. 막연히 들었던거라 궁금한게 있는데 앱이 켜지고 잠금 기능을 활성화하면 저희가 만든 런처로 바꾸게하는 메시지를 띄우고 잠금이 종료되면 런처를 다시 원래의 것으로 바꿔주고 하는 방향은 혹시 어떨까요..?     ShinDongHyuk   2016.3.30 10:58     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close