接收事件,如果文件已下载/添加到下载文件夹

2023-12-25

每当文件添加到特定文件夹时,我希望收到一个事件,例如下载文件夹。为了达到这个目的,我尝试了 3 种不同的方法,但没有成功。目标设备为 Android 15+。您对这 3 种方法有任何经验吗?可以帮助制作工作示例吗?

方法 1 - FileObserver:

在后台服务中,我为顶部文件夹添加了一个递归文件观察器,如下所述here https://github.com/owncloud/android/blob/master/src/com/owncloud/android/utils/RecursiveFileObserver.java。在 Android 4/5 上它可以工作,但在 Android 6 上不会触发任何事件(已知问题) https://code.google.com/p/android/issues/detail?id=189231最重要的是,在 Android 4/5 上,文件观察器似乎不可靠。在某个时刻,stopWatching() 方法被调用,从那时起,将不会收到任何事件。

在服务的 onStartCommand(..) 中:

    new MyFileObserver(Constants.DOWNLOAD_PATH, true).startWatching();

方法 2 - 内容观察者:

我尝试根据我的用例调整内容观察器(如所述here https://stackoverflow.com/questions/20891705/contentobserver-per-row-implementation),但我从未收到任何事件。

在服务的 onStart 中:

 getContentResolver().registerContentObserver( Uri.parse("content://download/"), true,
            new MyObserver(myHandler));

.

public class MyObserver extends ContentObserver {
  // left blank below constructor for this Contact observer example to work
  // or if you want to make this work using Handler then change below registering  //line
  public MyObserver(Handler handler) {
    super(handler);
  }

  @Override
  public void onChange(boolean selfChange) {
    this.onChange(selfChange, null);
    Log.e("", "~~~~~~ on change" + selfChange);
    // Override this method to listen to any changes
  }

  @Override
  public void onChange(boolean selfChange, Uri uri) {
    // depending on the handler you might be on the UI
    // thread, so be cautious!
    Log.e("", "~~~~~~ on change uri" + selfChange);
  }
}

方法 3 - 广播接收器:

使用 BroadcastReceiver 我尝试获取 ON_DOWNLOAD_COMPLETE_EVENT (如所述here https://stackoverflow.com/questions/18789246/broadcastreceiver-not-receiving-download-complete-action。但什么也没发生。

在服务的 StartCommand(...) 中:

 registerReceiver(new DownloadListenerService(), new IntentFilter(
            DownloadManager.ACTION_DOWNLOAD_COMPLETE));

下载监听器服务:

public class DownloadListenerService extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, Intent intent) {
        System.out.println("got here");
        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = settings.edit();

        String action = intent.getAction();
        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
            String downloadPath = intent.getStringExtra(DownloadManager.COLUMN_URI);
            editor.putString("downloadPath", downloadPath);
            editor.commit();
        }
    }
}

显现:

  <receiver
            android:name=".DownloadListenerService"
            android:icon="@mipmap/ic_launcher"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
            </intent-filter>
        </receiver>

实际上,目前 Android 6.0 及更高版本还没有已知的解决方法。在Android 4/5/5.1中FileObserver大多数情况下工作正常,但对于 Android 6,当文件添加到外部目录时,您根本无法从系统获得任何类型的响应。知道这一点FileObserver在Android 6中完全没用。

但最终你可以使用 Content Observer 来检测 Android 系统中添加的内容,该内容在 Android 6 中也运行良好。也许这可以解决你的问题,直到 Google 提供修复程序。

这就是我目前使用 ContenObserver 的方式:

mycontentobserver = new MyContentObserver(handler,**Your path**,this);
getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, mycontentobserver);

比 MyContentOberserver.class 我只是检查我的文件中最后编辑的文件具体路径如果它们不超过 5-10 秒,我认为这会触发 ContentObserver 事件。

更新编辑:

这对你来说应该是这样的:

In your 后台服务类:

