gpt4 book ai didi

java - 安卓|内容观察者 |内容 URI 不包含资源 ID

转载 作者:搜寻专家 更新时间:2023-11-01 09:38:27 25 4
gpt4 key购买 nike

我正在尝试检测 Android 应用程序的屏幕截图。我正在使用 contentObserver 来检测媒体目录中的更改,而不是使用 FileObserver 因为 known issue在 Android M 上使用它。

这是代码 fragment :

    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,例如:content://media/external/images/media/12345,我尝试过的大多数设备都会出现这种情况 - Moto G3 (Android 6.0.1)、Nexus 5 (Android 6.0),我在运行 6.0.1 的三星 S5 上获得了整个 URI(包括 ID)。

这是一个已知问题吗?

如何获取 ID?

遍历整个媒体目录并查找是否在应用程序处于 Activity 状态时截屏并不是一个优化的解决方案,而是在内容 URI 中获取资源 ID 可以解决问题,因为我们可以直接获取文件的路径并检测它是否是屏幕截图文件,观察者仍然会观察所有媒体内容的变化(例如,它还会观察到后台发生的 WhatsApp 图片下载)。

最佳答案

不幸的是,我认为您无法指望在插入到 MediaStore 中指定的表时接收到正确的 Uri

这是 Android 5.1.1 的 MediaProvider#insert() 方法的来源(取自 here ):

@Override
public Uri insert(Uri uri, ContentValues initialValues) {
int match = URI_MATCHER.match(uri);

ArrayList<Long> notifyRowIds = new ArrayList<Long>();
Uri newUri = insertInternal(uri, match, initialValues, notifyRowIds);
notifyMtp(notifyRowIds);

// do not signal notification for MTP objects.
// we will signal instead after file transfer is successful.
if (newUri != null && match != MTP_OBJECTS) {
getContext().getContentResolver().notifyChange(uri, null);
}
return newUri;
}

注意这一行:getContext().getContentResolver().notifyChange(uri, null)

上面的意思是,在插入到 MediaProvider 时,将为插入指定的 Uri 发送通知,它始终是一个“目录”Uri。这可能是一个错误:如果他们使用 newUri 而不是 uri - 它会完全按照您的预期工作。

如果它在 Samsung 和 Marshmallow 上运行,那么这个问题要么在 Android 6+ 中修复,要么 Samsung 在他们的 AOSP 构建中修复它。但我认为您不能真正指望它可靠地工作。

关于java - 安卓|内容观察者 |内容 URI 不包含资源 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41428875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com