Android:与文件管理器类似,最近在Android设备中添加了媒体

时间:2016-10-13 15:49:32

标签: android media android-contentresolver android-mediascanner

我正在开发一个应用程序,我必须在用户以任何方式插入新图像,视频,音频或apk时通知用户(无论是下载还是传输),类似于文件经理申请。我不知道从哪里开始。感谢

2 个答案:

答案 0 :(得分:3)

以下是我的完整代码,用于在将新图像,音频或视频添加到设备时通知用户。它可能会对某人有所帮助。另外,我会在添加新媒体后立即显示推送通知。

已编辑(已解决的问题如下)
1.仅在添加媒体而不删除媒体时通知用户。

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;
    }
}

}

并且不要忘记取消注册观察者onDestroy()。

getContentResolver().unregisterContentObserver(yourObserverObject);

答案 1 :(得分:0)

一般情况下这是不可能的。您的应用无权监视其他应用的行为。如果用户通过我的应用程序将某些内容下载到我应用的internal storage部分,则无法访问该内容(除非我选择将其设为可用),并且您无法确定内容是否已添加。

除此之外,在API Level 24(Android 7.0)之前,除了尝试让进程一直运行之外,没有办法实现此目的。就系统RAM消耗等而言,这对用户不利。当应用程序试图让流程一直运行时,一些用户会非常恼火,他们可能会以应用商店评级的形式以创造性的方式表达他们的愤怒。

所有这些,对于可公开访问的内容(主要是external storage),最简单的解决方案是设置ContentObserver来监控MediaStore ContentProvider。在Android 7.0及更高版本中,您可以使用JobScheduler执行相同的操作,但不需要保持流程正常运行以保持ContentObserver观察。