如何获取从SD卡中删除的任何文件的通知

Div*_*oni 7 android fileobserver android-6.0-marshmallow

我想像app一样创建Dumpster,为此我想要在用户删除任何文件时通知我以便将其保存到我的应用程序内存中.

我使用了File Observer,但它在删除文件后发出通知,而在marshmallow中它也没有通知删除.我把这个链接称为文件观察者.在某处我读到它可能使用本机编程语言(C),但无法获得任何解决方案.我怎样才能做到这一点?提前致谢.

我试过这个:

@Override
        public void onEvent(int event, String path) {
            if (path == null) {
                return;
            }
            //the monitored file or directory was deleted, monitoring effectively stops
            if ((FileObserver.DELETE_SELF & event)!=0) {
                FileAccessLogStatic.accessLogMsg += absolutePath + "/" + " is deleted\n";
            }       
        }
Run Code Online (Sandbox Code Playgroud)

Sah*_*hil 7

让我们先澄清一下事情.

  1. Dumpster使用.trash目录,该目录可能始终存在也可能不存在.应该注意的是,Dumpster在许多设备中无法正常运行,因为可以通过谷歌评论看到它.
  2. Dumpster使用(我从代码中仅用于教育目的)它是自己的系统文件Handler,它使用a service来检查onClick事件,如果它是一个文件,onClick它将它File以及它保存path到一个单独的文件夹(通常是隐藏的)并保存它在database当地.如果它被删除,你知道该文件的位置,如果不是,则从中删除该文件hidden folder.嗯,这有点不值得痛苦,因为你需要几乎所有使用CPU资源的服务运行.它也可以在root设备上运行,但为什么root设备只能用于此目的.
  3. 随着设备中的安全性的增加,执行这些任务变得越来越不可能.最新的1-09-2017所有这些文件回收bin都有最新的Android版本的负面评论.因此,证明我的观点.

    FileObserver 使用这个概念来检查文件甚至目录上的任何更改,但你不能影响它意味着你不能阻止删除它会在用户删除后通知所有内容.

    inotify.hNDK用于创建应用程序用于检查文件夹和文件上的事件,但如果提到该文件夹​​,子子文件夹将不会在此处涵盖或通知您对该文件的任何更改.此外,使用的概念inotifyFileObserver.您只能在删除文件后收到通知.inotify中使用的代码是这样的.

  1. 通过inotify_init()创建inotify实例.
  2. inotify使用inotify_add_watch()函数将要监视的所有目录添加到列表中.
  3. 要确定发生的事件,请对inotify实例执行read().此更改将被阻止,直到更改事件发生.建议使用select()调用对此inotify实例执行选择性读取.
  4. Read返回受监视目录上发生的事件列表.根据read()的返回值,我们将确切地知道发生了什么样的更改.
  5. 如果删除目录/文件上的监视,请调用inotify_rm_watch().

inotify中存在的两种方法如下:

IN_DELETE - 从监视目录中删除文件/目录

IN_DELETE_SELF - 监视文件/目录本身已被删除

两者几乎相同 FileObserver

  1. 此解决方案可能有所帮助,但仍可以帮助创建任何Dumpster类型的应用程序.可以说你需要创建自己的自己File Manager创建自己的自定义FileV2(只是一个很酷的名称文件版本2.0)类扩展File,你可以根据需要覆盖删除方法(以及所有其他方法).你可以用你自己的文件创建一个custom pop up你想要delete的文件,backing up然后dismissing弹出no.(确保用户使用此文件管理器进行删除,否则它将无法工作,因为覆盖系统文件delete()也会弄乱其他应用程序).

    class filev2 extends File {
    
    public filev2(@NonNull String pathname) {
        super(pathname);
    }
    
    public filev2(@NonNull URI uri) {
        super(uri);
    }
    
    @Override
    public boolean delete() {
     //   return super.delete();
    //Do as you want and return the boolean.
    }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

但是,如果用户使用File Manager此文件,请确保您的文件已保存.您可以设置intent-filters任务,以便您FileManager可以参与ACTION_VIEW其中.

最后但我不确定这可能registerContentObserver也可以使用.(虽然不确定)

资料来源:

Inotify.h帮助网站

registerContentObserver帮助

类似的问题

FileObserver帮助

Linux帮助已删除文件日志

我希望它有所帮助,我希望你现在可以开始你想要的东西了.