スキップしてメイン コンテンツに移動

.NET MAUI 権限要求画面とSDKバージョンの取得

そういえば位置情報や、Near By権限を要求するのはどうすればいいのだろう・・・と言うわけで実験してみた

ちなみにAndroid専用(一部そうでも無く他のOSでも使用できるみたい)

Xamarinより楽だったよ!

フォームにボタンとラベルを配置

<!--    SDKバージョン取得  -->
<Button x:Name="SDKVersion" Clicked="SDKVersion_Clicked"    Text="SDK バージョン" />
<!--    位置情報権限  -->
<Button x:Name="LocationBtn" Clicked="LocationBtn_Clicked" Text="GPS ON" />
<!--    Near By Device権限画面  -->
<Button x:Name="NearBy" Clicked="NearBy_Clicked" Text="Near By ON(Android12以降)" />
<Label x:Name="lblSdkVersion" />

またただのボタンとラベルだけど

Near By権限を判定するクラスを作成

/// <summary>
/// NearByDeviceの権限設定画面用
/// </summary>
internal class PermissionNearByDevice : Permissions.BasePlatformPermission
{
public override (string androidPermission, bool isRuntime)[] RequiredPermissions =>
    new List<(string androidPermission, bool isRuntime)>
        {
        // Near By Deviceは以下の権限を要求するようにすると設定画面を出せる
            (global::Android.Manifest.Permission.BluetoothScan,true),
            (global::Android.Manifest.Permission.BluetoothConnect,true),
            (global::Android.Manifest.Permission.BluetoothAdvertise,true)
        }.ToArray();
} 

Permissions.BasePlatformPermissionクラスを継承してMAUIで標準では用意されていない権限要求をするためのクラスを作成
今回はAndroid12以降でBLEを使用するのに必要となる、BluetoothScan、BluetoothConnect、BluetoothAdvertiseを要求する(この三つが揃うとNear By権限の要求画を表示するようになる)

AndroidManifest.xmlを編集

位置情報

位置情報はこの2個

実際はFINE_LOCATIONは俺のアプリでは不要なのだけどAndroidでBLUETOOTHを使用するのに何故か要求される

Bluetooth権限

Bluetoothは今回の実験だけならBluetoothScan、BluetoothConnect、BluetoothAdvertiseの3個だけあればいい

実際のマニフェストファイル

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

今回の実験だけならこんな細かくいじる必要は無いけど、BLEだけを使いたい場合、こんなふうにSDKのバージョンごとにLOCATIONとBLUETOOTHの権限に色々制限を付ける必要がある

うえの方のmaxSdkVersionと言うのがAndroid11までBluetoothを使うために必要だけどAndroid12以降では不要なので制限するための記述 

BLUETOOTH_SCANでneverForLocationと言うフラグを付けているのはGPS無しでもBLEをNearByを動作させるためのフラグ(Android12以降で付ける・・・まあ必要な人はつける)

c#のコード(using)

#if ANDROID
//Androidで必要なモジュール組み込み
using Android.OS;

#elif IOS

//iOS?? 知るかそんもん
using UIKit;

#endif

SDKバージョンはどうやらAndroid以外では取得できない(本当かなぁ)ようなのでメインのソースでAndroidだけで有効になるように
#ifとANDROIDマクロ(C#ではマクロって使い方するのかな?)を使用してAndroidだけで有効になるようにしてAndroid.OSを組み込む

c#のコード(メソッド)

/// <summary>
/// SDKバージョンを数値で取得する
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SDKVersion_Clicked(object sender, EventArgs e)
{
#if ANDROID
    // BLUETOOTHを使用するのか、Near By Device の権限を使用するのかを選択するのにSDKバージョンで切り替える
    lblSdkVersion.Text = ((int)Build.VERSION.SdkInt).ToString();

#endif
}

/// <summary>
/// 位置情報権限を使用できるように要求する(Android11以下でBLEを使用するのはこの権限が必要)
/// </summary><remarks>AndroidManifest.xmlに ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION が必要</remarks>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void LocationBtn_Clicked(object sender, EventArgs e)
{
    PermissionStatus status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();}

/// <summary>
/// Near By Deviceを使用できるように要求する(Android12でBLEを使用するのにこの権限が必要)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void NearBy_Clicked(object sender, EventArgs e)
{
    PermissionStatus status = await Permissions.RequestAsync<PermissionNearByDevice>();
}

そして、それぞれの権限要求するようなコードを書く
SDKバージョンは#if ANDROIDの中にBuild.VERSION.SdkIntをキャストして出力する
SdkIntは列挙体になっていて、何もキャストしないでtoString()とすると数値じゃ無くてJellyBeanとか、コードネームが帰ってくる
ちなみにAndroid11だと「R」とかなかなか手を抜いた名前になっている

LocationWhenInUseはすでに.NET MAUIに用意されていて、Permissions.RequestAsyncに引数を入れてやるだけでよろしくやってくれる(引数じゃ無いよな・・・テンプレート部分?)

PermissionNearByDeviceが今回作ったNearBy権限用のクラス
これをPermissions.RequestAsyncに渡すことでNear By権限の要求画面が表示されるようになる
※ただし、Android12以降のみ、古いAndroidでは無視される

どちらもメソッドをasyncにして非同期にするのを忘れないように

結果

出来上がったアプリ

↑古めのAndroidで位置情報を要求した場合


↑Android12以降では位置情報を要求した場合(Bluetoothを使いたいだけの場合はおおよそでいいんじゃ無いかね)


↑Android12以降でNear By権限を要求した場合 (古いAndroidでは出てこない)

まあ、こんな感じかね


参考にしたマイクロソフトのサイト
こちらに、MAUIで標準的にサポートされている権限とか、パーミッションを拡張したい場合の例が載ってます

