質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

1525閲覧

[Xamarin.Android] FileObserver.OnEvent()が呼ばれない

potetiniku

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2021/07/24 03:44

発生している問題

タイトルの通り、ファイルを追加/削除してもFileObserver.OnEvent()が呼ばれません。
マニフェストファイルのREAD_EXTERNAL_STORAGEWRITE_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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私が普段Xamarin.Formsしか触ってないので、Xamarin.Androidの質問に対する最適解ではないかもしれませんが、
Permissionチェックに関して、Xamarin.Essentialsを使用して実行したところOnEventのログが出力されました。
Xamarin.Essentialsがインストール済みのようだったので、こちらを試してみてはいかがでしょうか?

C#

1using System.Collections.Generic; 2using System.Threading.Tasks; 3using Xamarin.Essentials; 4 5namespace App2 6{ 7 public class Common 8 { 9 public static readonly List<Permissions.BasePermission> StoragePermissions = new List<Permissions.BasePermission> 10 { 11 new Permissions.StorageWrite(), 12 new Permissions.StorageRead(), 13 }; 14 15 /// <summary> 16 /// パーミッションチェック処理 17 /// </summary> 18 /// <returns>権限付与フラグ(true:付与された, false:付与されなかった)</returns> 19 public static async Task<bool> CheckPermissionsAsync(List<Permissions.BasePermission> permissions) 20 { 21 foreach (var permission in permissions) 22 { 23 var status = await Common.CheckAndRequestPermissionAsync(permission); 24 if (status != PermissionStatus.Granted) 25 { 26 // Notify user permission was denied 27 return false; 28 } 29 } 30 31 return true; 32 } 33 34 private static async Task<PermissionStatus> CheckAndRequestPermissionAsync<T>(T permission) 35 where T : Permissions.BasePermission 36 { 37 var status = await permission.CheckStatusAsync(); 38 if (status != PermissionStatus.Granted) 39 { 40 status = await permission.RequestAsync(); 41 } 42 43 return status; 44 } 45 } 46}

CreateFileが呼ばれたときに、Permissionチェックをすると良いと思います。
ご自身で実装された// アクセス許可を得る箇所は省いて結構です。

C#

1private async void CreateFile(object sender, EventArgs e) 2{ 3 // Permissionチェック 4 if (!await Common.CheckPermissionsAsync(Common.StoragePermissions)) 5 { 6 return; 7 } 8 9 const string tag = "StackoverFlow"; 10 string testFile = Path.Combine(observePath, "StackOverFlow.txt"); 11 12 if (File.Exists(testFile)) 13 { 14 Log.Debug(tag, "Delete"); 15 File.Delete(testFile); 16 } 17 else 18 { 19 Log.Debug(tag, "Create"); 20 File.WriteAllText(testFile, "Foobar"); 21 } 22}

Xamarin.Essentials:アクセス許可

投稿2021/07/31 12:30

takapi_cs

総合スコア349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

potetiniku

2021/08/01 02:44

無事動作させることができました。 アクセス許可の部分はXamarin.Essentialsを利用するのですね。 ご教示いただき、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問