我尝试使用 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/