Android, 다른 앱이 실행될 때 감지


92

사용자가 암호없이 지정된 앱에 액세스하지 못하도록하는 앱을 개발하려고합니다. 시나리오는 ...

  1. 사용자가 "이메일"앱을 클릭 함 (예 :)
  2. 내 앱이 앱 실행을 감지합니다.
  3. 내 앱이 "이메일"앱인지 확인합니다
  4. 내 앱은 상단에보기를 열어 비밀번호를 요청합니다.
  5. 사용자가 비밀번호를 입력하면 내 앱이 사라지고 "이메일"앱이 맨 위에 남습니다.

나머지는 괜찮아요. 2 부만 헷갈리네요. 며칠 동안 Broadcast Intents 등을 읽고 평가판 프로젝트에서 "android.intent.action.MAIN"등을 들으려고 시도한 후에는 할 수 없습니다. 내 앱이 아닌 다른 앱이 시작되면 감지하는 것 같습니다.

누구든지 도울 수 있습니까? 시작할 인 텐트를 브로드 캐스팅하는 새 앱을 찾거나 새 인 텐트에 대한 시스템 로그를 읽어야하거나 네이티브 코드로 작업을 수행해야 하는가?

모든 조언이 도움이 될 것입니다. 완전히 대답 할 수 없더라도 더 많은 조사를 할 수있을 것입니다. 감사합니다. 이안


어떻게했는지는 잘 모르겠지만 App Protector 와 같은 은 사용자가 원하는대로 정확히 수행하므로 실제로 기술적으로 가능합니다.
hanspeide 2010

@lan u는 u는 당신의 지식을 공유하시기 바랍니다 수있는 문제를 해결하는 방법
한국 인터넷 진흥원

안녕하세요 해결책을 가지고 있습니까?
ask4solutions

답변:


34

logcat 결과물을 사용 하고 분석 할 수 있다고 생각 합니다.

모든 유사한 프로그램에서이 권한을 찾았습니다.

android.permission.READ_LOGS

그것은 그들 모두가 그것을 사용한다는 것을 의미하지만 프로그램이 시작되고 그 후에 우리 프로그램 (앱 보호기)이 시작되고 앞장서 게 될 것입니다.

아래 코드를 사용하십시오.

try
    {
        Process mLogcatProc = null;
        BufferedReader reader = null;
        mLogcatProc = Runtime.getRuntime().exec(new String[]{"logcat", "-d"});

        reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream()));

        String line;
        final StringBuilder log = new StringBuilder();
        String separator = System.getProperty("line.separator"); 

        while ((line = reader.readLine()) != null)
        {
            log.append(line);
            log.append(separator);
        }
        String w = log.toString();
        Toast.makeText(getApplicationContext(),w, Toast.LENGTH_LONG).show();
    }
    catch (Exception e) 
    {
        Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
    }

그리고 Manifest 파일에 권한을 추가하는 것을 잊지 마십시오.


이 코드를 어디에 넣어야합니까? 서비스에서? onStartCommand ()?
haythem souissi

56
JellyBean 이상에서는 작동하지 않습니다. READ_LOGS 권한은 이제 시스템 앱 전용으로 예약되어 있습니다.
Ran

5
이것에 대해 절대적으로 확신합니까? Smart AppLock은 JB 장치에서도이 작업을 수행 할 수있는 것 같습니다. 응용 프로그램이 장치 관리자 상태로 상승했기 때문입니까? play.google.com/store/apps/...
KARTHIK Balakrishnan

1
@Torcellite, 해당 앱에는 "작업 실행"권한이 있으므로 대신 해당 기술을 사용할 수 있습니다.
Sam

1
@Ran 그래서 지금 그것을 사용하기 위해 무엇을 할 것인가 ... 제가 젤리 빈 이상이어야하기 때문에 질문에 언급 된 문제를 해결하기 위해 지금 가능한 해결책이
있습니까

19

이를위한 변칙적 인 방법은

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();

당신은 그 목록을 통해 전화에서 실행되는 것을 확인합니다. 이제 id와 processName으로 식별 할 수 있으므로 표준 활동의 경우 구별하기 어려운 모든 것을 중지하지 않는 한 사용자 정의 활동이 쉽습니다.

