Я хотел бы получать событие, когда файл был добавлен в определенную папку, например, в папку для загрузки. Чтобы достичь этого, я пробовал 3 разных подхода без каких-либо успехов. Целевыми устройствами являются Android 15+. Есть ли у вас какой-либо опыт в отношении одного из этих трех подходов и может помочь в работе с образцом?
ПОДХОД 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:
С BroadcastReceiver я пытаюсь получить ON_DOWNLOAD_COMPLETE_EVENT (как описано здесь. Но ничего не происходит.
в функции StartCommand (...) службы:
registerReceiver(new DownloadListenerService(), new IntentFilter(
DownloadManager.ACTION_DOWNLOAD_COMPLETE));
DownloadListenerService:
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();
}
}
}
Manifest:
<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>