【发布时间】:2016-07-23 20:54:29
【问题描述】:
我希望在将文件添加到特定文件夹时收到一个事件,例如下载文件夹。为此,我尝试了 3 种不同的方法,但均未成功。目标设备是 Android 15+。您对这 3 种方法中的任何一种都有任何经验,并且可以提供一个工作示例吗?
方法 1 - FileObserver:
在后台服务中,我为顶层文件夹添加了一个递归文件观察器,如here 所述。在 Android 4/5 上它可以工作,但在 Android 6 上没有事件被触发(known issue) 最重要的是,在 Android 4/5 上,文件观察器似乎不可靠。在某些时候,stopWatching() 方法被调用并从那么就不会收到任何事件。
在服务的 onStartCommand(..) 中:
new MyFileObserver(Constants.DOWNLOAD_PATH, true).startWatching();
方法 2 - 内容观察者:
我尝试为我的用例调整内容观察器(如 here 所述),但我从未收到任何事件。
在服务的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 所述。但没有任何反应。
在服务的 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>
【问题讨论】:
-
这个docs.oracle.com/javase/tutorial/essential/io/notification.html 怎么样?它是一个java/linux 解决方案。在幕后,这就是你正在使用的东西
-
根据code.google.com/p/android/issues/detail?id=189231#c17 已经解决了这个bug。但是当前的 Android 版本没有解决方法:(
标签: android download fileobserver