mycontentobserver = new MyContentObserver(handler,**Your download folder path**,this);
getContentResolver().registerContentObserver(MediaStore.Files.getContentUri("external"), true, mycontentobserver);

而比里面内容观察者类:

public MyContentObserver(Handler handler, String workpath,  ContentModificationService workcontext) {
    super(handler);
    downloadfolderpath = workpath;
    contentcontext = workcontext;
}

@Override
public void onChange(boolean selfChange, Uri uri) {

   if(downloadfolderpath != null) {
      File file = new File(downloadfolder);
      if (file.isDirectory()) {
         listFile = file.listFiles();
         if (listFile != null && listFile.length > 0) {
            
            // Sort files from newest to oldest (this is not the best Method to do it, but a quick on)
            Arrays.sort(listFile, new Comparator<File>() {
               public int compare(File f1, File f2) {
               return      Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
               }
            });

            if (listFile[listFile.length - 1].lastModified() >= System.currentTimeMillis() - 5000) { //adjust the time (5000 = 5 seconds) if you want.

               //Some file was added !! Yeah!
               //Use the contentcontext to launch some Method in you Service
               //For example:
               contentcontext.SomeMethodToContinue();
            }
         }
      }
   }
}

我希望这对您有帮助,如果它对您有用,请立即告诉我。它适用于我的 Android 6.1 上的下载文件夹:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

接收事件,如果文件已下载/添加到下载文件夹 的相关文章