おしまい

コメント

このブログの人気の投稿

ImDiskの後継アプリのAIM toolkitを試してみた

ImDiskの開発辞めちゃったらしい というわけで、じゃあ後継ソフトはあるのかと思ったらあった 遅いと言われているけど・・・ とインストールしてみた ImDiskのこの間の結果はこちら 再びRAM DISK(ImDisk)   blog.mazepin-led.com    そして今回のAIM Toolkit なんか、無茶苦茶遅くなってるな 下手するとSSDの方が速いじゃん CPUの使用状態はこんな感じ PIO転送なところは変わって無さそう まあ、遅いからと言ってその速度が体感できるのかというと出来ないんだけどね と思ったところで、なんか設定変えてみたらどうなるのだろう Allocate Memory Dynamicallyというのは、メモリを必要に応じてってことだからと思って以前試したことがあったけど、なんかImDiskのときは不安定だったんだよな  AdvancedのとこにあるUse AWE Physical Memoryというのが良くわからないけど、チェックしてみたら速くなった おお、大分速くなった。なったけど・・・・なんで? これだとImDiskよりちょっと遅いくらいになるのか もしやQuickFormatととかでも変わるのか?と思ったけどそこまでやる気も無かったので放置。速くなるわけないよね。 後は圧縮とか、取り外しメディアとかだし。   最近の性能の良いSSDのおかげで RAM DISKというものの存在意義が薄れちゃったね まあそれでとにかく速度を稼ぎたいぜって人は SoftPerfect RamDiskでも使ってください 昔はPrimo Ramdisk使ってました。当時使ってたけどなかなか良かった。 当時SSD無茶苦茶高かったし。 今はほぼ無用になってしまったが・・・ 未だにスタンダード版は8GBまでなんだな キャッシュ領域にしたいなら大人しく余ってるSSDを使った方がいいんじゃ無いかって気がするけど  おしまい

RAM DISKを使ってみた(使ったのはImDisk)

GWだし、まあちょっとラムディスクを入れてみました うちのPCはWindows11 使ったのはImDiskというRAM Disk。 まあ、この辺のインストールとかはあちこちで解説してる人がいるので適当にぐぐってくださいな で、とりあえずベンチマーク なかなかいいスピードだ で、大抵の人はブラウザのキャッシュをRAMディスクにするといいよ・・・と言うけど そもそもメインドライブがNVMeのSSDを使っている状態で、体感速度なんか上がらない(使い終わったキャッシュを再起動したら綺麗さっぱり捨て去ってくれるという利点はある)  うちで一番効果があるのは Adobe Audition というアプリ これが結構高速化する(キャッシュをちゃんとRAMディスクにしたら・・・だけど) ハイレゾ音源だと、1時間の音源が何かする度に4GBのファイルを作られてしまう なので、RAM DISKにすると、結構編集時間を短縮できる Premiere Rushも出力先をRam Diskにしておいて終わったら、SSDにコピーすると言う事をやるとかなりスピードアップになる 実はうちのPCは普段は99%のパワーで動作していて、CPUのターボブーストが掛からないようになっている 大体3.6GHz当たりで安定してるのだけど、これを100%にするとターボブースト機能がONになって一部のコアが4.5とか4.8GHzまで上がる まあ、毎回電源オプションをいじる事になるのだけどさ・・・ そうしてベンチを取ると こんな感じ とは言え、ブーストしてるからと行ってRam Diskのスピードの差を体感する事はさすがに無理 ・・・と言うかフォトショでもRAM DISKにしてよかった・・・と言うほど変わらない SSDの性能が上がってきたしもし次にPCを買い換えたらRAM DISKよりSSDの方が速いかもね  

QCC dongle proを買った→Windows11で接続までのみちのり

何があった  買ったけど最初の接続に手間取ったので そのメモ QuestyleのQCC dongle proを買ったのだけど、使っているイヤホンと接続できない なんでー? ペアリングしてるのに 説明書 説明書には外装のQRコードを読むように書いてあるのだけど そもそもpage not found 404になる   Windowsには・・・ ちゃんと  ヘッドホンのところには QCC Dongle Pro って出てるのよね しかし音が出ない つーか、新しいペアリングはどうやるのだ  スマホが必要でした 何だそりゃっていいたくなるがどうやらまず、スマホにQCC dongle Pro接続して専用アプリで ドングルとイヤホンをペアリングする必要があった 何だそりゃー Google PlayでQuestyleで検索かけるか こちら でまずはインストール そしてスマホにドングルを刺して、このアプリ内からイヤホンをペアリング そしてそのドングルをWindows11の空いてるUSB TYPE-Cポートに突き刺す   音が出た! やったね  結局音が良くなった?  どうなんだろうね 正直言ってよくわからん ただ、マイケルジャクソンのThe Jamのオープニングのガラスの割れる音は 今までよりも細かくパリパリ聞こえるようになったから効果はあったんだと思う それと遅延が少なくなった  finalのZE3000 SVというイヤホンを使っていたのだけど今までのただのUSBドングルで YouTubeを見てると明らかに音と画面のタイミングがずれてて、 Bluetoothイヤホンってこんなもんかと表他のだけどそれが亡くなったのはとても快適 LDACは遅延が酷いとか書いてあったからビビってたんだけどね(でも有線イヤホン使うと、あ、これが合ってる状態なんだってなるので遅延はあるみたい)   あと、たまにイヤホンと繋がらなくなるねぇ 相性問題というやつなのだろうか    今までのUSBドングルが捨てられない 最期に罠が一つ そりゃ無いぜって言いたくなるのが今までのUSBドングルが捨てられないこと このQCC dongle pro はWindowsからはイヤホンとして認識されるので他のBluetoo...