【问题标题】:How to listen new photos in android?如何在 android 中收听新照片?
【发布时间】:2016-03-08 05:39:34
【问题描述】:

我需要收听来自任何来源的新图像,例如下载图像、捕获新图像、其他应用程序下载图像等 每当将新照片添加到图库时,是否有任何侦听器会触发事件?我已经找了两天了。我无法得到任何可靠的东西。

我读到了FileObserver,这有帮助吗?

【问题讨论】:

    标签: android android-gallery android-contentresolver android-mediascanner fileobserver


    【解决方案1】:

    新照片到达画廊

    表示已添加到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 何时更改,它不会告诉您任何有关添加/删除的具体信息。为此,您可能必须查询 MediaStore 以检测您以前的数据库或其他东西的任何更改。

    【讨论】:

    • 所以你建议我们做一个数据库作为对比,这样我们就可以检测到添加或删除?是不是太矫枉过正了?新的 android ContentObserver 有 public void onChange(boolean selfChange, Uri uri) 你认为我们可以用它来检测添加/删除吗?
    • 1.是的,我们需要自己的数据库。 2. 不,它不是那么矫枉过正。让我解释一下,你应该有关于你上次检查时间的信息。因此,当您查询时,您需要将数据库更新到该日期时间。 3. 这个 onChange() 可能有用,但是我没有用过,所以不能确定。文档说 - 为了确保在不提供 Uri 参数的旧版本框架上正确操作,应用程序还应该在实现 onChange(boolean, Uri) 重载时实现此方法的 onChange(boolean) 重载。
    • 您不需要维护数据库。您只需使用 here 使用的方法即可
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多