@@ -601,6 +601,23 @@ private void checkGeofencePermission() {
601601 }
602602 }
603603
604+ private boolean isAllowedProviderSafe (String provider ) {
605+ if (LocationManager .GPS_PROVIDER .equals (provider ) ||
606+ LocationManager .PASSIVE_PROVIDER .equals (provider )) {
607+ // gps and passive providers require FINE permission
608+ return mContext .checkCallingOrSelfPermission (ACCESS_FINE_LOCATION )
609+ == PackageManager .PERMISSION_GRANTED ;
610+ } else if (LocationManager .NETWORK_PROVIDER .equals (provider ) ||
611+ LocationManager .FUSED_PROVIDER .equals (provider )) {
612+ // network and fused providers are ok with COARSE or FINE
613+ return (mContext .checkCallingOrSelfPermission (ACCESS_FINE_LOCATION )
614+ == PackageManager .PERMISSION_GRANTED ) ||
615+ (mContext .checkCallingOrSelfPermission (ACCESS_COARSE_LOCATION )
616+ == PackageManager .PERMISSION_GRANTED );
617+ }
618+ return false ;
619+ }
620+
604621 /**
605622 * Returns all providers by name, including passive, but excluding
606623 * fused.
@@ -632,8 +649,6 @@ public List<String> getAllProviders() {
632649 */
633650 @ Override
634651 public List <String > getProviders (Criteria criteria , boolean enabledOnly ) {
635- checkPermission ();
636-
637652 ArrayList <String > out ;
638653 synchronized (mLock ) {
639654 out = new ArrayList <String >(mProviders .size ());
@@ -642,14 +657,16 @@ public List<String> getProviders(Criteria criteria, boolean enabledOnly) {
642657 if (LocationManager .FUSED_PROVIDER .equals (name )) {
643658 continue ;
644659 }
645- if (enabledOnly && !isAllowedBySettingsLocked (name )) {
646- continue ;
647- }
648- if (criteria != null && !LocationProvider .propertiesMeetCriteria (
649- name , provider .getProperties (), criteria )) {
650- continue ;
660+ if (isAllowedProviderSafe (name )) {
661+ if (enabledOnly && !isAllowedBySettingsLocked (name )) {
662+ continue ;
663+ }
664+ if (criteria != null && !LocationProvider .propertiesMeetCriteria (
665+ name , provider .getProperties (), criteria )) {
666+ continue ;
667+ }
668+ out .add (name );
651669 }
652- out .add (name );
653670 }
654671 }
655672
@@ -660,23 +677,22 @@ public List<String> getProviders(Criteria criteria, boolean enabledOnly) {
660677 /**
661678 * Return the name of the best provider given a Criteria object.
662679 * This method has been deprecated from the public API,
663- * and the whole LoactionProvider (including #meetsCriteria)
680+ * and the whole LocationProvider (including #meetsCriteria)
664681 * has been deprecated as well. So this method now uses
665682 * some simplified logic.
666683 */
667684 @ Override
668685 public String getBestProvider (Criteria criteria , boolean enabledOnly ) {
669686 String result = null ;
670- checkPermission ();
671687
672688 List <String > providers = getProviders (criteria , enabledOnly );
673- if (providers .size () < 1 ) {
689+ if (! providers .isEmpty () ) {
674690 result = pickBest (providers );
675691 if (D ) Log .d (TAG , "getBestProvider(" + criteria + ", " + enabledOnly + ")=" + result );
676692 return result ;
677693 }
678694 providers = getProviders (null , enabledOnly );
679- if (providers .size () >= 1 ) {
695+ if (! providers .isEmpty () ) {
680696 result = pickBest (providers );
681697 if (D ) Log .d (TAG , "getBestProvider(" + criteria + ", " + enabledOnly + ")=" + result );
682698 return result ;
0 commit comments