Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android FileObserver回调赢得';t触发器(详细介绍了stackoverflow的相关主题)_Android_Fileobserver - Fatal编程技术网

Android FileObserver回调赢得';t触发器(详细介绍了stackoverflow的相关主题)

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

我试图监听外部存储目录中的任何事件,即通过Android FileObserver添加、删除或修改的文件,但其OneEvent方法从未被调用

我尝试了以下所有解决方案:

至于我的代码,如下所示:

显示

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