我正在尝试检测Android应用的屏幕截图。 我使用contentObserver检测在媒体目录的变化,在Android上不使用FileObserver因为known issue它M.Android | contentObserver |内容URI不包含资源ID
这里是代码片段:
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,如:content:// media /外部/图像/媒体/ 12345,这发生在我尝试的大多数设备 - Moto G3(Androi d 6.0.1),Nexus 5(Android 6.0),在那里,我得到了运行6.0.1的三星S5上的整个URI(包括ID)。
这是已知问题吗?
我怎样才能得到身份证?
这不是一个优化的解决方案,它可以遍历整个媒体目录,并在应用程序处于活动状态时查找是否获取屏幕截图,而是通过内容URI获取资源ID将解决问题,因为我们可以直接获取文件路径并检测它是否为屏幕截图文件,但观察者仍然会观察所有媒体内容更改(例如,它也会观察在后台发生的WhatsApp图像下载)。