Why am I getting SecurityException in WearableActivityController.onDestroy in WearOS on Samsung Watch 4?

101 Views Asked by At

This exception happens when a parent class is called from my WearOS main activity derived from WearableActivity:

class MainActivity() : WearableActivity(),
        CapabilityClient.OnCapabilityChangedListener {
    ...
      override fun onDestroy() {
    super.onDestroy() // <--- Here !!!

    if (mApp?.receiver != null) {
        Util.d(TAG, "UNREG " + mApp?.receiver)
        androidx.localbroadcastmanager.content.LocalBroadcastManager.getInstance(this).unregisterReceiver(mApp!!.receiver!!)
        mApp!!.receiver = null
    }
}

The full stack trace from Google Play is below. The watch model is Samsung Watch 4 running Android 11. I didn't see the crash on other watches.

java.lang.RuntimeException: 
  at android.app.ActivityThread.performDestroyActivity (ActivityThread.java:5147)
  at android.app.ActivityThread.handleDestroyActivity (ActivityThread.java:5176)
  at android.app.servertransaction.DestroyActivityItem.execute (DestroyActivityItem.java:44)
  at android.app.servertransaction.TransactionExecutor.executeLifecycleState (TransactionExecutor.java:176)
  at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:97)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2073)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:246)
  at android.app.ActivityThread.main (ActivityThread.java:7690)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:593)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:995)
Caused by: java.lang.SecurityException: 
  at android.os.Parcel.createExceptionOrNull (Parcel.java:2400)
  at android.os.Parcel.createException (Parcel.java:2384)
  at android.os.Parcel.readException (Parcel.java:2367)
  at android.os.Parcel.readException (Parcel.java:2309)
  at com.google.android.wearable.ambient.activity.IAmbientActivityService$Stub$Proxy.detach (IAmbientActivityService.java:366)
  at com.google.android.wearable.compat.WearableActivityController$AmbientServiceConnection.detach (WearableActivityController.java:886)
  at com.google.android.wearable.compat.WearableActivityController.detach (WearableActivityController.java:667)
  at com.google.android.wearable.compat.WearableActivityController.update (WearableActivityController.java:268)
  at com.google.android.wearable.compat.WearableActivityController.onDestroy (WearableActivityController.java:202)
  at c.b.e (WearableActivityDelegate.java:2)
  at c.a.onDestroy (WearableActivity.java:1)
  at android.app.Activity.performDestroy (Activity.java:8278)
  at android.app.Instrumentation.callActivityOnDestroy (Instrumentation.java:1344)
  at android.app.ActivityThread.performDestroyActivity (ActivityThread.java:5132)
Caused by: android.os.RemoteException: 
  at com.android.server.am.ActivityManagerService.enforceCallingPermission (ActivityManagerService.java:6521)
  at com.android.server.am.ActivityManagerService$LocalService.enforceCallingPermission (ActivityManagerService.java:19800)
  at com.android.server.wm.ActivityTaskManagerService.enforceCallerIsRecentsOrHasPermission (ActivityTaskManagerService.java:3841)
  at com.android.server.wm.ActivityTaskManagerService.getFocusedStackInfo (ActivityTaskManagerService.java:2293)
  at com.android.server.am.ActivityManagerService.getFocusedStackInfo (ActivityManagerService.java:17678)
1

There are 1 best solutions below

2
Yuri Schimke On

I don't think (not100% sure) the WearableActivityController is expected to be used in a modern Wear app. Is it from com.google.android.wearable:wearable:2.9.0?

Are you using it for ambient support? If so look at https://github.com/android/wear-os-samples/blob/main/AlwaysOnKotlin/views/src/main/java/com/example/android/wearable/wear/alwayson/MainActivity.kt