참고 : 이것은 실제로 화면에 표시되는 목록이 아니라 실행중인 항목의 목록 일뿐입니다. 그래도 백그라운드에서 목록.

비밀번호의 경우 보호되는 앱을 찾았을 때 활동을 시작할 수 있습니다.


앱이 시작 / 재개 된 시간을 얻을 수 있습니까?
0LLiena

4
Android L에서는 android.app.usage대신 패키지를 사용하십시오. developer.android.com/reference/android/app/usage/...
Plo_Koon

12

나는 이것이 가능하지 않다고 생각하고 희망한다. 이러한 기능이 악성 소프트웨어에 의해 얼마나 쉽게 남용 될 수 있는지 고려하십시오. 자신과 브로드 캐스트되는 인 텐트를들을 수 있지만 애플리케이션 시작은 브로드 캐스트 이벤트가 아니어야합니다.

당신이 할 수있는 일은 런처를 교체하는 것 입니다. 사용자가 동의 한 경우.


1
왜 불가능해야합니까? 그것은 내 장치이며 무엇을 실행할지 결정합니다. 이것이 우리가 일상적으로 부여하는 다른 권한보다 어떻게 더 문제가됩니까? 대체 런처는 직접 시작한 앱만 모든 앱의 시작을 포착하지 않습니다. 이것과 유사한 스레드에 대한 많은 의견이 있습니다. 단순히 의도가 지나가는 것을 볼 수 있다는 것은 큰 문제가 될 것이지만 아무도 문제가 무엇인지, 왜 기존 권한 시스템이 할 수 없을 정도로 그렇게 심각하게 간주되어야하는지 설명하지 않습니다. 사용자에게 무슨 일이 일어나고 있는지 명확히하는 데 사용됩니다.
Kevin Whitefoot

잠재적 인 권한이 갈수록 이것은 멍청한 일입니다. 보안 모델을 갖는 요점은 대부분의 (이상적으로는 모든) 악용을 방지하면서 대부분의 합법적 인 사용 사례를 활성화하는 것입니다. 보호해야하는 것은 당신 (아마도 지식이 풍부한 사용자)뿐만 아니라 앱을 설치하는 순진한 사용자와 또 다른 공격 벡터를 고려할 필요가없는 앱 작성자입니다. 모든 보안은 트레이드 오프입니다.이 경우에는 유틸리티와 전력 대 대규모 악용 가능성 사이에 있습니다. 당신이 정말로 그 정도의 자유를 원한다면 안드로이드 스택을 복제하고 자신의 시스템을 코딩 할 수 있습니다.
Pontus Gagge

12
class CheckRunningActivity extends Thread{
    ActivityManager am = null;
    Context context = null;

    public CheckRunningActivity(Context con){
        context = con;
        am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    }

    public void run(){
        Looper.prepare();

        while(true){
            // Return a list of the tasks that are currently running,
            // with the most recent being first and older ones after in order.
            // Taken 1 inside getRunningTasks method means want to take only
            // top activity from stack and forgot the olders.
            List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);

            String currentRunningActivityName = taskInfo.get(0).topActivity.getClassName();

            if (currentRunningActivityName.equals("PACKAGE_NAME.ACTIVITY_NAME")) {
                // show your activity here on top of PACKAGE_NAME.ACTIVITY_NAME
            }
        }
        Looper.loop();
    }
}

현재 실행 중이고 Activity이것이 응용 프로그램에 Activity해당 하는지 확인할 수 있습니다 Email.

실행 CheckRunningActivity ThreadApplication시작 (또는 장치 부팅).

new CheckRunningActivity().start();

업데이트 : 이 클래스에는 android.permission.GET_TASKS권한 이 필요 하므로 매니페스트에 다음 줄을 추가합니다.

<uses-permission android:name="android.permission.GET_TASKS" />

이 접근 방식을 사용하고 있지만 루프로 인해 "// 여기에 PACKAGE_NAME.ACTIVITY_NAME 위에 귀하의 활동을 표시"가 계속해서 열립니다. 그에 대한 해결 방법이 있습니까?
Anuj Sharma 2014

