我正在尝试检测 Android 应用程序上的屏幕截图。我正在使用 contentObserver 来检测媒体目录中的更改,而不是使用 FileObserver,因为它在 Android M 上存在已知问题。
这是代码片段:
handlerThread = new HandlerThread("content_observer");
handlerThread.start();
final Handler handler = new Handler(handlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
getContentResolver().registerContentObserver(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
true,
new ContentObserver(handler) {
@Override
public void onChange(boolean selfChange, Uri uri) {
Log.d(TAG, "URL : " + uri.toString());
//Code to query using content resolver
if (uri.toString().matches(MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString())) {
Cursor cursor = null;
try {
cursor = getContentResolver().query(uri, new String[] {
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATA
}, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
//Logic to filter if it is a screenshot file
}
} finally {
if (cursor != null) {
cursor.close();
}
}
}
super.onChange(selfChange, uri);
}
}
);
当 onChange 被调用时(在截取屏幕截图/媒体文件夹中的任何其他更改之后),URI 是“ content://media/external/images/media ”而不是包含资源 ID 的整个 URI,例如:内容: //media/external/images/media/12345,这发生在我尝试过的大多数设备上——Moto G3(Android 6.0.1)、Nexus 5(Android 6.0),我得到了整个 URI(包括 ID)在运行 6.0.1 的三星 S5 上。
这是一个已知问题吗?
我怎样才能得到身份证呢?
遍历整个媒体目录并查找是否在应用程序处于活动状态时截取屏幕截图并不是一个优化的解决方案,而是在内容 URI 中获取资源 ID 可以解决问题,因为我们可以直接获取文件的路径并检测是否它是一个屏幕截图文件,但观察者仍会观察所有媒体内容的变化(例如,它还会观察到后台发生的 WhatsApp 图像下载)。