Purpose

I noticed an interesting Twitter discussion today between Katie Moussouris and @hacks4pancakes After seeing JZdziarski’s iOS teardown regarding Meitu, I’d thought I’d take a look at the android application.

I wanted to differentiate this content by providing low level information by breaking down the application into the various SDKs and indentifying what SDKs gather consumer data.

Note that I intentionally left out the google and facebook sdk info from the results. I should also note that this is only the Java code references and there might be even more Location and Device Identifier API calls in the native code.

Permissions

Below is a breakdown of three of the permisions in question: Read Phone State, Adjust Audio, and Location Related API info

Read_Phone_State

TLDR Ad networks are grabbing information to identify your phone. Not uncommon, but something privacy conscious individuals should be aware of.

To quote the android api docs “Allows read only access to phone state, including the phone number of the device, current cellular network information, the status of any ongoing calls, and a list of any PhoneAccounts registered on the device” link

Aps Flyer Usage

Looks like an SDK called Aps Flyer uses this to gather identifiable information about the device.

smali/com/appsflyer/AppsFlyerLib.smali:    invoke-virtual {v2}, Landroid/telephony/TelephonyManager;->getSimOperatorName()Ljava/lang/String;
smali/com/appsflyer/AppsFlyerLib.smali:    invoke-virtual {v2}, Landroid/telephony/TelephonyManager;->https://developer.android.com/reference/android/telephony/TelephonyManager.html#getNetworkOperatorName()()Ljava/lang/String;

Baidu

Very popular asian search engine sdk. The API method calls related to reading phone state and code locations are below.

  • getDeviceID Returns the unique device ID, for example, the IMEI for GSM and the MEID or ESN for CDMA phones. Return null if device ID is not available.
  • getNetworkOperatorName Returns the alphabetic name of current registered operator.
  • getSimStateReturns a constant indicating the state of the default SIM card.
  • getNetworkType
  • getSubscriberID Returns the unique subscriber ID, for example, the IMSI for a GSM phone. Return null if it is unavailable.
smali/com/baidu/location/a/c.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
smali/com/baidu/location/a/c.smali:    invoke-virtual {v1}, Landroid/telephony/TelephonyManager;->getNetworkOperator()Ljava/lang/String;
smali/com/baidu/location/b/b.smali:.field private d:Landroid/telephony/TelephonyManager;
smali/com/baidu/location/b/b.smali:    invoke-virtual {v2}, Landroid/telephony/TelephonyManager;->getNetworkOperator()Ljava/lang/String;
smali/com/baidu/location/b/b.smali:    invoke-virtual {v5}, Landroid/telephony/TelephonyManager;->getNetworkOperator()Ljava/lang/String;
smali/com/baidu/location/b/b.smali:    invoke-virtual {v3}, Landroid/telephony/TelephonyManager;->getSimState()I
smali/com/baidu/location/b/b.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getAllCellInfo()Ljava/util/List;
smali/com/baidu/location/b/b.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getCellLocation()Landroid/telephony/CellLocation;
smali/com/baidu/location/b/b.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getAllCellInfo()Ljava/util/List;

smali/com/baidu/location/b/b.smali:    invoke-virtual {v1}, Landroid/telephony/TelephonyManager;->getNeighboringCellInfo()Ljava/util/List;
s
smali/com/baidu/location/b/b.smali:    invoke-virtual {v0, v1, v2}, Landroid/telephony/TelephonyManager;->listen(Landroid/telephony/PhoneStateListener;I)V
smali/com/baidu/location/b/b.smali:    iget-object v0, p0, Lcom/baidu/location/b/b;->d:Landroid/telephony/TelephonyManager;
smali/com/baidu/location/b/b.smali:    iget-object v0, p0, Lcom/baidu/location/b/b;->d:Landroid/telephony/TelephonyManager;
smali/com/baidu/location/b/b.smali:    invoke-virtual {v0, v1, v2}, Landroid/telephony/TelephonyManager;->listen(Landroid/telephony/PhoneStateListener;I)V
smali/com/baidu/location/b/b.smali:    iput-object v0, p0, Lcom/baidu/location/b/b;->d:Landroid/telephony/TelephonyManager;
smali/com/baidu/location/b/b.smali:    iget-object v1, p0, Lcom/baidu/location/b/b;->d:Landroid/telephony/TelephonyManager;
smali/com/baidu/location/b/b.smali:    iget-object v1, p0, Lcom/baidu/location/b/b;->d:Landroid/telephony/TelephonyManager;
smali/com/baidu/location/b/b.smali:    invoke-virtual {v1}, Landroid/telephony/TelephonyManager;->getNetworkType()I
smali/com/baidu/location/b/b.smali:    iget-object v0, p0, Lcom/baidu/location/b/b;->d:Landroid/telephony/TelephonyManager;
smali/com/baidu/location/b/b.smali:    iget-object v1, p0, Lcom/baidu/location/b/b;->d:Landroid/telephony/TelephonyManager;
smali/com/baidu/location/b/b.smali:    iget-object v1, p0, Lcom/baidu/location/b/b;->d:Landroid/telephony/TelephonyManager;
smali/com/baidu/location/b/b.smali:    invoke-virtual {v1}, Landroid/telephony/TelephonyManager;->getSimState()I
smali/com/baidu/location/b/b.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/baidu/location/b/b.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSubscriberId()Ljava/lang/String;
smali/com/baidu/location/d/b.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/baidu/location/d/b.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;

