2013-12-18 28 views
0

我正在使用adb push将文件传输到Android设备。我能够将文件推到SD卡,并命令行告诉我的传输速度,文件大小,时间流逝,例如:在Android应用程序中接收ADB状态事件

C:\Users\some_guy\Pictures>adb -d push wilford.jpg /sdcard/wilford.jpg 
2558 KB/s (13104 bytes in 0.005s) 

我希望创建一个应用程序或服务,可预订通过广播接收器发送事件以获取ADB推送何时开始,完成并包括当前文件传输速率的更新。所以,当文件从adb写入时,它会通知我的应用目前它的完成率和传输率。这可能吗?需要什么权限以及应用程序如何订阅更新?我查看了权限和其他资源列表,无法找到实现此目的的方法。

另一种可能性是简单地监视传入的文件的SD卡文件系统,但我不知道是什么会给我比监测,当新文件被完全写入。

回答

1

我有一个非常类似的问题而回,我相信我用尽无济于事所有选项。作为adb push流程的一部分,没有广播。但是,您可以在每次推送前后使用adb shell am broadcast ...创建自己的广播,甚至可以发送附加内容(例如文件名或传输速率)。

如果使用bash或python来编写adb传输脚本,而不是windows批处理文件,这会更容易 - 我使用SDK工具中包含的MonkeyRunner的jython实现最终解决了这个问题,只能退出到shell做实际的文件推送,因为MonkeyRunner没有提供这个功能。

+0

虽然adb推送正在进行时,是否可以做广播adb shell?我想提供%完成和传输速度的状态,但不只是在推动结束时。 –

+0

我相信你可以并行运行多个adb会话。 –

1

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

的Android通过FileObserver类公开此功能:

监视器文件(使用inotify的)文件由任何处理的设备上访问或改变由后触发事件(包括本)。 FileObserver是一个抽象类;子类必须实现事件处理函数onEvent(int,String)。

每个FileObserver实例都监视单个文件或目录。如果监视目录,则会针对受监视目录内的所有文件和子目录触发事件。

看到http://developer.android.com/reference/android/os/FileObserver.html

注意,该机制是不是在监视目录显示器仅在该目录entires,而不是在其子目录项递推。这个question讨论了一些递归的可能性。

+0

我不确定这是否在文件正在写入时通知您。这是修改掩码吗?此外,它不会给你任何关于写入量或写入速度的任何信息。 –

+0

我并不十分确定底层文件系统如何处理正在进行的写入操作,但有可能一旦看到创建的目录,就可以尝试定期监视文件大小。请记住,亚行不是面向最终用户的工具。如果你真的想涉及一个应用程序,你可以通过adb转发一个unix域或tcp套接字,通过它将数据发送到你的监控应用程序,并让它写入文件。 –

+0

使用文件浏览器应用程序,我可以看到该文件被写入到SD卡中,传输完成,并且随着时间的推移它会变大。我可能不得不人为地通过轮询文件大小(直到文件写入完成)并除以已用时间来获得传输速度。编辑:对不起,刚刚注意到你最近的评论。是的,也许一个套接字会更简单,这将消除启用调试priv的需要。正如你所说,它不适用于最终用户。 –