Android FileObserver回调赢得';t触发器(详细介绍了stackoverflow的相关主题)
我试图监听外部存储目录中的任何事件,即通过Android FileObserver添加、删除或修改的文件,但其OneEvent方法从未被调用 我尝试了以下所有解决方案: 至于我的代码,如下所示: 显示Android FileObserver回调赢得';t触发器(详细介绍了stackoverflow的相关主题),android,fileobserver,Android,Fileobserver,我试图监听外部存储目录中的任何事件,即通过Android FileObserver添加、删除或修改的文件,但其OneEvent方法从未被调用 我尝试了以下所有解决方案: 至于我的代码,如下所示: 显示 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.grapgame
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.grapgame.fileobserverdemo">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:name=".AppClass"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".FileObserverService" />
</application>
</manifest>
AppClass.java
public class AppClass extends Application {
public static FileObserver fileObserver;
@Override
public void onCreate() {
super.onCreate();
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, FileObserverService.class);
startService(intent);
}
}
我也在没有AppClass.java的情况下尝试过,我在Stackoverflow上找到了这个解决方案,并尝试了。我也尝试过这个代码,但似乎没有任何效果
我知道FileObserver不是递归的,因为现在我只是尝试侦听一个目录
非常感谢您的帮助。请使用RecursiveFileObserver下面的类
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import android.os.FileObserver;
import android.util.Log;
public class RecursiveFileObserver extends FileObserver {
/**
* Only modification events
*/
public static int CHANGES_ONLY = CREATE | DELETE | CLOSE_WRITE | MOVE_SELF | MOVED_FROM | MOVED_TO;
List<SingleFileObserver> mObservers;
String mPath;
int mMask;
public RecursiveFileObserver(String path) {
this(path, ALL_EVENTS);
}
public RecursiveFileObserver(String path, int mask) {
super(path, mask);
mPath = path;
mMask = mask;
}
@Override
public void startWatching() {
if (mObservers != null) return;
mObservers = new ArrayList<SingleFileObserver>();
Stack<String> stack = new Stack<String>();
stack.push(mPath);
while (!stack.isEmpty()) {
String parent = stack.pop();
mObservers.add(new SingleFileObserver(parent, mMask));
File path = new File(parent);
File[] files = path.listFiles();
if (null == files) continue;
for (File f : files) {
if (f.isDirectory() && !f.getName().equals(".") && !f.getName().equals("..")) {
stack.push(f.getPath());
}
}
}
for (SingleFileObserver sfo : mObservers) {
sfo.startWatching();
}
}
@Override
public void stopWatching() {
if (mObservers == null) return;
for (SingleFileObserver sfo : mObservers) {
sfo.stopWatching();
}
mObservers.clear();
mObservers = null;
}
@Override
public void onEvent(int event, String path) {
switch (event) {
case FileObserver.CREATE:
Log.i("RecursiveFileObserver", "CREATE: " + path);
break;
case FileObserver.MODIFY:
Log.i("RecursiveFileObserver", "MODIFY: " + path);
break;
}
}
/**
* Monitor single directory and dispatch all events to its parent, with full path.
*
* @author uestc.Mobius <mobius@toraleap.com>
* @version 2011.0121
*/
class SingleFileObserver extends FileObserver {
String mPath;
public SingleFileObserver(String path) {
this(path, ALL_EVENTS);
mPath = path;
}
public SingleFileObserver(String path, int mask) {
super(path, mask);
mPath = path;
}
@Override
public void onEvent(int event, String path) {
String newPath = mPath + "/" + path;
RecursiveFileObserver.this.onEvent(event, newPath);
}
}
}
像这样的班级
public class AppClass extends Application {
public static RecursiveFileObserver fileObserver;
@Override
public void onCreate() {
super.onCreate();
Intent intent = new Intent(this, FileObserverService.class);
startService(intent);
}
}
从代码中的注释来看,您似乎认为
Environment.getExternalStorageDirectory()
是SDCard目录,而实际上该目录是内部设备存储。外部与应用程序相关,因此“应用程序外部”。另外,FileObserver不是递归的,所以您只监视一个目录。@gotias谢谢您的评论,我知道外部存储不是SD卡,我现在只想监听一个目录。我还更新了我的问题,以避免进一步的误解。
import android.app.Service;
import android.content.Intent;
import android.os.Environment;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import java.io.File;
public class FileObserverService extends Service {
public static final String TAG = "FileObserverService";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand: Service Started");
File sdCard = Environment.getExternalStorageDirectory();
AppClass.fileObserver = new RecursiveFileObserver(sdCard.getAbsolutePath());
AppClass.fileObserver.startWatching();
return START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy: Service Destroyed");
}
}
public class AppClass extends Application {
public static RecursiveFileObserver fileObserver;
@Override
public void onCreate() {
super.onCreate();
Intent intent = new Intent(this, FileObserverService.class);
startService(intent);
}
}