Getui

I belive this SDK is related to Getui. The strings in the code below lead me to this particular github repo as well.

  • isNetworkRoaming Returns true if the device is considered roaming on the current network, for GSM purposes.
  • getDeviceID Returns the unique device ID, for example, the IMEI for GSM and the MEID or ESN for CDMA phones. Return null if device ID is not available.
  • getSubscriberID Returns the unique subscriber ID, for example, the IMSI for a GSM phone. Return null if it is unavailable.
  • getSimCountryIso Returns the ISO country code equivalent for the SIM provider’s country code.
smali/com/igexin/download/h.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/igexin/download/h.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->isNetworkRoaming()Z
smali/com/igexin/push/core/g.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/igexin/push/core/g.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
smali/com/igexin/push/core/g.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSubscriberId()Ljava/lang/String;
smali/com/igexin/push/util/b.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/igexin/push/util/b.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
smali/com/meitu/feedback/a/c.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/feedback/a/c.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSimCountryIso()Ljava/lang/String;

Meitu Itself

The Meitu app itself also grabs phone information.

  • getDeviceID Returns the unique device ID, for example, the IMEI for GSM and the MEID or ESN for CDMA phones. Return null if device ID is not available. *getSimSerialNumber Returns the serial number of the SIM, if applicable. Return null if it is unavailable.
  • getSimStateReturns a constant indicating the state of the default SIM card.
  • getNetworkOperatorName Returns the alphabetic name of current registered operator.
  • getSimCountryIso Returns the ISO country code equivalent for the SIM provider’s country code.
smali/com/meitu/ibon/utils/SevenElevenOperationUtils.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/ibon/utils/SevenElevenOperationUtils.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
smali/com/meitu/ibon/utils/SevenElevenOperationUtils.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSimSerialNumber()Ljava/lang/String;
smali/com/meitu/library/analytics/utils/c.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/library/analytics/utils/c.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
smali/com/meitu/library/analytics/utils/k.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/library/analytics/utils/k.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSimSerialNumber()Ljava/lang/String;
smali/com/meitu/library/analytics/utils/k.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/library/analytics/utils/k.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSimState()I
smali/com/meitu/library/analytics/utils/k.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getNetworkOperatorName()Ljava/lang/String;
smali/com/meitu/library/analytics/utils/k.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/library/analytics/utils/k.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSimState()I
smali/com/meitu/library/analytics/utils/k.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSimCountryIso()Ljava/lang/String;
smali/com/meitu/library/util/c/a.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/library/util/c/a.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;

Meitu Analytics

Looks like the developr has their own anlaytics library as well. Which is actually amusing since it collects more information then the Ad networks ;)

  • getDeviceID Returns the unique device ID, for example, the IMEI for GSM and the MEID or ESN for CDMA phones. Return null if device ID is not available.
  • getSimStateReturns a constant indicating the state of the default SIM card. *getNetworkOperatorName Returns the alphabetic name of current registered operator.
  • getSimSerialNumber Returns the serial number of the SIM, if applicable. Return null if it is unavailable.
  • getSimCountryIso Returns the ISO country code equivalent for the SIM provider’s country code.