정지 CheckRunningActivity 스레드 당신이 원하는 결과를 얻을 때
베세 슬라 프 Gaidarji

답장을 보내 주셔서 감사합니다.이 스레드가 다시 시작되는 방법 / 언제? 고정 서비스를 사용하고 있습니다.
Anuj Sharma

문제의 맥락에 따라 다르며, 무엇을 얻고 싶은지 자세히 설명하십시오.
Veaceslav Gaidarji

2
여기 코드에서 Looper.loop()문은 while(true)루프가 끝나지 않기 때문에 실행되지 않는 것처럼 보입니다 . 이것은 실수입니까?
Sam

11

주요 문제는 Launcher (홈 화면)가 일반적으로 명시 적 인 텐트를 사용할 때 암시 적 인 텐트를 수신하려고한다는 것입니다.

암시 적 인 텐트는 "누군가이 동영상 재생"이라고 말하고 Android가 해당 인 텐트를 처리 할 수있는 앱을 선택하는 경우입니다.

명시적인 의도는 홈 화면에서 "이메일"아이콘을 클릭 할 때 발생하는 것입니다. 특히 정규화 된 이름 (예 : com.android.mail 등)으로 특정 앱을 열도록 Android에 지시합니다.

AFAIK가 이러한 명시 적 의도를 가로 챌 수있는 방법은 없습니다. 두 활동이 동일한 정규화 된 패키지 이름을 가질 수 없다는 것은 Android에 내장 된 보안 조치입니다. 이렇게하면 타사가 앱을 복제하고 해당 앱으로 가장하는 것을 방지 할 수 있습니다. 원하는 작업이 가능하다면 이론적으로 경쟁사의 모든 앱이 작동하지 않도록 차단할 수있는 앱을 설치할 수 있습니다.

당신이하려는 일은 안드로이드 보안 모델에 위배됩니다.

한 가지 할 수있는 일은 특정 앱 개발자와 협력하여 의도를 보안 시스템에 전달하는 것입니다.


7

getRunningTasks() Android L에서는 더 이상 사용되지 않습니다.

앱 사용 통계를 얻으려면 android.app.usage 패키지 에서 UsageStats 클래스를 사용할 수 있습니다 .

새로운 앱 사용 통계 API를 사용하면 앱 개발자가 애플리케이션 사용과 관련된 통계를 수집 할 수 있습니다. 이 API는 더 이상 사용되지 않는 getRecentTasks () 메서드보다 더 자세한 사용 정보를 제공합니다.

이 API를 사용하려면 먼저 android.permission.PACKAGE_USAGE_STATS매니페스트 에서 권한을 선언해야합니다 . 또한 사용자는를 통해이 앱에 대한 액세스를 활성화해야합니다 Settings > Security > Apps with usage access.

다음 은 앱 사용 통계 API를 사용하여 사용자가 애플리케이션 사용과 관련된 통계를 수집 할 수 있도록하는 방법을 보여주는 기본 앱 예제입니다.


어떤 앱이 포 그라운드에 있는지 파악하는 데 사용 통계가 어떻게 도움이 되나요?
Ajay

3

아마도 백그라운드에서 지속적으로 실행되는 서비스가 필요할 것입니다. 귀하의 서비스가 귀하가 말한 것을 수행하도록하십시오. android.intent.category.LAUNCHER 카테고리와 함께 android.intent.action.MAIN도 들어보세요. 그런 다음 해당 브로드 캐스트 수신기가 onReceive 메서드를 재정의하고 응용 프로그램의 이름 등을 확인하도록합니다.


2
이것은 내가 생각했던 방법처럼 들리지만 기본 BroadcastReceiver로 MAIN (cat. LAUNCHER) 방송을 수신하는 데 어려움을 겪고 있습니다. 누구든지 전에 이것을 할 수 있었습니까? 이 단계에서는 응용 프로그램이 시작되었거나 다시 시작되었는지 감지하려고합니다. 그런 다음 패키지 이름을 내가 찾고있는 이름이 들어있는 문자열과 비교할 수 있습니다.
Ian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.