そういえば位置情報や、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で標準的にサポートされている権限とか、パーミッションを拡張したい場合の例が載ってます
おしまい
コメント
コメントを投稿