Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/android api level31 #266

Merged
merged 10 commits into from
Jun 13, 2023

Conversation

neon-izm
Copy link
Contributor

@neon-izm neon-izm commented Mar 10, 2023

solve #265

議論ポイント

以下2点は悩みどころです。

  • ACCESS_FINE_LOCATION の権限は必要か
    • SDK内容的にはACCESS_COARSE_LOCATIONでも動くような気がします
  • Unityバージョンを上げるかどうか
    • Android (Google Play Store)は API Target Level 31を要求していますが、現在のリポジトリ内のUnityバージョンであるUnity2021.3.0f1はAndroid SDK 30がインストールされてしまうため、そのままのビルドではストア審査が通らない
    • readmeにその旨記載しておく、あるいは素直にUnityバージョンを上げる、どちらが望ましいでしょうか?
    • 例えばUnity2021.3.0f1の同梱Android SDK 30では`Android.Permission.RequestUserPermission("android.permission.BLUETOOTH_SCAN") が成功しないです。

const string androidBluetoothPermission = "android.permission.BLUETOOTH";
const string androidBluetoothAdminPermission = "android.permission.BLUETOOTH_ADMIN";
const string androidBluetoothAdvertisePermission = "android.permission.BLUETOOTH_ADVERTISE";
const string androidBluetoothScanPermission = "android.permission.BLUETOOTH_SCAN";
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

API Level 31 Bluetooth permissions
https://developer.android.com/about/versions/12/features/bluetooth-permissions

にあるように権限の細分化が必要。しかしUnity2021.3.0f1はこれらの新しい権限のリクエストが失敗する点に注意。

@@ -169,7 +169,7 @@ public BleDeviceObj(BluetoothDevice device, Context cxt) {
this.charastricsKeyHashMap = new HashMap<CharastricsKey,BluetoothGattCharacteristic>();
this.pubCharastricsKeyHashMap = new HashMap<CharastricsKey,BluetoothGattCharacteristic>();
this.charastricsKeys = new ArrayList<CharastricsKey>(32);
device.connectGatt(cxt,true,this);
device.connectGatt(cxt,true,this,BluetoothDevice.TRANSPORT_LE);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

明示的にLEを指定しないと問題が起きそうです。

JuulLabs/kable#61

@MrkKSen
Copy link
Collaborator

MrkKSen commented Mar 10, 2023

@neon-izm さん
詳細な情報を書いていただきありがとうございます!

・ACCESS_FINE_LOCATION の権限は必要か

ブルートゥースだけのためなので、ACCESS_COARSE_LOCATIONでも動けるならそれで良いかと思います。

・Unityバージョンを上げるかどうか

とてもわかりやすい解説で助かりました。こちらに関しては運営の判断が必要なので、また来週検討させてください。

@neon-izm
Copy link
Contributor Author

@MrkKSen sanありがとうございます。
一応選択肢としてはUnityのバージョンアップでAndroid API Level31の追加権限に対応する以外に権限取得部を
https://github.com/yasirkula/UnityAndroidRuntimePermissions に置き換える、もアリかもしれません。

良い点

  • Unityのバージョンアップが不要
  • 他のバージョンのUnityで使うユーザに優しい

悪い点

  • 依存ライブラリが増える

という感じです。

@MrkKSen
Copy link
Collaborator

MrkKSen commented Mar 14, 2023

@neon-izm さん
ご返信ありがとうございます。
いくつか報告と相談をさせてください。

Unityのバージョンアップはしない

toio SDK for Unity は原則 Unity のLTSバージョンに基づきたいと考えておりますので、そろそろ2022LTSが出る時期なので、バージョンアップはその時にしたいと思っております。

手元にある Android 11 (API 30) のスマホで試した結果

  • 現在頂いたPRの内容で、Unity2021(API 30)でビルドするとエラーが発生。
    AndroidManifest.xml:20:5-22:58: AAPT: error: attribute android:usesPermissionFlags not found
  • Unity2021(API 30)で、ACCESS_COARSE_LOCATION は動けなさそうです。
  • Unity2022(API 31)で、BLUETOOTH_ADVERTISE はいらないです。

なので、manifest は以下なのが良いかもしれません。

<!--(以上略)-->
    <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"/>
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--(以下略)-->

Android 12で動けるかはわからないですが、もし問題なければこれで対応して頂きたいと考えております。
ドキュメントについてはPRを受け入れてからこちらで考えてみます。いかがでしょうか?

その他

ちなみに紹介頂いたライブラリ https://github.com/yasirkula/UnityAndroidRuntimePermissions ですが、BlePermissionRequest.cs の権限取得部を置き換えるとして、なんの違いがあるかが理解できていません、ご教示いただけるとありがたいです!

<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"
android:minSdkVersion="31"/>
<!-- application must have ble hardware -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLE非対応機器にインストールできないように指定

@neon-izm
Copy link
Contributor Author

@MrkKSen san遅れましたが追加のコミットをしました。

FBを受けての変更点

AndroidManifestの権限を見直しました。おそらくこれでAndroid8~13までの権限が網羅できたと思います。

AndroidRuntimePermission導入は無くても良いか

なくても大丈夫そうです!

Unityバージョンアップについて

了解です。LTSが出たらまた考えていただければと思います。

残件について

現時点のPRでおおよそやりたいことは実現できそうですが、引き続き現在のGooglePlay Storeへの提出にはTarget APIが31以上という制約が遺っています。
このライブラリのUnityの現在のバージョンではTarget APIが30までしか対応していないので、ストアリリース時はAndroid SDKを別でインストールしてTarget API=31を指定する必要がある旨をドキュメントに追記お願いしたいです!

@MrkKSen
Copy link
Collaborator

MrkKSen commented Mar 24, 2023

@neon-izm さま
ご対応ありがとうございます!

ドキュメント追記の件承知しました。

一つの疑問がありますが、以下の部分で minSdkVersion="31" が設定されていますが、それでも API 30 でビルドする場合は、AndroidManifest.xml:20:5-22:58: AAPT: error: attribute android:usesPermissionFlags not found というエラーが出てきます(多分31の新仕様なので)。

    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
             android:minSdkVersion="31"
             android:usesPermissionFlags="neverForLocation" />

usesPermissionFlags に関して、一つの manifest ファイルで後方互換性を保つのは無理でしょうか?
そうであれば一旦今回は削除して、30と同様に FineLocation を取得したほうが手っ取り早いかなと考えておりますが、いかがでしょうか?
(Unity LTS版のアップグレード対応時に、また複数の Manifest を用意してユーザーに選んでもらう方式を検討できます。)

@neon-izm
Copy link
Contributor Author

@MrkKSen san FBありがとうございます。

そもそもこのPRがAndroid のTarget API>=31での動作を行うためのものなのでTarget API=30でエラーが起きるのは仕方ないのかな、という気はします(存在しない権限なので)

おっしゃるとおり後方互換性をうまく保つ方法は残念ながら無いと思います。
(Android Manifest.xml内でコメントを書いておいてお茶を濁す、とかでしょうか)

現実的には以下2個の対応が有り得ると思っています。どうしましょうね…

このPRはマージせず、toio SDKはTarget API=30を維持する

メンテコスト的にはこれが楽です。
欠点はGoogle Playへのapkアップロード時にTarget API設定でリジェクトされて、開発者がビックリします。

このPRをマージして、Target API=31にする

開発者はGoogle Play Storeへの公開も行えるし、将来のアップデートコストが低いです。

欠点は 一時的に Unity2021のバージョンに同梱されているAndroid SDKではビルド出来なくなってドキュメントでのフォローが必要です。(Android SDKを追加でインストールしてUnity Editorで指定する、という旨の記載)

@MrkKSen
Copy link
Collaborator

MrkKSen commented Mar 27, 2023

@neon-izm さま
ご回答ありがとうございます。
Android Manifest.xmlの後方互換性を保つ方法はないこと承知しました。

とすると、このPRをマージすると、toio SDK for Unity の対応 Unityバージョンが 2021 なのに、デフォルトの状態では Unity 2021 で動けないという状況になるので、合理的ではないかと思いました。

なのでこのPRを main に取り入れるのは Unity 2022 LTS にアップグレードしてからにして、当面の対応としては、一旦専用のブランチにマージし、main のドキュメントで「google playに配布したい方、API 30 を使いたいかたはこのブランチを参考にしてください」みたいに追記する形を考えておりますが、いかがでしょうか?

@neon-izm
Copy link
Contributor Author

良いと思います。ではこのPRはそのまま放置というか、2022LTSへのアップデートの際にマージよろしくお願いします&readmeへの追記お願いします

@MrkKSen MrkKSen changed the base branch from main to develop April 3, 2023 05:07
@neon-izm
Copy link
Contributor Author

neon-izm commented Jun 9, 2023

@MrkKSen sanそろそろUnity2022LTSも出たので、上記PRの件含めて検討おねがいします!

https://unity.com/ja/releases/lts

@MrkKSen
Copy link
Collaborator

MrkKSen commented Jun 13, 2023

@neon-izm さん
出ましたね!他の修正合わせて対応していきますので、一旦 develop にマージさせていただきます。
ご対応ありがとうございました!

@MrkKSen MrkKSen merged commit 385c372 into morikatron:develop Jun 13, 2023
@neon-izm neon-izm deleted the feature/android_api_level31 branch June 17, 2023 05:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants