在Android应用程序中接收ADB状态事件

在Android应用程序中接收ADB状态事件,android,adb,Android,Adb,我正在使用adb push将文件传输到android设备。我可以将文件推送到SD卡,命令行会告诉我传输速率、文件大小和经过的时间,例如: C:\Users\some_guy\Pictures>adb -d push wilford.jpg /sdcard/wilford.jpg 2558 KB/s (13104 bytes in 0.005s) 我希望创建一个应用程序或服务,可以通过广播接收器订阅事件,以便在adb推送开始、结束时获得更新,并在传输过程中包括当前文件传输速率。因此,当文件

我正在使用adb push将文件传输到android设备。我可以将文件推送到SD卡,命令行会告诉我传输速率、文件大小和经过的时间,例如:

C:\Users\some_guy\Pictures>adb -d push wilford.jpg /sdcard/wilford.jpg
2558 KB/s (13104 bytes in 0.005s)
我希望创建一个应用程序或服务,可以通过广播接收器订阅事件,以便在adb推送开始、结束时获得更新,并在传输过程中包括当前文件传输速率。因此,当文件从adb写入时,它会通知我的应用程序当前的完成百分比和传输速率。这可能吗?需要哪些权限以及应用程序如何订阅更新?我已经查看了权限和其他资源的列表,但找不到一种方法来实现这一点


另一种可能是简单地监控SD卡文件系统中的传入文件,但我不确定这会给我带来什么,除了在新文件完全写入时进行监控之外。

不久前我遇到了一个非常类似的问题,我相信我用尽了所有选项,但都没有用。
adb推送过程中没有广播。但是,您可以在每次推送之前和之后使用
adb shell am broadcast…
创建自己的广播,甚至可以发送额外内容(例如文件名或传输速率)


如果您使用bash或python编写adb传输的脚本,而不是windows批处理文件,这将更容易实现--我最终使用SDK工具中包含的MonkeyRunner的jython实现,只需退出到shell中进行实际的文件推送,因为MonkeyRunner没有提供这一点。

您至少可以使用Linux内核inotify机制在目标目录上检测到新文件的创建

Android通过FileObserver类公开此功能:

在设备上的任何进程(包括此进程)访问或更改文件后,监视文件(使用inotify)以触发事件。FileObserver是一个抽象类;子类必须实现事件处理程序onEvent(int,String)

每个FileObserver实例监视单个文件或目录。如果某个目录受到监视,则会为受监视目录中的所有文件和子目录触发事件


注意,该机制不是递归的,因为监视目录只监视该目录中的实体,而不监视其子目录中的条目。这讨论了一些递归的可能性。

在adb推送过程中,是否可以进行adb shell am广播?我想提供%完成状态和传输速度,但不仅仅是在推送结束时。我相信您可以并行运行多个adb会话。我不确定这是否会在写入文件时通知您。这是修改掩码吗?此外,它也不会告诉您任何有关写入量或写入速度的信息。我不确定底层文件系统将如何处理正在进行的写入,但有可能在看到创建的目录后,您可以尝试定期监视文件大小。但请记住,ADB不是面向最终用户的工具。如果你真的想让某个应用程序参与进来,你可以通过adb转发unix域或tcp套接字,通过adb将数据发送到你的监控应用程序,并让它写入文件。使用文件浏览器应用程序,我可以看到文件在传输完成后被写入SD卡,并且随着时间的推移,文件的大小会增加。我可能需要通过定期轮询文件大小(直到文件写入完成)并除以经过的时间来人为地获得传输速度。编辑:对不起,刚刚注意到你最近的评论。是的,也许套接字会更简单,这样就不需要启用调试特权。正如您所说,它不是为最终用户设计的。不,通过ADB转发套接字仍然需要启用调试才能使ADB工作。一些依靠系绳或通过wifi的东西不会,但它们有自己的问题。