From 99598c14fe9f2e0a8b718b1decdf3bf01a635568 Mon Sep 17 00:00:00 2001 From: Greg Pomerantz Date: Fri, 21 Aug 2026 20:28:43 -0400 Subject: [PATCH] Request BLUETOOTH_SCAN/CONNECT at onAttach on API 31+ Activity.requestPermissions is unreliable from non-UI threads / late timing on Android 17 (createDeviceContext garbage device id); the fragment's onAttach request path works. Skip the legacy location request on API 31+ (BLUETOOTH_SCAN is neverForLocation). Rebuild Ble.jar. --- Ble.jar | Bin 8276 -> 8440 bytes BlessedConnect.java | 13 +++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Ble.jar b/Ble.jar index a99716b3df7966cff580e7c375d5c42b9b100818..9acc8b7a0e28b47bb75f79197454e4186c91530e 100644 GIT binary patch delta 7354 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 LI{L>?IJo}-tG&3* delta 7218 zcmZ8`Wl$X95-qNaFAj^l1a}D`=;E*e776a|zCZ|pMM8k!65N;IED$tUAV6>nu0etZ zCokMruj<}6Q#EJ0zVl;h>U4i!_qkS>eh$z9qhkP3aBy%?V)8x!q|yF8)dE;z^2p6l z{_8^j_wMcU?1_wrf`WtcMBZZgM^3>-<#+-iRGueLz!pe(kBSG=pLz~_Oha=7hvShW zhm!|DY|E$H$mXqH6aC zT)!&0D;+#GTr0l{LkWnQBN1UNF3?pW%c90Ycbx9XvXq{j_u;c%X^QOT-j!kE)n{j? z%GypNV;zWvwkE@}A$fgL%rQa^kYjcYB2m z1&vxs+KR?)Z|^yWqD!_Ra^1_4wkmrG`1WE{qW41spuomSu}?GlS`DMK-FY-~vO?<2 z8tAz^`6B@oO}LZ{mTU3n4EccXW+GRTqCq}JW6o$(v_Jgv9<8E_R{vr&=7#w+8m9I<%H;%7KzbokJ!hPrNcMC2v+87JBz_(~5uN zNC$tZ#?e!Cruy-rhg0zicNIVW2ELg_MjPi`a{mi&2HE)ep1-Sptouy8wZPhRre^NK z&yNndF$3E%ovYHFPu`m34p8{ykRk=*hHf!v_5o-14Gy46I9i$mCt`t`t7eN9bMqx) zR5ae^nO2RIbe1&+eqwyE2TrHrt@+3ixb`?x*Neerb?S`YaUoY3Bz%G7tBq-Nmy>}j zR~hP2%lvp#muTNQ9ftX8tJm2S|9-6W8D&v9UxVq(W9l`%nsc&MxTzSDB^l#aeqcd-GMTf}DX_W11f z6v1wT6HLdQH<32gcVvZ`it(Y*$^vz-{Y!F)o)`I&S~{gusr~K)`i_fCHcBf;)HhZY zt+)J|ZH=}hcPn*!plgUq2#Ap6ot|NE4m!*brk#PBQr7d3t6t3WCV=OV3&c`VL z%gX>2A(pal&TSgeG8NK#jtlQ&cYer`iA4hdCRG1~^@mfz1hc>-oeyhAcy#L^J0!cE z={?j@-n9fdlPc3BC&^*o1+#o+Qqn7|(5`U^y zO+_v z-^1S4mHlW{sZSR}?#V{=ko4LjSXd%HNT@I;a#J!jO_LDBwPRaaiOLZW5gP zQYt1vWZ0J53bW6spUQlbDNxVCnib?5{$7_kx0C`cu8rnfX;tAa<&y%hW6E@0{wa_T z<9`+Sf2(zh3bruJ)qTkT80JP}$KgB28(d;yyf-QO>?jA(Ax1w@$`w_zFdG$rDu(>S zChC1O&5^lq7^68I{3dmgKv_cf#~p@t3WS+=fDx9DibLatM=H8q}jDhxBbrYb1t!lV)<`Usb~y1zK~M45!{}yDlL;HLXIRX zEsHLhh%%-Mp79GDZx71>p;F`Z!>r{K2TGI6QvKWXoHsOfwg( zivEYJ=I_*FHn%C1m~|s~ddww<(s#2Gr5;Kzpgkf8Ay$zk5Bez`=}yNANLhb(%;PA^ zEjk7S<1{|9Iy{Cf+qTam)`Ko^R6RrAgMj7xC6M^@!xeej`2kS~It*h3i?|jsv zf%8BH0XEVpN1EGZ$TX|q7)|-s7w_Uv>$XH&nO6`(HmsVtfSr|Vq6LcVX}+(|1LNc4 z@Zd&PRJG!1wA*(jCQVS}G-s_IDvwb45qq!+XO0KUwlo*DyP(EJTht}^r)n%sH7BQK z6O8AijkqFJLhjnFa|MerQ#0aZw${hJzbbK7~Mt4FuopW4bI$T zapC01LHC^tRmz8KO~w&1T+Ayt7VzvLgvf#0${6*gX!_Gj&_u;+dJ z=JS1V{{57)!VT?1+gCb!r83kQ!9K>f8A|V}eMNew<)^YfG55Y6{+l=l>w!{kD>JD3 zAANsl%2Wh=-36t=`W+z{Rx>;gPTIZ+t5cs+z{>AE9~g5VAE?N;3Lc1zb|KluNeXPg#KL0 z>kyI^f;epa_ne16rzF4l_WdLB--+uE`+t-CX`6wG z@LRiBdVANry3?kE03Z2lsnZHdQaerBYh?TaeVk3IY?quO^ji2EUqql?3XYnlEfIQq z?(iFF-V4XqC>NblCzL94Evm*p?l9QO2)FxK`a`=_({hKAyV9%3-H=_IzmK~u5ET0p zbJ3 zdg(njj^af2XlvTcpv}pn6a?S$@+U4jH;!aM5$l#{3iRO5=>@|+uG)Cg9}Qu>YPPnC z5eoqN*h5$E9~zRS+2923_h`jDe8cgH4}igZRjEo1ZOm#ZLZL>vg=g-@IZK%1eSmjG zvJI1l5re{jSoQahl2gKbN|@&#KMzp2=%222deTjKEO$3J*g7of)lgeWBKQ}YRrmpX zu{PV=)($G~qN5^Mr7B{b-{!!K@eT1p`VE|{{Qxv1@!Oa)ZGn72^O1FRqbU8y%I~Ae zu=ErrrNuzPd+HSRG3$~!lOBtVJ#yn7TNQ0ZCYc8ItM0Pi$p%u$5|Dk1Z|#N8Yj#P* zI%ag}cERmgZyl1d&v^P^&sIWbr2$tPgYO^#TW*)Y6eYG}%+zR&e+E{;!Mysd6KFiC z5Cfu5FYlbBU+Yx*0-2;;x8tl2i>gIJ$YBb0*&ALxmA!9c5o!lqn zV=1@|bsZ-^9sd5h6K6U@R3OSS8f%>h%x3pnZx&ESx>W7sr9SBUtv-YpPjFMt(35SG ze)1@0T>aU~jx$w3ygKZ%P0TwRMR2)0Bia+4tQEQ5p`-1D(zC0nH;#=Zlya=PHLv@bxt$P-bt zYyuR)LGNwZV!nzD`#}SCsc%l%1c*LN?f|44dbj&-Zm5rc3c!Xx^4eynxn&HwIW9zb zW`FayD_=UhR3$TAi~+AJ1azW*!4^_JhJuF5Km zI{s2|XyOaxj|Np;=oB@t6eytZnyR$<+s$k4RaJx8Tqf^=^0qWi!4!36+m(jvPdFid z?y0A-7E)@p>1MEz4{{aGF;$Xkj4X<~=3Umw4cft#@URk;>I$yw2SxXUi`8&y0iz4Q zoUy7s>Vv~u%<6NdM(hZ2ms>;;#|dhv_bA1~68!P!GUKA?Vj@FcBxw&bGc&y_WXvbo@~&SV$YqAHYLZu!>@r2t;WCD_mKcD z?hfn!^3m3%Dh%z7||RG?;{Q)`@o0tv?K7JYyKH4{w?KFb5p2eW?H< zzR|Wp;=!JwCC5hIYY>xCgp@OHg-$|HkX~DI{64oaVL;tAqCT^F-X^Bj&&2NR6YQ=iz_&@A%^Z`2VV760tOl{Lx(~ zMVuPM1i;Y1A!h8hVW*8NV2_Dn>Q*Iv!5+>udz}%;`X(h);v8-AJO5%oKh)W^uBpVY z0Mc%u8KYNIQv+@CtpP)zO>Q->s+u6xlYct{g;NMfJDbl#1FydLk3Wn{Ufu652fscJ z`@Lg=%1bG#Wy53=q4}0x60HG7raY53pI3?atlPv=Xjl`w7aIjS>o3%mb-)2)v^TX< zh+G6nSVq0+bmLnrd55w1GoiilClnGj4nbuBCHl=IoGQmfZ`66jOoX?YI( z08VbLgb$O7i&Heoq`H@t4-Fbb(;gT6VYx6}) z3B~JH?S~mWa6F=B+&hpDfYhjaJDzAkX;iCR5;JHo1sL{;|BU$y2uco&SMn1g2wJqQUz6cLR{N zGYS1Qhdx2iF^$he&w41(Q-(4XJ~3FdT7Naxx!5`#>gmSU7KHMz6uVr|qMm*{7&3|zOB zx)(}l<*2{l!&HA5AJ^+LHAzX9WlJhmtQZwKq5ozHT8>3gZR6u^w#x1v-HfNq(9qO` zN-R>vU8?^90(6yIw+^H@pcDL=NHdG*U_eBD4c-_?ybYYQ*DXm}rf+c<0FXyaZQ4bP z80y!dE6hf&7)6GS(b06wb~+er4z<-E)vNDu`$a0i{Js`mMi*eVW5Rz9&X_mPM4V8e zY7zLQb1^E#sU%)ye{b`MV%3@G1IjB<*Ah8?N%dxA*Kr(%lx}l3+4!?ng-B4;02*gn zM15|>rp0UBjSjx@=RDh;kKdUWl}1riV(?2j;4*J6#aA74SXD7h(q&fsSw*WkZzFya zgo>LB`{goOxSku-%gOdOs5cfP)N>7ev@vxs^XlWJ+-pU~3FO%7^29>xu;J>!Ef4)o z5}at01#K$wXV6JUIA~!Z8RV0Ld%|KcRJO1=N`{LaA`i-$>aT5uqU zt>UkmviH6E-q-%?#`sZtj4?U69<9<+u|%y#8l@%8P(_lrgL2v z!bjL5qO~T?C!-p3flQP%ebO7yklLJj9)l2Lgpq#lk0^!qkh;8;7`MIp+8+_MUaynb z5rBCJcV~1hS=L96Sn7$*_C5u~QrrN1HpwvC?=Tq`u|~@=20BweNLD&=Iy5}xGfjb2 zm%q|eleOhoR5bR=iNonE+GxK9h2n6~jAoGtwcst$U(1z6(sCuUf|huyf+!FW&)j8a z2~y>1!(;m5E_s7fmivs;F9Tb}|Wt8Q>Pyp8C+fLO|-byaNJ8AP}1SP{{8uyq&+buTD_L9;% zbw($s?AO<$>yMGIt6CL-OjUYPp|s0tmFh;*SLzn)mu^sqwUZY?%Ca z`9bHe^B=Z+mJ?eHIueR@DofugLp!EJ>ob)=hw}=G z89%3IPRCA+CAi8giME|*V#f_oCUT;0s!=60{Av>s$dVqpl2=JFtBkOnh3^pSw@TCC zW-qX@sTT?s74wW0RW(MG{l?@VZN>=1vk<5JU0w&VZmdVe30#j~3aKMb@lm&ys1(1t zJe=5c^~x30&Kd4^nU94rhDI};>Y;Y;P(?JXv|l( z1%fFbWNXOGtJzJ>wd^ou7EC`fBq~$z3b*tsd>6QC_$&TXW`6tqmdJO{yNAK0Z(#4Z z#Bqm+7cH>(2d{U_0{G(Mht@vay(~#HJ?9Pj_(ILGlfQob8tqGl6%c{n$?^W%ua`q` zzTR#q|cjj0Xv=q8N(eq*Mr|hx7-PL z&a$3$5h&oKXNpc;cQ_24`?PM^)2y^_r2`wxVy6};8m`GLDcJC@eNbIOuwDfdT1IoU zGxUQ@UEsXl^+XLh9qdGNV_GEZBa{mBG44f_Jn#S!d@ zARK$qU?*4dcRzj{b3JRM@4dtJI41t6L`Rs~7lEfyy7blu)b zA|BlFj<^uvrk}p6oXRkO@H4z14#G~F-|;=7@5a8etQ_>i=XV+RJ0h6JIuX1L^=wZy zXD3|Oe`x*MF(1!VRu?+DAYbr(gEK$ z@9n;WcpV4Jff=t3u@12@-&{NGB-3j!pU_r+PB^+3TKN&SUQy0FRMYXHM^@n$;nD7# zKIBmp+*?gKK~;Lbs+fe9_iN_Mn|(PA_6at0DhZT#Fjjp}J3mt!%ugxbr3J}TssCz+HFK!v2PFULT5FzYSq?tq|>r_1D(F(QMWJgxp|H?2#MY{my{l*7pILJ#DDU{pg4S z<8LI`C_x|08{*8jeib`de(z}|*OM8PjJyIO{V~cs75ND=B3Q@tFCZ%*KiQCKsJc&=$`F!MnB#S3VS*`h(7NJYnlT=-mx>mP*< z&$W4U7T4ftk)Sl{GdjsTnW=M3ytbYtgBRD+Jz{~nZ@t8{!ZRJL(2@1ONmW`JSo1uJYuk9CRJ;Z#oJ z9Ds9&T7K5V0?~f=Dz(LNNOy9d-s@_W*Y!8aAF7N6BW>j-oHEBx^b0e>bd9bBMmEOR zoP4P$yXp>Qj)kuBi!P$gaAXs0kgSEz!+^Svw67vKK>LgB4>TVttImk%iC21NOP zPFu?DzjooDUnUBA{sjJ@XHQTL5`Kc8An_-lV35Xn^5LFbhZJK5@PC4*0dPt+0~q&d zWJYzyr{KT)BDVjs?odz^@KbcL8B^elWd9-l_gAs}4>6qhACV!Yix`VS2aJjJ Rw1)rh{_}6(tV;hB{U0!+VHW@Z diff --git a/BlessedConnect.java b/BlessedConnect.java index b7da1ce..b1a49bf 100644 --- a/BlessedConnect.java +++ b/BlessedConnect.java @@ -35,6 +35,7 @@ public class BlessedConnect extends Fragment { final int PERMISSION_REQUEST = 1; final int REQUEST_ENABLE_BT = 2; + final int PERMISSION_REQUEST_BLE = 3; public BlessedConnect() { Log.d("gio", "BlessedConnect()"); @@ -63,7 +64,15 @@ public class BlessedConnect extends Fragment { super.onAttach(ctx); Log.d("gio", "BlessedConnect: onAttach()"); ctx.registerReceiver(receiver, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)); - if (ctx.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + if (android.os.Build.VERSION.SDK_INT >= 31) { + // BLE on Android 12+ needs the BLUETOOTH_SCAN/CONNECT runtime + // permissions. BLUETOOTH_SCAN is declared with + // usesPermissionFlags="neverForLocation", so no location + // permission is required for scanning. + requestPermissions(new String[]{ + "android.permission.BLUETOOTH_SCAN", + "android.permission.BLUETOOTH_CONNECT"}, PERMISSION_REQUEST_BLE); + } else if (ctx.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST); } central = new BluetoothCentral(ctx, centralCallback, null); @@ -268,7 +277,7 @@ public class BlessedConnect extends Fragment { @Override public void onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults) { Log.d("gio", "BlessedConnect: onRequestPermissionsResult"); - if (requestCode == PERMISSION_REQUEST) { + if (requestCode == PERMISSION_REQUEST || requestCode == PERMISSION_REQUEST_BLE) { boolean granted = true; for (int x : grantResults) { if (x == PackageManager.PERMISSION_DENIED) {