cocoa-mhlw / cocoa

Mozilla Public License 2.0
991 stars 112 forks source link

[Android] BluetoothをOFFにした状態で「対処方法を確認」ボタンを押してもなにも起こらない #790

Open keiji opened 2 years ago

keiji commented 2 years ago

テストチームからの指摘

不具合の内容 / Describe the bug

BluetoothをOffにした状態でホーム画面の「対処方法を確認」ボタンを押すと、通常であればBluetoothの設定画面が表示されるはずだが、なにも起こらないケースがある。

ログにはSecurityExceptionが記録されている。

"2022/01/20 17:07:06","Error","Failed navigate to bluetooth settings, Exception: Java.Lang.SecurityException: Permission Denial: starting Intent { act=android.settings.BLUETOOTH_SETTINGS cmp=com.android.settings/.Settings$BluetoothSettingsActivity } from ProcessRecord{2d34a1fd0 23440:jp.go.mhlw.covid19radar/u0a230} (pid=23440, uid=10230) requires android.permission.BLUETOOTH_ADMIN ---> Java.Lang.Exception: Remote stack trace:   at com.android.server.am.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:2181) at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:912)    at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:675)    at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1657)    at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:617)   --- End of inner exception stack trace ---  at Java.Interop.JniEnvironment+InstanceMethods.CallNonvirtualVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x0008e] in <6ef9909596214eb8aa385c50a7098b19>:0   at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x00063] in <6ef9909596214eb8aa385c50a7098b19>:0   at Android.Content.ContextWrapper.StartActivity (Android.Content.Intent intent) [0x00031] in <71b7779040ee4233aa4603391e6748a2>:0   at Covid19Radar.Droid.Services.ExternalNavigationService.NavigateBluetoothSettings () [0x00034] in <bf184ec8b2de4946a703f38951d96fe5>:0   --- End of managed Java.Lang.SecurityException stack trace ---java.lang.SecurityException: Permission Denial: starting Intent { act=android.settings.BLUETOOTH_SETTINGS cmp=com.android.settings/.Settings$BluetoothSettingsActivity } from ProcessRecord{2d34a1fd0 23440:jp.go.mhlw.covid19radar/u0a230} (pid=23440, uid=10230) requires android.permission.BLUETOOTH_ADMIN    at android.os.Parcel.createException(Parcel.java:1966)  at android.os.Parcel.readException(Parcel.java:1934)    at android.os.Parcel.readException(Parcel.java:1884)    at android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:3603)    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1673) at android.app.Activity.startActivityForResult(Activity.java:4703)  at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:588)   at android.app.Activity.startActivityForResult(Activity.java:4661)  at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:574)   at android.app.Activity.startActivity(Activity.java:5022)   at android.app.Activity.startActivity(Activity.java:4990)   at androidx.appcompat.app.AlertDialog_IDialogInterfaceOnClickListenerImplementor.n_onClick(Native Method)   at androidx.appcompat.app.AlertDialog_IDialogInterfaceOnClickListenerImplementor.onClick(AlertDialog_IDialogInterfaceOnClickListenerImplementor.java:30)    at androidx.appcompat.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:216)  at android.app.ActivityThread.main(ActivityThread.java:7285)    at java.lang.reflect.Method.invoke(Native Method)   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)Caused by: android.os.RemoteException: Remote stack trace:   at com.android.server.am.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:2181) at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:912)    at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:675)    at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1657)    at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:617)","NavigateBluetoothSettings","/Users/runner/work/1/s/Covid19Radar/Covid19Radar.Android/Services/

再現手順 / Steps to reproduce

現象の発生する機種で、

  1. 端末のBluetoothを無効にして、
  2. COCOAを起動して、
  3. 「対処方法を確認」ボタンを押す

期待される挙動 / Expected behavior

Bluetoothの設定画面が表示される。

動作環境 / Environments

その他 / Additional context


Internal IDs:

keiji commented 2 years ago

ログを見る限り、Bluetoothの設定画面を起動するのにBLUETOOTH_ADMINのパーミッションがないと怒られている。 他のケースでは問題なくBluetoothの設定画面が起動できているので、デバイス固有の制約である可能性がある。

Android 9.0特有の制約である可能性もなくはないけど(ぼくが今手元に9.0端末がないので)、Android 7.1.1とAndroid 12で問題なく動いているので、9.0のあたりだけ制約があると言うことはちょっと考えづらい。

設定画面を呼び出すコードはCOCOA1系でも使われているので、COCOA2固有の問題ではないという認識。

今後の対応としては、

  1. COCOAにBLUETOOTH_ADMINのパーミッションを付ける。 ← この方法はやり過ぎ
  2. 設定の呼び出し時にSecurityExceptionが出たらダイアログなどで「お使いの端末では設定画面を表示できません。設定からBluetoothを有効にしてください」と表示する

個人的には2が良いと思う。