随机推荐

  • ASP.Net / C# - 缺少程序集引用

    Hi I am a newbie in C and visual studio As Figure1 shown I am trying to use the classes from other project in similar so
  • MIPS 中基于指针的数组访问

    MIPS 中基于指针的数组访问是什么意思 基于指针的数组访问 还有一个额外的可能含义或含义 您可能有一个指向数组的指针 而不是位于固定地址的数组 实际上 在 C C 中 指向数组的指针 实际上通常只是指向数组第一个元素的指针 基本上 您有一
  • 使用工厂方法理解 JDBC 等服务提供者框架背后的概念

    From Item 1 考虑静态工厂方法而不是构造函数 静态工厂方法返回的对象的类甚至不需要存在 在编写包含该方法的类时 这样灵活的静态工厂 方法构成了服务提供者框架的基础 例如 Java 数据库 连接 API JDBC 服务提供者框架是一
  • 在vba中将多个消息框值添加到单个消息框

    我有这段代码 我可以在每个外循环结束时显示消息 我想在假设数组或某种列表之类的结构中捕获所有这些消息 然后最后想将这些消息中的每一条显示到一个消息框中 如果有人能帮助我 我将不胜感激 谢谢 For Each objNavFolder In
  • “多个方法名为......”的问题

    我有一个问题 我想在我的项目中实现 UAModalpanelview 起初它工作得很好 我实现了这些文件 无论如何 但现在我想运行该应用程序 但每次都会出现此错误 正是因为 中心 它向我显示 发现多个名为中心的方法 其结果 参数类型或属性不
  • ArgumentOutOfRangeException:索引超出范围

    每当我使用时 我都会收到这个奇怪的 ArgumentOutOfRangeException PersitenceSpecification 类用于验证具有 对值对象的引用 public class CatalogItem DomainEnt
  • UIWebView 捕获帖子

    我正在寻找一个需要在 iPad 上显示 UIWebView 的项目的起点 问题是 HTML 将由 pad 生成并显示在 UIWebView 中 并且将包含许多输入控件 需要的是一种在用户完成输入后获取这些控件的内容的方法 类似于我在服务器上
  • Apptimize \ Optimizely 如何在 iOS 上工作?

    我试图弄清楚一些关于 幕后 实现的一些事情 用于直接从 Apptimize 或 Optimizely 上的 Web 控制台动态操作 UI 元素 更具体地说 我想了解以下内容 1 客户端代码 iOS 如何将视图层次结构发送到 Web 服务器
  • 使用 Firebase 时使用未解析的标识符“FIRDatabase”

    Xcode 告诉我FIRDatabase不是标识符 我的代码 import UIKit import Firebase UIApplicationMain class AppDelegate UIResponder UIApplicatio
  • 为什么tintColor 在 iOS7 上的导航栏或工具栏上不起作用

    在iPad的iOS7上 首先 我设置了一个模态视图控制器 大小为320 460 然后 在这个模态视图控制器中 我呈现了另一个导航视图控制器 在此之后 导航栏和工具栏的色调颜色呈现的导航控制器变成灰色 我尝试设置导航栏和工具栏的色调颜色 但它
  • 什么是 C++ 上下文中的单态化?

    戴夫 赫尔曼最近的演讲 http www infoq com presentations RustRust 说他们从 C 借用了这个属性 我找不到与该主题相关的任何内容 有人可以解释一下单态化是什么意思吗 单态化意味着生成通用函数的专门版本
  • 在Android中设置ListView的“空白”区域的颜色

    当我的列表视图未完全充满列表视图项目时 例如 我的列表视图足够高 可容纳 8 个项目 但我只有 2 个 空白区域在我的 Droid X 上显示为灰色 在模拟器中 空白区域显示变成黑色 如何将 空白 区域设置为透明 我尝试过设置背景颜色 缓存
  • Python 中的替代构造函数

    我正在处理图表并编写了一个 mixin 模块来创建图表 我想在其中有一些替代的构造函数 这就是我所拥有的 class Graph GraphDegree GraphDegreePlot GraphGeneration object def
  • 按照设计,属性 getter 是否应该在 python 中抛出异常?

    对于问题的某些上下文 我使用延迟加载来推迟类中某些属性的完全初始化 直到需要它们时 如果有的话 因为它们的计算成本可能很高 我的问题是 在 python 中 如果在计算属性值时发生错误 或者无法计算该值 那么引发异常是可以接受的还是客观上是
  • 选择单选按钮时如何清除文本字段内的文本

    目前我有这个单选按钮 电子学 电脑 Others 我想做的是 如果单选按钮Others被选中后 我想显示一个输入文本字段并让用户输入 我想做的是 当我选择Others并在输入字段中输入一些内容 然后当我选择返回时Eletronics or
  • 如何设置和运行适用于 PHP 的 Tesseract OCR(开源)?

    我已经根据GitHUb上提供的文档通过MacPorts安装了Tesseract OCR 并且安装成功 并且 但是 我正在尝试使用 Tesseract OCR for PHP https github com thiagoalessio te
  • python 解码 fernet 密钥

    我生成了一些 fernet 密钥并以 str 格式存储以供参考 现在 我需要将这些 str 格式的 fernet 密钥编码为 32 个 url 安全的 base64 编码字节来解密我的数据 from cryptography fernet
  • 在数据框的整个列中应用正则表达式

    我有一个包含 3 列的数据框 id name team 101 kevin marketing 102 scott admin n 103 peter finance n 我正在尝试应用正则表达式函数 以便删除不必要的空格 我已经得到了删除
  • glReadPixels 只保存 1/4 屏幕尺寸的快照

    我正在为客户开发增强现实应用程序 OpenGL 和 EAGL 部分已在 Unity 3D 中完成 并在我的应用程序中实现为视图 我现在需要的是一个按钮 用于捕捉 OpenGL 内容的屏幕截图 这是最后面的视图 我尝试自己编写它 但是当我单击
  • 接收事件,如果文件已下载/添加到下载文件夹

    每当文件添加到特定文件夹时 我希望收到一个事件 例如下载文件夹 为了达到这个目的 我尝试了 3 种不同的方法 但没有成功 目标设备为 Android 15 您对这 3 种方法有任何经验吗 可以帮助制作工作示例吗 方法 1 FileObser