mali/com/meitu/mtbusinessanalytics/util/MTAnalyticsDeviceUtil.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/mtbusinessanalytics/util/MTAnalyticsDeviceUtil.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
smali/com/meitu/mtbusinessanalytics/util/MTAnalyticsTelephonyUtil.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/mtbusinessanalytics/util/MTAnalyticsTelephonyUtil.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSimState()I
smali/com/meitu/mtbusinessanalytics/util/MTAnalyticsTelephonyUtil.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getNetworkOperatorName()Ljava/lang/String;
smali/com/meitu/mtbusinessanalytics/util/MTAnalyticsTelephonyUtil.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/mtbusinessanalytics/util/MTAnalyticsTelephonyUtil.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSimSerialNumber()Ljava/lang/String;
smali/com/meitu/mtbusinesskit/utils/MtbAdSimUtil.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/mtbusinesskit/utils/MtbAdSimUtil.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSimState()I
smali/com/meitu/mtbusinesskit/utils/MtbAdSimUtil.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSimCountryIso()Ljava/lang/String;
smali/com/meitu/mtbusinesskit/utils/MtbAnalyticsSystemUtil.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/mtbusinesskit/utils/MtbAnalyticsSystemUtil.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
smali/com/meitu/mtbusinesskit/utils/MtbAnalyticsSystemUtil.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/mtbusinesskit/utils/MtbAnalyticsSystemUtil.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
mali/com/meitu/pushagent/c/o.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/pushagent/c/o.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSimCountryIso()Ljava/lang/String;
smali/com/meitu/pushagent/getui/api/b.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/meitu/pushagent/getui/api/b.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getSimCountryIso()Ljava/lang/String;

Tencent

This little ad network only has one api call

smali/com/tencent/open/utils/n.smali:    check-cast v0, Landroid/telephony/TelephonyManager;
smali/com/tencent/open/utils/n.smali:    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getPhoneType()I

MODIFY_AUDIO_SETTINGS

TLDR Don’t worry about this one.

This permission is used for modifying general audio settings. I found only three usages of it in the android code base and all them related to meitu. They are the following

Aside from setting RingerMode I see no reason to be concerned here.

* smali/com/meitu/camera/CameraFragment.smali:    invoke-virtual {v0}, Landroid/media/AudioManager;->getRingerMode()I
* smali/com/meitu/camera/CameraFragment.smali:    invoke-virtual {v0, v1}, Landroid/media/AudioManager;->setRingerMode(I)V
* smali/com/meitu/camera/CameraFragment.smali:    invoke-virtual {v1, v2}, Landroid/media/AudioManager;->setRingerMode(I)V
* smali/com/meitu/library/camera/e/i.smali:.field private c:Landroid/media/AudioManager;
* smali/com/meitu/library/camera/e/i.smali:    iput-object v0, p0, Lcom/meitu/library/camera/e/i;->c:Landroid/media/AudioManager;
* smali/com/meitu/library/camera/e/i.smali:    check-cast v0, Landroid/media/AudioManager;
* smali/com/meitu/library/camera/e/i.smali:    iput-object v0, p0, Lcom/meitu/library/camera/e/i;->c:Landroid/media/AudioManager;
* smali/com/meitu/library/camera/e/i.smali:    iget-object v0, p0, Lcom/meitu/library/camera/e/i;->c:Landroid/media/AudioManager;
* smali/com/meitu/library/camera/e/i.smali:    invoke-virtual {v0, v3}, Landroid/media/AudioManager;->getStreamVolume(I)I
* smali/com/meitu/library/camera/e/i.smali:    iget-object v1, p0, Lcom/meitu/library/camera/e/i;->c:Landroid/media/AudioManager;
* smali/com/meitu/library/camera/e/i.smali:    invoke-virtual {v1, v3}, Landroid/media/AudioManager;->getStreamMaxVolume(I)I

Location Data

TLDR The Application has the capability to grab very precise location data about its users.

For android devices there are two types of location data permissions. “If your application only has the coarse permission then it will not have access to the GPS or passive location providers. Other providers will still return location results, but the update rate will be throttled and the exact location will be obfuscated to a coarse level of accuracy.” api info)

The application asks for both location types Coarse Location and Course Network Provider:

Baidu

  • requestLocationUpdates This one can tailor the frequency of checkins, and accuracy of location to save on battery life…how thoughtful
  • getAllCellInfo Returns all observed cell information from all radios on the device including the primary and neighboring cells. Calling this method does not trigger a call to onCellInfoChanged(), or change the rate at which onCellInfoChanged() is called. The list can include one or more CellInfoGsm, CellInfoCdma, CellInfoLte, and CellInfoWcdma objects, in any combination. On devices with multiple radios it is typical to see instances of one or more of any these in the list. In addition, zero, one, or more of the returned objects may be considered registered; that is, their CellInfo.isRegistered() methods may return true.
  • getCellLocation Returns the current location of the device. If there is only one radio in the device and that radio has an LTE connection, this method will return null. The implementation must not to try add LTE identifiers into the existing cdma/gsm classes.
  • isProviderEnabled Returns the current enabled/disabled status of the given provider.

If the user has enabled this provider in the Settings menu, true is returned otherwise false is returned

Callers should instead use LOCATION_MODE unless they depend on provider-specific APIs such as requestLocationUpdates(String, long, float, LocationListener).

  • getLastKnownLocation Returns a Location indicating the data from the last known location fix obtained from the given provider.

This can be done without starting the provider. Note that this location could be out-of-date, for example if the device was turned off and moved to another location.

