每当文件添加到特定文件夹时,我希望收到一个事件,例如下载文件夹。为了达到这个目的,我尝试了 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>