【发布时间】:2018-08-31 15:08:23
【问题描述】:
我正在尝试让我的 Android Wear 表盘确定设备的当前位置。这以前有效,但在卸载并重新安装软件包后,它就失败了。我认为我做的一切都是正确的,而且它已经像那样工作了。我不知道问题是什么,甚至不知道如何抓住它。以下是相关代码:
class MyWatchFaceService : CanvasWatchFaceService() {
override fun onCreateEngine(): Engine {
return Engine()
}
inner class Engine : CanvasWatchFaceService.Engine() {
private lateinit var fusedLocationClient: FusedLocationProviderClient
private var lastKnownLocation: Location? = null
override fun onCreate(holder: SurfaceHolder) {
super.onCreate(holder)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this@MyWatchFaceService)
updateLocation()
}
fun updateLocation() {
Logger.getAnonymousLogger().info("updateLocation")
try {
fusedLocationClient.lastLocation
.addOnSuccessListener { location: Location? ->
if (location != null) {
// Location available, use it and update later
Logger.getAnonymousLogger().info("- location available")
lastKnownLocation = location
}
}
.addOnFailureListener {ex: Exception ->
Logger.getAnonymousLogger().warning("- location NOT accessible (inner): " + ex.toString())
}
} catch (ex: SecurityException) {
// Nothing we can do, no location available
Logger.getAnonymousLogger().warning("- location NOT accessible: " + ex.toString())
}
Logger.getAnonymousLogger().info("updateLocation (end)")
}
}
}
然后我在日志中找到这个:
03-22 09:41:59.521 7390-7390/de.unclassified.watchface1 I/null: updateLocation
03-22 09:41:59.536 7390-7390/de.unclassified.watchface1 I/null: updateLocation (end)
03-22 09:41:59.830 7390-7405/de.unclassified.watchface1 E/AndroidRuntime: FATAL EXCEPTION: GoogleApiHandler
Process: de.unclassified.watchface1, PID: 7390
java.lang.SecurityException: Client must have ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to perform any location operations.
at android.os.Parcel.readException(Parcel.java:1684)
at android.os.Parcel.readException(Parcel.java:1637)
at com.google.android.gms.internal.zzeu.zza(Unknown Source)
at com.google.android.gms.internal.zzcfa.zzif(Unknown Source)
at com.google.android.gms.internal.zzcfd.getLastLocation(Unknown Source)
at com.google.android.gms.internal.zzcfk.getLastLocation(Unknown Source)
at com.google.android.gms.location.zzg.zza(Unknown Source)
at com.google.android.gms.common.api.internal.zze.zza(Unknown Source)
at com.google.android.gms.common.api.internal.zzbo.zzb(Unknown Source)
at com.google.android.gms.common.api.internal.zzbo.zzaiw(Unknown Source)
at com.google.android.gms.common.api.internal.zzbo.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zzac.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zzn.zzakr(Unknown Source)
at com.google.android.gms.common.internal.zze.zzw(Unknown Source)
at com.google.android.gms.common.internal.zzi.zzaks(Unknown Source)
at com.google.android.gms.common.internal.zzh.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.os.HandlerThread.run(HandlerThread.java:61)
03-22 09:41:59.843 7390-7405/de.unclassified.watchface1 I/Process: Sending signal. PID: 7390 SIG: 9
所以它确实调用了我的updateLocation 函数,然后再次离开,然后出现异常。但据我所知,这并不是调用我的代码。它从何而来?它没有包含源文件的堆栈跟踪。
包已经拥有所有相关权限,和以前一样,还有一些其他任务的权限。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
那么这里发生了什么,为什么 try/catch 和失败监听器都没有做某事?
【问题讨论】:
-
您需要询问
Runtime permission。
标签: android kotlin wear-os android-permissions android-location