我有一个应用程序,用于观察外部存储上的公共目录FileObserver
.它在Lollipop
设备上运行良好.我想添加支持Marshmallow
,所以我用它设置了一个Nexus 9平板电脑.
在Marshmallow设备上,它失败了,在Lollipop设备上它没关系.在Marshmallow设备上,FileObserver
它不会对由其他进程引起的文件系统事件做出反应.例如,截取屏幕截图,通过adb
shell 创建文件.如果文件是由我的应用程序创建的,它可以正常工作.
在Marshmallow
,我要求WRITE_EXTERNAL_STORAGE
和READ_EXTERNAL_STORAGE
权限Manifest.xml
.
当我用API 23编译时,我也确保我打电话ActivityCompat.requestPermissions()
.
当我用API 22编译时,我只是依靠Manifest.xml
.
如果我观察它的话,它会起作用/data/data/my-package-name
.
如果我观察到它,它就会失败/storage/emulated/0/Pictures/Screenshots
.
是否有人测试FileObserver
了以下所有内容?:
Marshmallow
设备adb
或截屏).每当文件被添加到特定文件夹(例如下载文件夹)时,我都希望收到一个事件.为了达到这个目的,我尝试了3种不同的方法但没有成 目标设备是Android 15+.您是否对这3种方法中的任何一种方法有任何经验并且可以帮助提供工作样本?
方法1 - FileObserver:
在后台服务我添加了一个递归文件观察员顶层文件夹描述这里.在Android 4/5上它的工作但在Android 6上没有事件被触发(已知问题)最重要的是,在Android 4/5上,文件观察者似乎不可靠.在某些时候,会调用stopWatching()方法,从那时起不会收到任何事件.
在onStartCommand(..)的服务:
new MyFileObserver(Constants.DOWNLOAD_PATH, true).startWatching();
Run Code Online (Sandbox Code Playgroud)
方法2 - 内容观察员:
我试图调整内容观察员我的使用情况(如描述在这里),但我从来没有收到任何事件.
在onStart服务:
getContentResolver().registerContentObserver( Uri.parse("content://download/"), true,
new MyObserver(myHandler));
Run Code Online (Sandbox Code Playgroud)
.
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("", …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个Android应用程序,我必须检测Android SD卡中音频文件的变化,文件名,文件路径和执行的操作.例如,如果我在SD卡中添加文件,那么我想知道
以前我已经尝试过文件观察器但是为此我必须在每个目录上应用它.所以我搜索了一些其他解决方案,并获得了有关Audio.Media.EXTERNAL_CONTENT_URI的信息.然后我创建了一个像这样的内容观察者
UriObserver.java - 一个内容观察者
class UriObserver extends ContentObserver {
public UriObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
Log.d("INSTANT", "GETTING CHANGES");
}
}
Run Code Online (Sandbox Code Playgroud)
这是注册的代码
UriObserver observer = new UriObserver(new Handler());
Log.d("INSTANT", "registered content observer");
this.getApplicationContext()
.getContentResolver()
.registerContentObserver(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false,
observer);
Log.d("INSTANT", "registered content observer");
Run Code Online (Sandbox Code Playgroud)
它让我知道在与音频文件相关的SD卡中发生了一些变化.但它没有提供有关添加,编辑或删除哪个文件的任何信息.
然后我搜索了解决方案并得到了这篇文章
Android:如何通过MTP连接时检测MediaStore中的更改
在这篇文章中,Bhiefer给出了一些代码作为答案,我认为它可以起作用,所以我试图实现它,但我无法这样做.
我能为此做些什么?
我可以查询Audio.Media.EXTERNAL_CONTENT_URI的最新更改吗?这段代码:
mCursor = context.getContentResolver().query(
Audio.Media.EXTERNAL_CONTENT_URI, …
Run Code Online (Sandbox Code Playgroud) android android-sdcard android-mediascanner contentobserver fileobserver
根据文件,
"Each FileObserver instance monitors a single file or directory. If a directory is monitored,
events will be triggered for all files and subdirectories inside the monitored directory."
Run Code Online (Sandbox Code Playgroud)
我的代码就像,
FileObserver fobsv = new FileObserver("/mnt/sdcard/") {
@Override
public void onEvent(int event, String path) {
System.out.println(event+" "+path);
}
};
fobsv.startWatching();
Run Code Online (Sandbox Code Playgroud)
但是,onEvent()
只有在/ mnt/sdcard /中更改文件时才会触发.如果我在/ mnt/sdcard/downloads /中创建一个文件,则该方法不会被触发.
代码有问题吗?
我有问题,FIleObserver和ContentObserver都无法在Android Marshmallow中运行.我正在使用这个东西来检测文件夹内发生的变化.我为marshmallow设置了运行时权限.但在那之后它也没有显示任何事件.它在其他版本中完美运行.请帮我解决这个问题.
首先,我尝试在Service中使用Content Resolver来检测后台文件夹的更改.
public class TestService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
initial();
return START_STICKY;
}
public void initial(){
getContentResolver().registerContentObserver(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
true,
new ContentObserver(new Handler()) {
@Override
public boolean deliverSelfNotifications() {
Log.d("hai", "deliverSelfNotifications");
return super.deliverSelfNotifications();
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
if (uri.toString().matches(MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString() + "/[0-9]+")) {
Cursor cursor = null; …
Run Code Online (Sandbox Code Playgroud) android contentobserver fileobserver android-permissions android-6.0-marshmallow
我已经为一个目录注册了一个FileObserver.
this.observer = new DirectoryObserver(requested.getAbsolutePath(),
FileObserver.CREATE | FileObserver.DELETE | FileObserver.DELETE_SELF);
this.observer.startWatching();
Run Code Online (Sandbox Code Playgroud)
在KitKat模拟器上测试.adb shell:
root@generic:/sdcard # echo "test" >> test.txt //notified CREATE
root@generic:/sdcard # rm test.txt //notified DELETE
root@generic:/sdcard # mkdir test //no events received
root@generic:/sdcard # rmdir test //no events received
Run Code Online (Sandbox Code Playgroud)
DirectoryObserver供参考
private final class DirectoryObserver extends FileObserver {
private DirectoryObserver(String path, int mask) {
super(path, mask);
}
@Override
public void onEvent(int event, String pathString) {
switch (event) {
case FileObserver.DELETE_SELF:
//do stuff
break;
case FileObserver.CREATE:
case FileObserver.DELETE:
//do stuff …
Run Code Online (Sandbox Code Playgroud) 我想像app一样创建Dumpster,为此我想要在用户删除任何文件时通知我以便将其保存到我的应用程序内存中.
我使用了File Observer,但它在删除文件后发出通知,而在marshmallow中它也没有通知删除.我把这个链接称为文件观察者.在某处我读到它可能使用本机编程语言(C),但无法获得任何解决方案.我怎样才能做到这一点?提前致谢.
我试过这个:
@Override
public void onEvent(int event, String path) {
if (path == null) {
return;
}
//the monitored file or directory was deleted, monitoring effectively stops
if ((FileObserver.DELETE_SELF & event)!=0) {
FileAccessLogStatic.accessLogMsg += absolutePath + "/" + " is deleted\n";
}
}
Run Code Online (Sandbox Code Playgroud) 我需要收听来自任何来源的新图像,例如下载图像,捕获新图像,其他应用程序下载图像等等.是否有任何监听器会在新图片添加到图库时触发事件?我一直在寻找两天.我无法得到任何可靠的东西.
我读到了 FileObserver
,这会有帮助吗?
android android-contentresolver android-gallery android-mediascanner fileobserver
我有一个 FileObserver 观察外部存储中文件夹上的 ALL_EVENTS (用于测试目的)。
FileObserver 将触发源自平板电脑的任何事件。例如,如果我的应用程序或平板电脑上的另一个应用程序在此文件夹中创建了一个文件,则它可以正常工作。
但是,在较新的 Marshmallow 系统上,使用 MTP 复制文件时不会触发任何内容。如果我用 shell 复制文件也是如此。一切都可以在我们之前的 Lollipop 系统上运行。
知道为什么会发生这种情况吗?
android.os.FileObserver
需要一个java.io.File
功能。但是在 Android 10 中,谷歌限制了对著名的“存储访问框架”的访问,但您的应用程序私有目录除外。由于通过java.io.File
中断和渲染访问任何内容FileObserver
useless unless you intend to use it in your apps private directory. However I want to get noticed when something is changed in a certain directory on external storage. I would also like to avoid periodically checking for changes.
我尝试使用ContentResolver.registerContentObserver(uri,notifyForDescendants,observer)
该方法并遇到了一些问题:
Uri
到目前为止我插入的每一个都被接受了Uri
不工作Uri
真正有效我所做的唯一工作是以下方法:
// works, but returns all changes to the external storage
contentResolver.registerContentObserver(MediaStore.Files.getContentUri("external"), true, contentObserver)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这包括所有外部存储,并且仅Uri
在发生更改时返回 Media 。content://media/external/file/67226 …