数据获取 - Android

    在 Android 端收集 Airbridge 事件所需的数据。

    数据获取(Fetching)

    请参考以下内容。

    Airbridge Device ID

    Airbridge 的设备标识符。(示例:82a16ec9-a273-48b6-9bb2-017eab641109)

    Android SDK (v4)

    123456789101112
    import co.ab180.airbridge.Airbridge
    import co.ab180.airbridge.common.onSuccess
    import co.ab180.airbridge.common.onFailure
    
    Airbridge.fetchDeviceUUID(
        onSuccess = { deviceUUID ->
    
        },
        onFailure = { throwable ->
    
        }
    )

    Android SDK (旧版本)

    123456789101112
    import co.ab180.airbridge.Airbridge
    import co.ab180.airbridge.AirbridgeCallback
    
    Airbridge.getDeviceInfo().getUUID(object : AirbridgeCallback.SimpleCallback<String>() {
            override fun onSuccess(result: String) {
      
        }
    
        override fun onFailure(throwable: Throwable) {
      
        }
    })

    Airbridge Generated UUID

    Airbridge 在安装时按设备生成的随机 UUID。(示例:82a16ec9-a273-48b6-9bb2-017eab641109)

    Android SDK (v4)

    123456789101112
    import co.ab180.airbridge.Airbridge
    import co.ab180.airbridge.common.onSuccess
    import co.ab180.airbridge.common.onFailure
    
    Airbridge.fetchAirbridgeGeneratedUUID(
        onSuccess = { airbridgeGeneratedUUID ->
    
        },
        onFailure = { throwable ->
    
        }
    )

    Android SDK (旧版本)

    12345
    import co.ab180.airbridge.Airbridge
    
    Airbridge.fetchAirbridgeGeneratedUUID { uuid ->
    
    }

    App Set ID

    用于子渠道识别特定用户安装了哪款 App 的唯一 ID。(示例:82a16ec9-a273-48b6-9bb2-017eab641109)

    123456789101112
    import com.google.android.gms.appset.AppSet
    import com.google.android.gms.appset.AppSetIdClient
    import com.google.android.gms.appset.AppSetIdInfo
    import com.google.android.gms.tasks.Task
    
    val client = AppSet.getClient(applicationContext) as AppSetIdClient
    val task: Task<AppSetIdInfo> = client.appSetIdInfo as Task<AppSetIdInfo>
    
    task.addOnSuccessListener({
        val appSetIdScope: Int = it.scope
        val appSetId: String = it.id
    })

    GAID (Google Advertising ID)

    Google 发行的广告 ID。(示例:82a16ec9-a273-48b6-9bb2-017eab641109)

    Android SDK (v4)

    1234567891011
    import co.ab180.airbridge.Airbridge
    
    Airbridge.fetchGoogleAdvertisingIdInfo(
        onSuccess = { result ->
            // GAID
            result.id
            // LAT
            result.isLimitAdTrackingEnabled
        },
        onFailure = { throwable -> }
    )

    Android SDK (Previous)

    1234567891011121314
    import co.ab180.airbridge.Airbridge
    import co.ab180.airbridge.AirbridgeCallback
    import co.ab180.airbridge.AdvertisingIdInfo
    
    Airbridge.getDeviceInfo().getAdvertisingIdInfo(object : AirbridgeCallback.SimpleCallback<AdvertisingIdInfo>() {
            override fun onSuccess(result: AdvertisingIdInfo) {
                result.getId() // GAID
            result.getLimitAdTrackingEnabled() // LAT
        }
    
        override fun onFailure(throwable: Throwable) {
      
        }
    })

    Google Limit Ad Tracking

    设备的 Google Limit Ad Tracking(LAT,限制广告追踪)信息。(示例:true)

    Android SDK (v4)

    1234567891011
    import co.ab180.airbridge.Airbridge
    
    Airbridge.fetchGoogleAdvertisingIdInfo(
        onSuccess = { result ->
            // GAID
            result.id
            // LAT
            result.isLimitAdTrackingEnabled
        },
        onFailure = { throwable -> }
    )

    Android SDK (Previous)

    1234567891011121314
    import co.ab180.airbridge.Airbridge
    import co.ab180.airbridge.AirbridgeCallback
    import co.ab180.airbridge.AdvertisingIdInfo
    
    Airbridge.getDeviceInfo().getAdvertisingIdInfo(object : AirbridgeCallback.SimpleCallback<AdvertisingIdInfo>() {
            override fun onSuccess(result: AdvertisingIdInfo) {
                result.getId() // GAID
            result.getLimitAdTrackingEnabled() // LAT
        }
    
        override fun onFailure(throwable: Throwable) {
      
        }
    })

    Google Install Referrer

    Google Play Service 传递的 Install Referrer 信息。

    Android SDK (v4)

    123456
    import co.ab180.airbridge.Airbridge
    
    Airbridge.fetchGoogleInstallReferrerDetails(
        onSuccess = { result -> },
        onFailure = { throwable -> }
    )

    Android SDK (Previous)

    1234567891011121314151617
    import co.ab180.airbridge.Airbridge
    import co.ab180.airbridge.AirbridgeCallback
    import co.ab180.airbridge.ReferrerDetails
      
    Airbridge.getDeviceInfo().getGoogleInstallReferrerDetails(object : AirbridgeCallback<ReferrerDetails?> {
      override fun onSuccess(result: ReferrerDetails?) {
      
      }
      
      override fun onFailure(throwable: Throwable) {
    
      }
      
      override fun onComplete() {
      
      }
    })

    OAID (Huawei Advertising ID)

    华为(Huawei)发行的广告 ID。(示例:82a16ec9-a273-48b6-9bb2-017eab641109)

    Android SDK (v4)

    1234567891011
    import co.ab180.airbridge.Airbridge
    
    Airbridge.fetchHuaweiAdvertisingIdInfo(
        onSuccess = { result ->
            // GAID
            result.id
            // LAT
            result.isLimitAdTrackingEnabled
        },
        onFailure = { throwable -> }
    )

    Android SDK (Previous)

    1234567891011121314
    import co.ab180.airbridge.Airbridge
    import co.ab180.airbridge.AirbridgeCallback
    import co.ab180.airbridge.AdvertisingIdInfo
    
    Airbridge.getDeviceInfo().getHuaweiAdvertisingIdInfo(object : AirbridgeCallback.SimpleCallback<AdvertisingIdInfo>() {
            override fun onSuccess(result: AdvertisingIdInfo) {
                result.getId() // OAID
            result.getLimitAdTrackingEnabled() // LAT
        }
    
        override fun onFailure(throwable: Throwable) {
      
        }
    })

    Huawei Limit Ad Tracking

    设备的 Huawei Limit Ad Tracking 信息。(示例:true)

    Android SDK (v4)

    1234567891011
    import co.ab180.airbridge.Airbridge
    
    Airbridge.fetchHuaweiAdvertisingIdInfo(
        onSuccess = { result ->
            // GAID
            result.id
            // LAT
            result.isLimitAdTrackingEnabled
        },
        onFailure = { throwable -> }
    )

    Android SDK (Previous)

    1234567891011121314
    import co.ab180.airbridge.Airbridge
    import co.ab180.airbridge.AirbridgeCallback
    import co.ab180.airbridge.AdvertisingIdInfo
    
    Airbridge.getDeviceInfo().getHuaweiAdvertisingIdInfo(object : AirbridgeCallback.SimpleCallback<AdvertisingIdInfo>() {
            override fun onSuccess(result: AdvertisingIdInfo) {
                result.getId() // OAID
            result.getLimitAdTrackingEnabled() // LAT
        }
    
        override fun onFailure(throwable: Throwable) {
      
        }
    })

    Huawei Install Referrer

    华为移动服务(Huawei Mobile Services,HMS)传递的 Install Referrer 信息。

    Android SDK (v4)

    123456
    import co.ab180.airbridge.Airbridge
    
    Airbridge.fetchHuaweiInstallReferrerDetails(
        onSuccess = { result -> },
        onFailure = { throwable -> }
    )

    Android SDK (Previous)

    1234567891011121314151617
    import co.ab180.airbridge.Airbridge
    import co.ab180.airbridge.AirbridgeCallback
    import co.ab180.airbridge.ReferrerDetails
      
    Airbridge.getDeviceInfo().getHuaweiInstallReferrerDetails(object : AirbridgeCallback<ReferrerDetails?> {
      override fun onSuccess(result: ReferrerDetails?) {
      
      }
      
      override fun onFailure(throwable: Throwable) {
    
      }
      
      override fun onComplete() {
      
      }
    })

    One Store Install Referrer

    One Store 传递的 Install Referrer 信息。

    Android SDK (v4)

    Android SDK (v4) 不支持 One Store 安装来源追踪功能。

    Android SDK (Previous)

    1234567891011121314151617
    import co.ab180.airbridge.Airbridge
    import co.ab180.airbridge.AirbridgeCallback
    import co.ab180.airbridge.ReferrerDetails
      
    Airbridge.getDeviceInfo().getOneStoreInstallReferrerDetails(object : AirbridgeCallback<ReferrerDetails?> {
      override fun onSuccess(result: ReferrerDetails?) {
      
      }
      
      override fun onFailure(throwable: Throwable) {
    
      }
      
      override fun onComplete() {
      
      }
    })

    Device Model

    设备的型号名称。(示例:Pixel 3a)

    123
    import android.os.Build
    
    Build.MODEL // ex : Pixel 3a

    Device Manufacturer

    设备的制造商信息。(示例:Google)

    123
    import android.os.Build
    
    Build.MANUFACTURER // ex : Google

    OS Version

    设备的 OS 版本。(示例:10)

    123
    import android.os.Build
    
    Build.VERSION.RELEASE // ex : 10

    Locale

    设备的 Locale 设置值。(示例:en-US)

    1234
    import java.util.*
    
    // ex : en-US
    "${Locale.getDefault().language}-${Locale.getDefault().country}"

    Timezone

    设备的时区设置值。(示例:US/Pacific)

    123
    import java.util.*
    
    TimeZone.getDefault().id // ex : US/Pacific

    Orientation

    设备的屏幕方向值,可为 “portrait” 或 “landscape”。

    123456789
    import android.content.res.Configuration
    import android.content.Context
    
    var orientation: String
    if (context.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
        orientation = "portrait"
    } else {
        orientation = "landscape"
    }

    Screen Density

    设备的实际屏幕密度值。(示例:3.000)

    12345678910111213141516171819202122232425
    import android.util.DisplayMetrics
    import android.view.Display
    import android.view.WindowManager
    import android.content.Context
    
    val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        val realDisplayMetrics = DisplayMetrics()
        windowManager.defaultDisplay.getRealMetrics(realDisplayMetrics)
        val width = realDisplayMetrics.widthPixels
        val height = realDisplayMetrics.heightPixels
        val dpi = realDisplayMetrics.densityDpi
    } else {
        val displayMetrics = DisplayMetrics()
        windowManager.defaultDisplay.getMetrics(displayMetrics)
        try {
            val width = Display::class.java
                    .getMethod("getRawWidth")
                    .invoke(windowManager.defaultDisplay) as Int
            val height = Display::class.java
                    .getMethod("getRawHeight")
                    .invoke(windowManager.defaultDisplay) as Int
            val dpi = displayMetrics.densityDpi
        } catch (_: Exception) { }
    }

    Screen Width

    设备的实际屏幕宽度值。(示例:375.0)

    12345678910111213141516171819202122232425
    import android.util.DisplayMetrics
    import android.view.Display
    import android.view.WindowManager
    import android.content.Context
    
    val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        val realDisplayMetrics = DisplayMetrics()
        windowManager.defaultDisplay.getRealMetrics(realDisplayMetrics)
        val width = realDisplayMetrics.widthPixels
        val height = realDisplayMetrics.heightPixels
        val dpi = realDisplayMetrics.densityDpi
    } else {
        val displayMetrics = DisplayMetrics()
        windowManager.defaultDisplay.getMetrics(displayMetrics)
        try {
            val width = Display::class.java
                    .getMethod("getRawWidth")
                    .invoke(windowManager.defaultDisplay) as Int
            val height = Display::class.java
                    .getMethod("getRawHeight")
                    .invoke(windowManager.defaultDisplay) as Int
            val dpi = displayMetrics.densityDpi
        } catch (_: Exception) { }
    }

    Screen Height

    设备的实际屏幕高度值。(示例:667.0)

    12345678910111213141516171819202122232425
    import android.util.DisplayMetrics
    import android.view.Display
    import android.view.WindowManager
    import android.content.Context
    
    val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        val realDisplayMetrics = DisplayMetrics()
        windowManager.defaultDisplay.getRealMetrics(realDisplayMetrics)
        val width = realDisplayMetrics.widthPixels
        val height = realDisplayMetrics.heightPixels
        val dpi = realDisplayMetrics.densityDpi
    } else {
        val displayMetrics = DisplayMetrics()
        windowManager.defaultDisplay.getMetrics(displayMetrics)
        try {
            val width = Display::class.java
                    .getMethod("getRawWidth")
                    .invoke(windowManager.defaultDisplay) as Int
            val height = Display::class.java
                    .getMethod("getRawHeight")
                    .invoke(windowManager.defaultDisplay) as Int
            val dpi = displayMetrics.densityDpi
        } catch (_: Exception) { }
    }

    Longitude

    当前设备 LastKnownLocation 的经度值。

    12345678910111213141516
    import android.location.Location
    import android.location.LocationManager
    
    val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
    val gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
    val netLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
    val bestLocation: Location = when {
        (gpsLocation != null) and (netLocation != null) -> if (gpsLocation.accuracy < netLocation.accuracy) { gpsLocation } else { netLocation }
        (gpsLocation != null) -> gpsLocation
        else -> netLocation
    } ?: return null
    
    val latitude = bestLocation?.latitude
    val longitude = bestLocation?.longitude
    val altitude = bestLocation?.altitude
    val speed = bestLocation?.speed

    Latitude

    当前设备 LastKnownLocation 的纬度值。

    12345678910111213141516
    import android.location.Location
    import android.location.LocationManager
    
    val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
    val gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
    val netLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
    val bestLocation: Location = when {
        (gpsLocation != null) and (netLocation != null) -> if (gpsLocation.accuracy < netLocation.accuracy) { gpsLocation } else { netLocation }
        (gpsLocation != null) -> gpsLocation
        else -> netLocation
    } ?: return null
    
    val latitude = bestLocation?.latitude
    val longitude = bestLocation?.longitude
    val altitude = bestLocation?.altitude
    val speed = bestLocation?.speed

    Altitude

    当前设备 LastKnownLocation 的海拔值。

    12345678910111213141516
    import android.location.Location
    import android.location.LocationManager
    
    val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
    val gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
    val netLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
    val bestLocation: Location = when {
        (gpsLocation != null) and (netLocation != null) -> if (gpsLocation.accuracy < netLocation.accuracy) { gpsLocation } else { netLocation }
        (gpsLocation != null) -> gpsLocation
        else -> netLocation
    } ?: return null
    
    val latitude = bestLocation?.latitude
    val longitude = bestLocation?.longitude
    val altitude = bestLocation?.altitude
    val speed = bestLocation?.speed

    Speed

    当前设备 LastKnownLocation 的速度值。

    12345678910111213141516
    import android.location.Location
    import android.location.LocationManager
    
    val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
    val gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
    val netLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
    val bestLocation: Location = when {
        (gpsLocation != null) and (netLocation != null) -> if (gpsLocation.accuracy < netLocation.accuracy) { gpsLocation } else { netLocation }
        (gpsLocation != null) -> gpsLocation
        else -> netLocation
    } ?: return null
    
    val latitude = bestLocation?.latitude
    val longitude = bestLocation?.longitude
    val altitude = bestLocation?.altitude
    val speed = bestLocation?.speed

    Network Carrier

    该设备的移动通讯运营商信息。

    1234
    import android.telephony.TelephonyManager
    
    val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    val carrier = telephonyManager.networkOperatorName

    Bluetooth Status

    该设备的蓝牙使用状态。(示例:true)

    1234
    import android.bluetooth.BluetoothAdapter
    
    val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
    val enabled = bluetoothAdapter.isEnabled

    Cellular Status

    该设备的移动数据使用状态。(示例:true)

    1234567891011121314
    import android.net.ConnectivityManager
    import android.net.NetworkCapabilities
    import android.content.Context
    
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val activeNetwork = connectivityManager.activeNetwork
        val capabilities = connectivityManager.getNetworkCapabilities(activeNetwork)
        val cellularEnabled = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
    } else {
        val networkInfo = connectivityManager.activeNetworkInfo
        val cellularEnabled = (networkInfo.type == ConnectivityManager.TYPE_MOBILE)
    }

    Wifi Status

    该设备的 WiFi 数据使用状态。(示例:true)

    1234567891011121314
    import android.net.ConnectivityManager
    import android.net.NetworkCapabilities
    import android.content.Context
    
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val activeNetwork = connectivityManager.activeNetwork
        val capabilities = connectivityManager.getNetworkCapabilities(activeNetwork)
        val wifiEnabled = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
    } else {
        val networkInfo = connectivityManager.activeNetworkInfo
        val wifiEnabled = (networkInfo.type == ConnectivityManager.TYPE_WIFI)
    }

    Package Name

    该 App 的包名。(示例:co.ab180.ablog)

    12345678910
    import android.content.pm.PackageManager
    import android.content.Context
    
    var packageName = ""
    try {
        val packageInfo = context.packageManager.getPackageInfo(context.packageName, 0)
        packageName = packageInfo.packageName
    } catch (e: PackageManager.NameNotFoundException) {
    
    }

    Version

    该 App 的版本名称。(示例:1.0.0)

    12345678910
    import android.content.pm.PackageManager
    import android.content.Context
    
    var versionName = ""
    try {
        val packageInfo = context.packageManager.getPackageInfo(context.packageName, 0)
        versionName = packageInfo.versionName
    } catch (e: PackageManager.NameNotFoundException) {
    
    }

    Event Timestamp

    该事件的发送时间(Milliseconds)。(示例:1581043739682)

    1
    System.currentTimeMillis()

    Was this helpful?

    Any questions or suggestions?