発生している問題
タイトルの通り、ファイルを追加/削除してもFileObserver.OnEvent()
が呼ばれません。
マニフェストファイルのREAD_EXTERNAL_STORAGE
、WRITE_EXTERNAL_STORAGE
のアクセス許可にもチェックを入れています。
Microsoft Visual Studio Community 2019 Version 16.10.3で開発しており、AVDはPixel 2 Pie 9.0 - API 28
を使っています。
該当のソースコード
MainActivity.cs (// アクセス許可を得る
の部分はこちらをもとに実装しました)
C#
1using Android; 2using Android.App; 3using Android.Content.PM; 4using Android.OS; 5using Android.Runtime; 6using Android.Util; 7using AndroidX.AppCompat.App; 8using AndroidX.Core.App; 9using AndroidX.Core.Content; 10using System.IO; 11 12namespace FileObserverTest.Main 13{ 14 [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)] 15 public class MainActivity : AppCompatActivity 16 { 17 static string observePath => Environment.GetExternalStoragePublicDirectory( 18 Environment.DirectoryDownloads).AbsolutePath; 19 MyPathObserver observer = new MyPathObserver(observePath); 20 21 protected override void OnCreate(Bundle savedInstanceState) 22 { 23 base.OnCreate(savedInstanceState); 24 Xamarin.Essentials.Platform.Init(this, savedInstanceState); 25 // Set our view from the "main" layout resource 26 SetContentView(Resource.Layout.activity_main); 27 // 自動生成ここまで 28 29 // アクセス許可を得る 30 if ((ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) != (int)Permission.Granted) 31 || (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != (int)Permission.Granted)) 32 { 33 ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage },0); 34 } 35 36 FindViewById(Resource.Id.btCreate).Click += CreateFile; 37 observer.StartWatching(); 38 } 39 40 private void CreateFile(object sender, System.EventArgs e) 41 { 42 const string tag = "StackoverFlow"; 43 string testFile = Path.Combine(observePath, "StackOverFlow.txt"); 44 45 if (File.Exists(testFile)) 46 { 47 Log.Debug(tag, "Delete"); 48 File.Delete(testFile); 49 } 50 else 51 { 52 Log.Debug(tag, "Create"); 53 File.WriteAllText(testFile, "Foobar"); 54 } 55 } 56 57 // 変更なし 58 public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) 59 { 60 Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); 61 62 base.OnRequestPermissionsResult(requestCode, permissions, grantResults); 63 } 64 } 65}
MyPathObserver.cs (こちらをもとに実装しました)
C#
1using System; 2using Android.OS; 3using Android.Util; 4 5namespace FileObserverTest.Main 6{ 7 public class MyPathObserver : FileObserver 8 { 9 static FileObserverEvents _Events = FileObserverEvents.AllEvents; 10 const string tag = "StackoverFlow"; 11 12 public MyPathObserver(string rootPath) : base(rootPath, _Events) 13 { 14 Log.Info(tag, string.Format("Watching : {0}", rootPath)); 15 } 16 17 public MyPathObserver(string rootPath, FileObserverEvents events) : base(rootPath, events) 18 { 19 Log.Info(tag, string.Format("Watching : {0} : {1}", rootPath, events)); 20 } 21 22 public override void OnEvent(FileObserverEvents e, string path) 23 { 24 Log.Info(tag, string.Format("{0}:{1}", path, e)); 25 } 26 } 27}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/01 02:44