数据获取 - 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)

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)

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 信息。

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)

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)

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 信息。

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 信息。

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 page helpful?

Have any questions or suggestions?