Search code examples
androidmediaandroid-contentresolverandroid-mediascanner

Android : Get recently added media in Android Device similarly to File Manager


I am working on an application in which I have to notify user as soon as a new image, video, audio or apk is inserted by the user by any means (whether he downloads it or transfer it),similar to what File Manager application do.I don't know where to start from. Thanks


Solution

  • Here is my complete code to notify user when a new media (image, audio or video) is added into the device. It might help someone.Also, I am displaying push notifications as soon as new media is added.

    EDITED (issues resolved are below)
    1.Notify user only when media is added,not deleted.

        public class MediaTrackerService extends Service {
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            // images
            getContentResolver().registerContentObserver(
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    true, new ContentObserver(new Handler()) {
                        @Override
                        public void onChange(boolean selfChange) {
                            super.onChange(selfChange);
    
                            Media media = readFromMediaStore(
                                    getApplicationContext(),
                                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    
                            File file = new File(media.file.getPath());
                            Date fileData = new Date(file.lastModified());
    
                            if (System.currentTimeMillis() - fileData.getTime() > 3000) {
    
                            } else {
    
                                if (!media.file.getPath().contains("WhatsApp")) {
                                    String saved = media.file.getName();
    
                                    // deduce bitmap before using
                                    Bitmap bitmap = BitmapFactory
                                            .decodeFile(media.file.getPath());
    
                                    Intent intent = new Intent();
                                    intent.setDataAndType(Uri.fromFile(media.file),
                                            "image/*");
                                    PendingIntent pendingIntent = PendingIntent
                                            .getActivity(getApplicationContext(),
                                                    0, intent, 0);
    
                                    Notification n = new Notification.Builder(
                                            getApplicationContext())
                                            .setStyle(
                                                    new Notification.BigPictureStyle()
                                                            .bigPicture(bitmap))
                                            .setContentTitle(
                                                    "New Image File For You")
                                            .setContentText("File Name :" + saved)
                                            .setSmallIcon(R.drawable.alert_icon_1)
                                            .setContentIntent(pendingIntent)
                                            .setAutoCancel(true).build();
    
                                    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
                                    notificationManager.notify(0, n);
                                }
                            }
                        }
    
                        @Override
                        public void onChange(boolean selfChange, Uri uri) {
                            super.onChange(selfChange, uri);
                        }
                    });
            // audio
            getContentResolver().registerContentObserver(
                    android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                    true, new ContentObserver(new Handler()) {
                        @Override
                        public void onChange(boolean selfChange) {
                            super.onChange(selfChange);
                            Media media = readFromMediaStore(
                                    getApplicationContext(),
                                    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
    
                            File file = new File(media.file.getPath());
                            Date fileData = new Date(file.lastModified());
    
                            if (System.currentTimeMillis() - fileData.getTime() > 3000) {
    
                            } else {
    
                                if (!media.file.getPath().contains("WhatsApp")) {
    
                                    String saved = media.file.getName();
    
                                    Bitmap bitmap = BitmapFactory
                                            .decodeFile(media.file.getPath());
    
                                    Intent intent = new Intent();
                                    intent.setDataAndType(Uri.fromFile(media.file),
                                            "audio/*");
                                    PendingIntent pendingIntent = PendingIntent
                                            .getActivity(getApplicationContext(),
                                                    0, intent, 0);
    
                                    Notification n = new Notification.Builder(
                                            getApplicationContext())
                                            .setStyle(
                                                    new Notification.BigPictureStyle()
                                                            .bigPicture(null))
                                            .setContentTitle(
                                                    "New audio File For You")
                                            .setContentText("File Name :" + saved)
                                            .setSmallIcon(R.drawable.alert_icon_1)
                                            .setContentIntent(pendingIntent)
                                            .setAutoCancel(true).build();
    
                                    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
                                    notificationManager.notify(0, n);
                                }
                            }
                        }
    
                        @Override
                        public void onChange(boolean selfChange, Uri uri) {
                            super.onChange(selfChange, uri);
                        }
                    });
            // video
            getContentResolver().registerContentObserver(
                    android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                    true, new ContentObserver(new Handler()) {
                        @Override
                        public void onChange(boolean selfChange) {
                            super.onChange(selfChange);
                            Media media = readFromMediaStore(
                                    getApplicationContext(),
                                    MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
    
                            File file = new File(media.file.getPath());
                            Date fileData = new Date(file.lastModified());
    
                            if (System.currentTimeMillis() - fileData.getTime() > 3000) {
    
                            } else {
                                if (!media.file.getPath().contains("WhatsApp")) {
    
                                    String saved = media.file.getName();
    
                                    Intent intent = new Intent();
                                    intent.setDataAndType(Uri.fromFile(media.file),
                                            "video/*");
                                    PendingIntent pendingIntent = PendingIntent
                                            .getActivity(getApplicationContext(),
                                                    0, intent, 0);
    
                                    Notification n = new Notification.Builder(
                                            getApplicationContext())
                                            .setStyle(
                                                    new Notification.BigPictureStyle()
                                                            .bigPicture(null))
                                            .setContentTitle(
                                                    "New Video File For You")
                                            .setContentText("File Name :" + saved)
                                            .setSmallIcon(R.drawable.alert_icon_1)
                                            .setContentIntent(pendingIntent)
                                            .setAutoCancel(true).build();
    
                                    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
                                    notificationManager.notify(0, n);
                                }
                            }
                        }
    
                        @Override
                        public void onChange(boolean selfChange, Uri uri) {
                            super.onChange(selfChange, uri);
                            System.out
                                    .println("here is the service change EXTERNAL 1 params"
                                            + " " + uri);
                        }
                    });
            return START_STICKY;
        }
    
        private Long readLastDateFromMediaStore(Context context, Uri uri) {
            Cursor cursor = context.getContentResolver().query(uri, null, null,
                    null, "date_added DESC");
            Long dateAdded = (long) -1;
            if (cursor.moveToNext()) {
                dateAdded = cursor.getLong(cursor
                        .getColumnIndexOrThrow(MediaColumns.DATE_ADDED));
            }
            cursor.close();
            return dateAdded;
        }
    
        private Media readFromMediaStore(Context context, Uri uri) {
            Cursor cursor = context.getContentResolver().query(uri, null, null,
                    null, "date_added DESC");
            Media media = null;
            if (cursor.moveToNext()) {
                int dataColumn = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
                String filePath = cursor.getString(dataColumn);
                int mimeTypeColumn = cursor
                        .getColumnIndexOrThrow(MediaColumns.MIME_TYPE);
                String mimeType = cursor.getString(mimeTypeColumn);
                media = new Media(new File(filePath), mimeType);
            }
            cursor.close();
            return media;
        }
    
        private class Media {
            private File file;
    
            private String type;
    
            public Media(File file, String type) {
                this.file = file;
                this.type = type;
            }
    
            public String getType() {
                return type;
            }
    
            public File getFile() {
                return file;
            }
        }
    }
    

    and don't forget to unregister your observer onDestroy().

    getContentResolver().unregisterContentObserver(yourObserverObject);