如何收听 android 中的新照片?
How to listen new photos in android?
我需要收听来自任何来源的新图像,例如下载图像、捕捉新图像、其他应用程序下载图像等
每当新照片添加到图库时,是否有任何监听器会触发事件?我已经找了两天了。我什么都拿不到。
我阅读了有关 FileObserver
的内容,这对您有帮助吗?
new photos arrives to gallery
表示已添加到MediaStore
。
首先,FileOberver
是一种内存杀手方法。考虑大量文件。相反 ContentObserver
似乎是一种更好的方法。
getContentResolver().registerContentObserver(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, true,
new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
Log.d("your_tag","Internal Media has been changed");
super.onChange(selfChange);
Long timestamp = readLastDateFromMediaStore(context, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
// comapare with your stored last value and do what you need to do
}
}
);
getContentResolver().registerContentObserver(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true,
new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
Log.d("your_tag","External Media has been changed");
super.onChange(selfChange);
Long timestamp = readLastDateFromMediaStore(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// comapare with your stored last value and do what you need to do
}
}
);
private Long readLastDateFromMediaStore(Context context, Uri uri) {
Cursor cursor = context.getContentResolver().query(uri, null, null, null, "date_added DESC");
PhotoHolder media = null;
Long dateAdded =-1;
if (cursor.moveToNext()) {
Long dateAdded = cursor.getLong(cursor.getColumnIndexOrThrow(MediaColumns.DATE_ADDED));
}
cursor.close();
return dateAdded;
}
在服务中执行此操作可能是个好主意(曾经 运行)!您还需要在 onDestroy()
中注销
警告:这只会告诉您 MediaStore 何时更改,不会告诉您任何关于 addition/deletion 的具体信息。为此,您可能需要查询 MediaStore 以检测您以前的数据库或其他内容的任何更改。
我需要收听来自任何来源的新图像,例如下载图像、捕捉新图像、其他应用程序下载图像等 每当新照片添加到图库时,是否有任何监听器会触发事件?我已经找了两天了。我什么都拿不到。
我阅读了有关 FileObserver
的内容,这对您有帮助吗?
new photos arrives to gallery
表示已添加到MediaStore
。
首先,FileOberver
是一种内存杀手方法。考虑大量文件。相反 ContentObserver
似乎是一种更好的方法。
getContentResolver().registerContentObserver(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, true,
new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
Log.d("your_tag","Internal Media has been changed");
super.onChange(selfChange);
Long timestamp = readLastDateFromMediaStore(context, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
// comapare with your stored last value and do what you need to do
}
}
);
getContentResolver().registerContentObserver(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true,
new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
Log.d("your_tag","External Media has been changed");
super.onChange(selfChange);
Long timestamp = readLastDateFromMediaStore(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// comapare with your stored last value and do what you need to do
}
}
);
private Long readLastDateFromMediaStore(Context context, Uri uri) {
Cursor cursor = context.getContentResolver().query(uri, null, null, null, "date_added DESC");
PhotoHolder media = null;
Long dateAdded =-1;
if (cursor.moveToNext()) {
Long dateAdded = cursor.getLong(cursor.getColumnIndexOrThrow(MediaColumns.DATE_ADDED));
}
cursor.close();
return dateAdded;
}
在服务中执行此操作可能是个好主意(曾经 运行)!您还需要在 onDestroy()
警告:这只会告诉您 MediaStore 何时更改,不会告诉您任何关于 addition/deletion 的具体信息。为此,您可能需要查询 MediaStore 以检测您以前的数据库或其他内容的任何更改。