每当将文件添加到特定文件夹(例如下载文件夹)时,我都希望收到一个事件。为此,我尝试了 3 种不同的方法,但均未成功。目标设备是 Android 15+。您对这 3 种方法中的任何一种都有任何经验,并且可以提供工作样本吗?
方法 1 - FileObserver:
在后台服务中,我为顶层文件夹添加了一个递归文件观察器,如此处所述。在 Android 4/5 上它可以工作,但在 Android 6 上没有触发任何事件(已知问题)最重要的是,在 Android 4/5 上,文件观察器似乎不可靠。在某些时候会调用 stopWatching() 方法,从那时起将不会收到任何事件。
在服务的 onStartCommand(..) 中:
new MyFileObserver(Constants.DOWNLOAD_PATH, true).startWatching();
方法 2 - 内容观察者:
我尝试为我的用例调整内容观察器(如此处所述),但我从未收到任何事件。
在服务的 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 (如此处所述。但没有任何反应。
在服务的 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>