mali/com/baidu/location/b/e.smali:.field private e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    iput-object v2, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:.method static synthetic d(Lcom/baidu/location/b/e;)Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    iget-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    check-cast v0, Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    iput-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    iget-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    invoke-virtual {v0, v1}, Landroid/location/LocationManager;->addGpsStatusListener(Landroid/location/GpsStatus$Listener;)Z
smali/com/baidu/location/b/e.smali:    iget-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    invoke-virtual/range {v0 .. v5}, Landroid/location/LocationManager;->requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V
smali/com/baidu/location/b/e.smali:    iget-object v1, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    invoke-virtual {v1, v2, v3, v0}, Landroid/location/LocationManager;->sendExtraCommand(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Z
smali/com/baidu/location/b/e.smali:    iget-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    invoke-virtual/range {v0 .. v5}, Landroid/location/LocationManager;->requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V
smali/com/baidu/location/b/e.smali:    iget-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    invoke-virtual {v0, v1}, Landroid/location/LocationManager;->addNmeaListener(Landroid/location/GpsStatus$NmeaListener;)Z
smali/com/baidu/location/b/e.smali:    iget-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    iget-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    invoke-virtual {v0, v1}, Landroid/location/LocationManager;->removeUpdates(Landroid/location/LocationListener;)V
smali/com/baidu/location/b/e.smali:    iget-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    invoke-virtual {v0, v1}, Landroid/location/LocationManager;->removeNmeaListener(Landroid/location/GpsStatus$NmeaListener;)V
smali/com/baidu/location/b/e.smali:    iget-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    iget-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    invoke-virtual {v0, v1}, Landroid/location/LocationManager;->removeGpsStatusListener(Landroid/location/GpsStatus$Listener;)V
smali/com/baidu/location/b/e.smali:    iget-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/e.smali:    invoke-virtual {v0, v1}, Landroid/location/LocationManager;->removeUpdates(Landroid/location/LocationListener;)V
smali/com/baidu/location/b/e.smali:    iput-object v0, p0, Lcom/baidu/location/b/e;->e:Landroid/location/LocationManager;
smali/com/baidu/location/b/f.smali:    invoke-static {v1}, Lcom/baidu/location/b/e;->d(Lcom/baidu/location/b/e;)Landroid/location/LocationManager;
smali/com/baidu/location/b/f.smali:    invoke-static {v2}, Lcom/baidu/location/b/e;->d(Lcom/baidu/location/b/e;)Landroid/location/LocationManager;
smali/com/baidu/location/b/f.smali:    invoke-virtual {v2, v3}, Landroid/location/LocationManager;->getGpsStatus(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;
smali/com/baidu/location/b/f.smali:    invoke-static {v1}, Lcom/baidu/location/b/e;->d(Lcom/baidu/location/b/e;)Landroid/location/LocationManager;
smali/com/baidu/location/b/f.smali:    invoke-virtual {v1, v2}, Landroid/location/LocationManager;->getGpsStatus(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;
smali/com/meitu/library/analytics/b/c/a.smali:    check-cast v0, Landroid/location/LocationManager;

Meitu

  • isProviderEnabled Returns the current enabled/disabled status of the given provider.

If the user has enabled this provider in the Settings menu, true is returned otherwise false is returned

Callers should instead use LOCATION_MODE unless they depend on provider-specific APIs such as requestLocationUpdates(String, long, float, LocationListener).

  • getLastKnownLocation Returns a Location indicating the data from the last known location fix obtained from the given provider.

This can be done without starting the provider. Note that this location could be out-of-date, for example if the device was turned off and moved to another location.

smali/com/meitu/library/analytics/b/c/a.smali:    check-cast v0, Landroid/location/LocationManager;
smali/com/meitu/library/analytics/b/c/a.smali:    invoke-virtual {v0, v3}, Landroid/location/LocationManager;->isProviderEnabled(Ljava/lang/String;)Z
smali/com/meitu/library/analytics/b/c/a.smali:    invoke-virtual {v0, v3}, Landroid/location/LocationManager;->getLastKnownLocation(Ljava/lang/String;)Landroid/location/Location;
smali/com/meitu/library/analytics/b/c/a.smali:    invoke-virtual {v0, v3}, Landroid/location/LocationManager;->isProviderEnabled(Ljava/lang/String;)Z
smali/com/meitu/library/analytics/b/c/a.smali:    invoke-virtual {v0, v3}, Landroid/location/LocationManager;->getLastKnownLocation(Ljava/lang/String;)Landroid/location/Location;
smali/com/meitu/library/analytics/b/c/a.smali:    invoke-virtual {v0, v3}, Landroid/location/LocationManager;->isProviderEnabled(Ljava/lang/String;)Z
smali/com/meitu/library/analytics/b/c/a.smali:    invoke-virtual {v0, v3}, Landroid/location/LocationManager;->getLastKnownLocation(Ljava/lang/String;)Landroid/location/Location;

Meitu Weather

isProviderEnabled Returns the current enabled/disabled status of the given provider.

If the user has enabled this provider in the Settings menu, true is returned otherwise false is returned

Callers should instead use LOCATION_MODE unless they depend on provider-specific APIs such as requestLocationUpdates(String, long, float, LocationListener).

requestLocationUpdates Register for location updates using the named provider, and a callback on the specified looper thread.

mali/com/meitu/library/uxkit/util/weather/c.smali:    check-cast v0, Landroid/location/LocationManager;
smali/com/meitu/library/uxkit/util/weather/c.smali:    invoke-virtual {v0, v1}, Landroid/location/LocationManager;->isProviderEnabled(Ljava/lang/String;)Z
smali/com/meitu/library/uxkit/util/weather/c.smali:    invoke-virtual {v0, v1}, Landroid/location/LocationManager;->isProviderEnabled(Ljava/lang/String;)Z
smali/com/meitu/library/uxkit/util/weather/location/b.smali:.field private static h:Landroid/location/LocationManager;
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    sget-object v0, Lcom/meitu/library/uxkit/util/weather/location/b;->h:Landroid/location/LocationManager;
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    sget-object v0, Lcom/meitu/library/uxkit/util/weather/location/b;->h:Landroid/location/LocationManager;
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    invoke-virtual {v0, v1}, Landroid/location/LocationManager;->isProviderEnabled(Ljava/lang/String;)Z
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    sget-object v0, Lcom/meitu/library/uxkit/util/weather/location/b;->h:Landroid/location/LocationManager;
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    invoke-virtual/range {v0 .. v5}, Landroid/location/LocationManager;->requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    sget-object v0, Lcom/meitu/library/uxkit/util/weather/location/b;->h:Landroid/location/LocationManager;
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    invoke-virtual {v0, v1}, Landroid/location/LocationManager;->isProviderEnabled(Ljava/lang/String;)Z
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    sget-object v0, Lcom/meitu/library/uxkit/util/weather/location/b;->h:Landroid/location/LocationManager;
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    invoke-virtual/range {v0 .. v5}, Landroid/location/LocationManager;->requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    check-cast v0, Landroid/location/LocationManager;
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    sput-object v0, Lcom/meitu/library/uxkit/util/weather/location/b;->h:Landroid/location/LocationManager;
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    sget-object v0, Lcom/meitu/library/uxkit/util/weather/location/b;->h:Landroid/location/LocationManager;
smali/com/meitu/library/uxkit/util/weather/location/b.smali:    sget-object v0, Lcom/meitu/library/uxkit/util/weather/location/b;->h:Landroid/location/LocationManager;