2017-01-02 20 views
1

fileObserverを使用してAndroidアプリでスクリーンショットを検出しようとしていますが、期待通りにfileObserverがAndroid 6で動作しません。ここで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(); 
} 

私は(のonEventがトリガされることはありません)動作しないのと同じコードが4.4.4どこを実行しているNexus 5の上で動作することを確認Nexus 5のランニングに私はAPI 23+のランタイムパーミッションを考慮しましたが、6.0.1。

Android MのfileObserverにknown issueが表示されていますが、スクリーンショットを検出するためのより良い方法がありますか? contentObserverを試してみたところ、issuesもありました。

+0

あなたが確認しているディレクトリにAndroidデバイスがスクリーンショットを保存する必要はなく、スクリーンショットを撮ったときにAndroidデバイスが '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にチェックを入れたいと思うかもしれません。そこにはスクリーンショットのコード全体があります。物事の仕組みをちょっと理解することができます。

関連する問題