【发布时间】:2018-04-17 10:24:59
【问题描述】:
我正在尝试监听外部存储目录中的任何事件,即通过 Android FileObserver 添加、删除或修改文件,但它的 onEvent 方法从未被调用。
我已经尝试了以下所有解决方案:
Android FileObserver [duplicate]
FileObserver instance is being garbage collected
How do you implement a FileObserver from an Android Service
至于我的代码,如下所示:
清单
<?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>
服务
public class FileObserverService extends Service {
public static final String TAG = "FileObserverService";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStart");
final String pathToWatch = android.os.Environment.getExternalStorageDirectory().toString();
Toast.makeText(this, "My Service Started and trying to watch " + pathToWatch, Toast.LENGTH_LONG).show();
AppClass.fileObserver = new FileObserver(pathToWatch) { // set up a file observer to watch this directory on sd card
@Override
public void onEvent(int event, String file) {
Log.d(TAG, "File created [" + pathToWatch + file + "]");
}
};
AppClass.fileObserver.startWatching();
return START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
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,我在 * 上找到了这个解决方案并尝试了。我也试过这个GitHub 代码,但似乎没有任何效果。
我知道 FileObserver 不是递归的,现在我只是想听一个目录。
我们非常感谢任何帮助。
【问题讨论】:
-
从in-code cmets看来,
Environment.getExternalStorageDirectory()是SDCard目录,其实这个目录是Internal Device storage。外部与应用程序有关,因此是“应用程序外部”。此外,FileObserver 不是递归的,因此您只监视一个目录。 -
@Gotiasits 感谢您的评论,我知道外部存储不是 SD 卡,我现在只是想听一个目录。我还更新了我的问题以避免任何进一步的误解。
标签: android fileobserver