java - FileObserver 无法在 Android 6 上运行,可替代在 Android 上检测屏幕截图

标签 java android android-contentprovider

我尝试使用 fileObserver 检测 Android 应用上的屏幕截图,fileObserver 无法按预期在 Android 6 上工作。

这是检测屏幕截图的代码 fragment :

@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();
}

我观察到相同的代码在运行 4.4.4 的 Nexus 5 上工作,而在运行 6.0.1 的 Nexus 5 上不起作用(onEvent 永远不会触发),尽管我已经处理了 API 23+ 的运行时权限.

我看到一个 known issue使用适用于 Android M 的 fileObserver,是否有更好的替代方法来检测屏幕截图? 我尝试了 contentObserver,遇到 issues也有它。

最佳答案

您可以检查是否

com.android.systemui:screenshot

进程是否正在运行。如果它正在运行,那么屏幕截图很有可能是在用户使用您的应用程序时拍摄的。

尝试这个代码块,

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 ,屏幕截图的整个代码都在那里,我认为只需要一点点了解事情是如何工作的。

关于java - FileObserver 无法在 Android 6 上运行,可替代在 Android 上检测屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41431621/

相关文章:

java - OrientationChange 不会破坏 Activity 吗?

java - 功能或错误 : unable to override enum method with default implementation of UnsupportedOperationException

Java 静态 ArrayList<Listener>

java - javafx 接口(interface)中的结构项

Android:无法使用 CursorLoader 访问 ContentProvider 内的光标数据

java - 在 Linkedin Android 上分享

android - 将 cookie 发送到下一个 Activity android

android - 从 gradle 构建 Android 项目时找不到参数的方法 android()

具有多个 WHERE 选择的 Android 内容提供商查询

android - 从 ContentProvider 中删除?