Android 如果可能的话,如何每x次或每触发一次更新我的位置
我正在尝试开发一个应用程序来获取我的位置,并每x小时或当我的手机处于唤醒状态时将其写入firebase 我试着和工作经理讨论这个问题,但为了获得位置,我需要将活动传递给工人类,我不知道如何做到这一点 当我尝试将上下文强制转换为活动时,我得到了多个索引 这是主要的活动Android 如果可能的话,如何每x次或每触发一次更新我的位置,android,firebase,location,Android,Firebase,Location,我正在尝试开发一个应用程序来获取我的位置,并每x小时或当我的手机处于唤醒状态时将其写入firebase 我试着和工作经理讨论这个问题,但为了获得位置,我需要将活动传递给工人类,我不知道如何做到这一点 当我尝试将上下文强制转换为活动时,我得到了多个索引 这是主要的活动 PeriodicWorkRequest uploadWorkRequest = new PeriodicWorkRequest.Builder(UpdateWorker.class,3, TimeUnit.HOURS
PeriodicWorkRequest uploadWorkRequest = new PeriodicWorkRequest.Builder(UpdateWorker.class,3, TimeUnit.HOURS)
.setConstraints(constraints)
.setInputData(workerData)
.build();
WorkManager.getInstance(getApplicationContext()).enqueue(uploadWorkRequest);
这是我工人班的
public UpdateWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
fusedLocationClient = LocationServices.getFusedLocationProviderClient(context);
db = FirebaseFirestore.getInstance();
mAuth = FirebaseAuth.getInstance();
user = mAuth.getCurrentUser();
this.context = context;
}
@NonNull
@Override
public Result doWork() {
mAuth = FirebaseAuth.getInstance();
final FirebaseUser user = mAuth.getCurrentUser();
fusedLocationClient.getLastLocation()
.addOnSuccessListener((Activity) context.getApplicationContext(), new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
// Got last known location. In some rare situations this can be null.
if (location != null) {
db.collection(USERS).document(user.getEmail())
.set(new LocationDoc(user.getUid(), location.getLatitude(), location.getLongitude()),
SetOptions.merge());
}
}
});
return null;
}
public UpdateWorker(@NonNull上下文,@NonNull WorkerParameters workerParams){
超级(上下文、工作参数);
fusedLocationClient=LocationServices.getFusedLocationProviderClient(上下文);
db=FirebaseFirestore.getInstance();
mAuth=FirebaseAuth.getInstance();
user=mAuth.getCurrentUser();
this.context=上下文;
}
@非空
@凌驾
公共成果工作(){
mAuth=FirebaseAuth.getInstance();
最终FirebaseUser=mAuth.getCurrentUser();
fusedLocationClient.getLastLocation()文件
.addOnSuccessListener((活动)上下文.getApplicationContext(),新OnSuccessListener(){
@凌驾
成功时的公共无效(位置){
//已获取最后一个已知位置。在某些罕见情况下,此值可以为空。
如果(位置!=null){
db.collection(USERS).document(user.getEmail())
.set(新位置文档(user.getUid(),location.getLatitude(),location.getLongitude()),
SetOptions.merge());
}
}
});
返回null;
}
}这里使用的
getApplicationContext()
不是活动上下文-它是全局应用程序上下文,因此不能转换为活动:因此我如何将我的活动传递给我的工人类??一个activity
是一个context
所以只需在getInstance(此)中使用this
。我尝试了这一点,但它仍然给了我多索引的例外。您还必须修改addOnSuccessListener
以仅使用上下文,而不是应用程序上下文。