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

时间:2017-06-23 11:45:39

标签: android android-6.0-marshmallow fileobserver

我想创建类似应用的Dumpster,为此我想要在用户删除任何文件时发出通知,以便我可以将其保存到我的应用内存中。

我使用了文件观察器,但它在文件删除后发出通知,而在marshmallow中它也没有通知删除。 我提到this link为文件观察者。 在某处我读到它可能使用本机编程语言(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";
            }       
        }

1 个答案:

答案 0 :(得分:5)

让我们先澄清一下。

  1. 转储程序使用.trash目录,该目录可能始终存在也可能不存在。需要注意的是,Dumpster在许多设备中无法正常运行,因为可以通过谷歌评论看到它。
  2. Dumpster 使用(我从代码中仅用于教育目的),它自己的系统文件Handler使用service来检查{ {1}}事件及其文件onClick如果将onClick及其File保存到单独的文件夹(通常是隐藏的),并将其保存在{{1}那是本地的。如果它被删除,您知道文件的位置,如果不是,则从path删除该文件。嗯,这有点不值得痛苦,因为你几乎所有的时间都需要使用CPU资源来运行你的服务。它也可以在root设备上运行,但为什么root设备只能用于此目的。
  3. 随着设备安全性的提高,执行这些任务变得越来越不可能。作为 1-09-2017 的最新内容,所有 文件回收站 都对最新的Android版本进行了否定评论。因此,证明我的观点。

    database 使用该概念检查文件甚至目录的任何更改,但您不能影响它,这意味着您无法阻止删除,它会在用户删除后通知所有内容。

    hidden folder 它用于FileObserver目的,用于创建应用程序,用于检查文件夹和文件上的事件,但如果提到该文件夹​​,则子子文件夹不会本文中包含此内容或通知您文件的任何更改。此外,inotify.h中使用的概念与NDK相同。您只能在删除文件后收到通知。 inotify中使用的代码就是这样的。

  4.   
        
    1. inotify()。
    2. 创建inotify实例   
    3. 使用FileObserver()函数将要监视的所有目录添加到inotify_init列表。
    4.   
    5. 要确定发生的事件,请对inotify实例执行read()。此更改将被阻止,直到更改事件发生。它   建议对此inotify实例执行选择性读取   使用inotify()调用。
    6.   
    7. 读取返回受监视目录上发生的事件列表。根据{{​​1}}()的返回值,我们将确切地知道是什么类型的   发生了变化。
    8.   
    9. 如果要删除目录/文件上的监视,请调用inotify_add_watch()。
    10.   

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

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

    read - 已观看的文件/目录已被删除

    这两者几乎与inotify_rm_watch

    中的相同
    1. 此解决方案可能不完全有帮助,但仍可以帮助创建任何 Dumpster 类型的应用程序。 可以说你需要创建自己的IN_DELETE,你可以创建自己的自定义IN_DELETE_SELF(只是一个很酷的名称文件版本2.0)类,扩展FileObserver,你可以覆盖删除方法(以及所有其他方法)。您可以创建一个File Manager FileV2来表示您希望File该文件的文件位于是custom,而pop up弹出的文件位于否。 (确保用户使用此文件管理器进行删除,否则它将无法正常工作,因为覆盖系统文件delete()也会破坏其他应用程序。)

      delete
    2. 但请确保在用户使用backing up时保存您的文件。 您可以为任务设置dismissing,以便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. } } File Manager进入intent-filters

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

      <强>来源

      Inotify.h help website

      registerContentObserver help

      Kind of Similar Question

      FileObserver Help

      Linux Help Deleted Log for Files

      我希望它有所帮助,我希望你现在能够开始你想要的东西。