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