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

조회수 3843회

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

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

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

2 답변

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

    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)

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

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

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)