Finish Bluetooth activity if permission revoked while backgrounded - #267
Finish Bluetooth activity if permission revoked while backgrounded#267evanofficial wants to merge 1 commit into
Conversation
Fixes SecurityException crash on Android 12+ when BLUETOOTH_CONNECT is revoked while the app is in the background. Re-checking permissions in onResume() prevents any subsequent Bluetooth calls from running without the required permission.
|
Olá! Obrigado pela contribuição. No momento eu não tenho acesso a hardware Bluetooth (e não encontrei até hoje nenhuma solução de emulação que permita fazer testes automáticos ou manuais - incrivelmente, Java ME tinha várias opções assim), então não tenho como verificar este fix, mas posso considerar incluir numa versão futura se você ou alguma outra pessoa puder testar em hardware real. Nesse sentido, também seria interessante que o PR acompanhasse passos para verificar a resolução. Obrigado! |
|
Uma dúvida: o que acontece exatamente quando essa detecção no resume encerra a atividade? (i.e., como isso é diferente da exceção? nos dois casos parece que a activity é encerrada). Haveria a possibilidade de re-requisitar, ao invés de derrubara a activity? Outra dúvida: a perta sempre ocorre quando o aplicativo perde foco? Só me pergunto se estamos realmente cobrindo um fluxo de uso, ou apenas seguindo uma dedução de IA que pode ou não corresponder a um problema de usuário. Obrigado! |
Good points! To answer both:
|
Fixes #265
What
Adds a permission re-check in
BluetoothActivity.onResume(). IfBLUETOOTH_CONNECT(or any other required Bluetooth permission) has been revoked while the app was in the background, the activity callsfinish()before any Bluetooth calls can run.Why
onCreate()already checks permissions and only proceeds if they are granted. However,onResume()did not re-verify, so returning from the background with a revoked permission led to aSecurityExceptioncrash — most visibly inServidorBluetoothActivity.atualizaClientes()(called 4s afteronResume()viapostDelayed), and potentially inClienteBluetoothActivity.listaDispositivosPareados()as well.Fixing it in the base class covers both subclasses without duplicating logic.