I would like to receive an event whenever a file was added to a specific folder, e.g. the download folder. To reach this I tried 3 different approaches without any success. The target devices are Android 15+. Do you have any experience with any of these 3 approaches and could help out with a working sample?
APPROACH 1 - FileObserver:
In a background service I add a recursive file observer for the top folder as described here. On Android 4/5 its working but on Android 6 no events are fired (known issue) On top of that it seems that on Android 4/5 the file observer is not reliable. At some point the stopWatching() method gets called and from then on no event will be received.
in onStartCommand(..) of the service:
new MyFileObserver(Constants.DOWNLOAD_PATH, true).startWatching();
APPROACH 2 - Content Observer:
I tried to tweak the content observer for my use case (as described here), but I never receive any events.
in onStart of the service:
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);
}
}
APPROACH 3 - BroadcastReceiver:
With a BroadcastReceiver I try to get the ON_DOWNLOAD_COMPLETE_EVENT (as described here. But nothing happens.
in on StartCommand(...) of the service:
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>
Accessing your history is the first step towards seeing if anyone has been downloading, or tampering with, your Google Drive files. However, the service does not let you see who has been accessing your files, only that they have been changed.
var filename = 'ABC. csv' it('Verify that file is downloaded',function(){ PageObject. DownloadButton. click(); browser.
Actually, right now there is no known work-around for Android 6.0 and above. In Android 4/5/5.1 the FileObserver
is working fine mostly, but for Android 6 you simply can't get any kind of response from the system when a file is added to an external directory. Knowing this FileObserver
is completely useless in Android 6.
But eventually you can detect added content in the Android system, with the Content Observer which is also working fine in Android 6. Maybe this can solve your problem until Google provides a fix.
This is how I currently use the ContenObserver:
mycontentobserver = new MyContentObserver(handler,**Your path**,this);
getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, mycontentobserver);
An than the MyContentOberserver.class I just check for last edited files in my specific path and if they are not older than 5-10 seconds I assume that this triggered the ContentObserver Event.
This is how it should work for you:
In your BackgroundService.class:
mycontentobserver = new MyContentObserver(handler,**Your download folder path**,this);
getContentResolver().registerContentObserver(MediaStore.Files.getContentUri("external"), true, mycontentobserver);
And than inside the MyContentObserver.class:
public MyContentObserver(Handler handler, String workpath, ContentModificationService workcontext) {
super(handler);
downloadfolderpath = workpath;
contentcontext = workcontext;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
if(downloadfolderpath != null) {
File file = new File(downloadfolder);
if (file.isDirectory()) {
listFile = file.listFiles();
if (listFile != null && listFile.length > 0) {
// Sort files from newest to oldest (this is not the best Method to do it, but a quick on)
Arrays.sort(listFile, new Comparator<File>() {
public int compare(File f1, File f2) {
return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
}
});
if (listFile[listFile.length - 1].lastModified() >= System.currentTimeMillis() - 5000) { //adjust the time (5000 = 5 seconds) if you want.
//Some file was added !! Yeah!
//Use the contentcontext to launch some Method in you Service
//For example:
contentcontext.SomeMethodToContinue();
}
}
}
}
}
I hope this helps, let me now If it works for you. It work's for me with the download folder on android 6.1 :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With