2017-01-02 3 views
1

fileObserver를 사용하여 Android 앱에서 스크린 샷을 감지하려고하는데 예상대로 Android에서 fileObserver가 작동하지 않습니다.FileObserver가 Android 6에서 작동하지 않습니다.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_screenshot_detection); 

    observer = new FileObserver(Environment.getExternalStorageDirectory() + File.separator + Environment.DIRECTORY_PICTURES 
      + File.separator + "Screenshots" + File.separator, FileObserver.ALL_EVENTS) { 

     @Override 
     public void onEvent(int event, String path) { 
      if (event == FileObserver.CREATE) { 
       Log.i(TAG, "Screenshot detected @ " + path); 
      } 
     } 
    }; 
    observer.startWatching(); 
} 

내가 같은 코드로는 넥서스 5 실행에합니다 (의 onEvent가 트리거되지 않습니다) 작동하지 않는 경우 4.4.4을 실행하는 넥서스 5 작동하는지 관찰 : 여기

은 스크린 샷을 감지 조각입니다 API 23+에 대한 런타임 권한을 돌 보았지만 6.0.1.

Android M 용 fileObserver와 함께 known issue이 표시됩니다. 스크린 샷을 감지하는 데 더 좋은 방법이 있습니까? contentObserver를 사용해 보았습니다. issues도 마찬가지입니다.

+0

안드로이드 장치가 당신이 검사하고있는 디렉토리에 스크린 샷을 저장할 필요가 없으며 스크린 샷 찍을 때 안드로이드 장치가'FileObserver'를 트리거 할 필요가 없습니다. Android 5.0 이상에서는 미디어 프로젝션 API를 사용하여 직접 스크린 샷을 찍으십시오. – CommonsWare

+0

사람이 내 앱에있는 동안 찍은 스크린 샷이 있는지 확인한 다음 앱에서 물건을 공유하도록 요청합니다. 미디어 보호 API가이를 감지하는 방법을 제공합니까? 스크린 샷을 만들 수는 있지만 미디어 보호 API를 사용하여 스크린 샷 트리거를 감지 할 수는 없을 것입니다. – Rishi

+0

"스크린 샷을 만들 수는 있지만 미디어 보호 API를 사용하여 스크린 샷 트리거를 감지 할 수는 없을 것"이라고 정확합니다. 아마도'FileObserver'는 개인 정보 보호를 이유로 스크린 샷을 무시하도록 수정되었습니다. – CommonsWare

답변

-1

Android 6.0에는 추가 보안 기능이있어 알 수없는 출처의 응용 프로그램이 모든 것을 액세스 할 수 없습니다.

당분간 애플리케이션 관리자로 가서 앱으로 이동 한 다음 권한으로 이동 한 다음 저장 권한을 허용 할 수 있습니다.

지금 당분간 도움이되기를 바랍니다.

+0

응답 주셔서 감사합니다, 언급했듯이 필자는 외부 저장소를 읽고 쓰기 위해 필요한 권한을 가지고 있지만 fileObserver를 사용하여 변경 사항을 감지 할 수는 없습니다. – Rishi

+0

요청은 파일/콘텐츠 관찰자를 감지하는 다른 방법을 찾는 것입니다. –

0

com.android.systemui, 당신은 확인할 수 있습니다 스크린 샷

프로세스가 실행되지 않았거나. 이것이 실행 중이면 사용자가 앱을 사용하는 동안 스크린 샷을 찍을 가능성이 큽니다.

private void screenShotTaken(Activity activity) { 
    final Handler handler = new Handler(); 
    final int delay = 3000; 
    final ActivityManager am = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE); 

    handler.postDelayed(new Runnable() { 
     public void run() { 

      List<ActivityManager.RunningServiceInfo> services = am.getRunningServices(200); 

      for (ActivityManager.RunningServiceInfo ar : services) { 
       if (ar.process.equals("com.android.systemui:screenshot")) { 
        Toast.makeText(activity, "Screenshot is taken!!", Toast.LENGTH_SHORT).show(); 
       } 
      } 
      handler.postDelayed(this, delay); 
     } 
    }, delay); 
} 

이 일부 지연 실행을 계속 것입니다 당신에게 스크린 샷을 촬영하거나되지 않은 경우 감지 할 수있는 충분한 기회를 줄 무언가 것,이 코드 블록을보십시오. 또한 this git을 확인하고 싶다면 스크린 샷의 전체 코드가있는 곳에서 상황이 어떻게 작동하는지 조금만 이해하면됩니다.

관련 문제