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

.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で標準的にサポートされている権限とか、パーミッションを拡張したい場合の例が載ってます

おしまい

コメント

このブログの人気の投稿

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の方が速いかもね  

.NET MAUI BLE(Bluetooth Low Energy)も上手く行った

2023/10/11更新 ↓こちらの記事で更新しれました。 .NET MAUI PLUGIN BLEがWindows(10/11)に対応してた Windows対応 イヤッッホォォォオオォオウ Bluetooth LE plugin for Xamarin &amp; MAUI がWindowsに対応してた~ nugetでver3.00をみんな早速ゲットだ。   ちなみにこちらはAndroid版のサンプルアプリ   GitHub...   [ブログカード風リンクタグ作成] ------------------------------------------------------------------------------ 昔、スマホとESP32の接続確認用に作ったプログラムをXamarinからMAUIに移植したら動いちゃった   まあ、ESP32からスマホへの一方通行なアプリなんだけど 面倒くさいので github に公開した 下手くそなコード書きやがってとか思われそう 「間違ってるぞこのやろう」というのを見つけたら教えてくれると嬉しいです 要素技術の調査はこれで完了かな

.NET MAUIでスプラッシュスクリーン Android12で地獄を見る

まずは起動するところから・・・・  スプラッシュスクリーンだぬ マイクロソフトのサイト 見てると簡単そう(実際簡単で細かい事を気にしなければsvgファイルを用意して1行だけ書き換えておしまい)   なんかプロジェクトファイルに自動で記述されるらしい よし、プロジェクト作った                     つーか、もうスプラッシュがあるんだけど・・・・ そして自作のsvgファイル くうっ・・・デザインセンスない・・・・   それはともかく、このSVGファイルを Resources\Images にドラッグ&ドラッグ プロジェクトを右クリックして「プロジェクトファイルの編集」 して、編集できるようになったプロジェクトファイルを 自分のプロジェクトファイルに書き換える <MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="168,168" /> ↓ <MauiSplashScreen Include="Resources\Splash\ splashtestmaui .svg" Color="#512BD4" BaseSize="168,168" />   とりあえずAndroidで実行 お、おう・・・・ まあ最初はこんなもんよね 最初に紹介したマイクロソフトのサイトでもBaseSizeを書き換えてくださいって言ってるし 言われたとおりに <MauiSplashScreen Include="Resources\Splash\splashtestmaui.svg" Color="#512BD4" BaseSize=" 320,600 " /> 書き換えてみると いい感じじゃーん じゃあアンドロイドのバージョン毎に試してみよう   Android 7 Android 11 Android 12 Android 13