尝试设置地理围栏时 GEOFENCE_NOT_AVAIBLE(代码 1000)
Posted
技术标签:
【中文标题】尝试设置地理围栏时 GEOFENCE_NOT_AVAIBLE(代码 1000)【英文标题】:GEOFENCE_NOT_AVAIBLE (code 1000) while trying to set up geofence 【发布时间】:2019-05-28 12:01:05 【问题描述】:该问题出现在比 Oreo 更早的 android 以及 Oreo 和更新版本的 Android 上。
即使完成了以下步骤,我也无法让地理围栏工作:
定位服务设置为高精度 Wi-Fi 和移动数据已启用 应用程序被授予位置权限 Google 服务已添加到项目中 Google 服务和 Play 商店是最新的并已安装在设备上 禁用电池优化(测试目的)如果启用了GPS_PROVIDER
和NETWORK_PROVIDER
,我已经检查了以下代码:
@Override
protected void onResume()
super.onResume();
LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER))
Log.e("Provider", "Provider is not avaible");
else if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER))
Log.v("Provider", "GPS Provider is avaible");
if (!manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
Log.e("Network Provider", "Provider is not avaible");
else if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
Log.v("Network Provider", "provider is avaible");
以上都给了我积极的结果,所以问题不可能在这里。
确切的错误:
电子/地理围栏:com.google.android.gms.common.api.ApiException:1000:
我在onCreate
的开头设置了mGeofencingClient
:
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGeofencingClient = LocationServices.getGeofencingClient(getApplicationContext());
我使用以下代码设置地理围栏:
mGeofenceList.add(
new Geofence.Builder()
.setRequestId("blablabla")
.setCircularRegion(50.32, 43.23, 232)
.setExpirationDuration(-1L)
.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER |
Geofence.GEOFENCE_TRANSITION_EXIT)
.build());
//
PermissionCheck mPermissionCheck = new PermissionCheck();
if (!mPermissionCheck.isPermissionGranted(getApplicationContext()))
mPermissionCheck.askForPermission(MainActivity.this);
return;
setGeofences();
private GeofencingRequest getGeofencingRequest()
if (mGeofenceList.isEmpty())
return null;
Log.v("mGeofenceList", mGeofenceList.toString());
GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER |
GeofencingRequest.INITIAL_TRIGGER_EXIT);
builder.addGeofences(mGeofenceList);
return builder.build();
private PendingIntent getGeofencePendingIntent()
if (mGeofencePendingIntent != null)
return mGeofencePendingIntent;
Intent intent = new Intent(getApplicationContext(), Geofencing.class);
mGeofencePendingIntent = PendingIntent.getService(getApplication(),
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return mGeofencePendingIntent;
@SuppressLint("MissingPermission")
private void setGeofences()
GeofencingRequest geofencingRequest = getGeofencingRequest();
PendingIntent pi = getGeofencePendingIntent();
mGeofencingClient.addGeofences(geofencingRequest, pi)
.addOnSuccessListener(MainActivity.this, new OnSuccessListener<Void>()
@Override
public void onSuccess(Void aVoid)
Log.d("Geofences", "geofencing set up succesfully");
Toast.makeText(MainActivity.this, "Geofences set up", Toast.LENGTH_SHORT).show();
)
.addOnFailureListener(MainActivity.this, new OnFailureListener()
@Override
public void onFailure(@NonNull Exception e)
Log.e("Geofence", e.toString());
LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER))
Log.e("Provider", "Provider is not avaible");
if (!manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
Log.e("Network Provider", "Provider is not avaible");
);
此代码与 Google 文档中的代码几乎相同。 清单权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-feature android:name="android.hardware.location.network"/>
<uses-feature android:name="android.hardware.location.gps"/>
分级:
implementation 'com.google.android.gms:play-services-maps:16.0.0'
implementation 'com.google.android.gms:play-services-location:16.0.0'
谁能看到我本可以做的事情? 提前致谢!
【问题讨论】:
您在什么时候设置mGeofencingClient
以及您提供哪个上下文?
我已经更新了代码。我在onCreate
的开头设置mGeofencingClient
并提供getApplicationContext
。
您是否已将 LocationServices 添加到 GoogleApiClient -(我只是在检查我的应用程序所做的事情的清单 - 无需发布代码)(1000 是 API 错误代码)?
您的意思是 Gradle 实现还是我应该以编程方式将 LocationServices 添加到 GoogleApiClient?如果以编程方式(在代码中)我没有,因为我使用了 LocationManager
好吧,我把这里弄得有点乱。在我的代码中,我有 LocationManager,它从 GPS_PROVIDER
和 NETWORK_PROVIDER
请求 LocationUpdates。我没有GoogleApiClient
的实例。 1000 显示为 API 错误代码
【参考方案1】:
好的,这是基于您的 OP 的地理围栏的最小工作程序 - 只是为了排除您的代码实现 - 为其他测试实现了几个其他接口,所以忽略。
“工作中”表示已成功添加地理围栏。:
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener, ActivityCompat.OnRequestPermissionsResultCallback
private List<Geofence> mGeofenceList = new ArrayList<>();
private GeofencingClient gfc;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
gfc = LocationServices.getGeofencingClient(getApplicationContext());
mGeofenceList.add(new Geofence.Builder().setRequestId("aa").setCircularRegion(50.32, 43.23, 232).setExpirationDuration(-1L).setTransitionTypes(
Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT).build());
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)
// Check Permissions Now
ActivityCompat.requestPermissions(this,
new String[]Manifest.permission.ACCESS_FINE_LOCATION,
1);
else
setGeofences();
private GeofencingRequest getGeofencingRequest()
if (mGeofenceList.isEmpty())
return null;
Log.v("mGeofenceList", mGeofenceList.toString());
GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER |
GeofencingRequest.INITIAL_TRIGGER_EXIT);
builder.addGeofences(mGeofenceList);
return builder.build();
private PendingIntent mGeofencePendingIntent;
private PendingIntent getGeofencePendingIntent()
if (mGeofencePendingIntent != null)
return mGeofencePendingIntent;
Intent intent = new Intent(getApplicationContext(), Object.class);
mGeofencePendingIntent = PendingIntent.getService(getApplication(),
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return mGeofencePendingIntent;
@SuppressLint("MissingPermission")
private void setGeofences()
GeofencingRequest geofencingRequest = getGeofencingRequest();
PendingIntent pi = getGeofencePendingIntent();
gfc.addGeofences(geofencingRequest, pi)
.addOnSuccessListener(this, new OnSuccessListener<Void>()
@Override
public void onSuccess(Void aVoid)
Log.d("Geofences", "geofencing set up succesfully");
Toast.makeText(MapsActivity.this, "Geofences set up", Toast.LENGTH_SHORT).show();
)
.addOnFailureListener(MapsActivity.this, new OnFailureListener()
@Override
public void onFailure(@NonNull Exception e)
Log.e("Geofence", e.toString());
LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER))
Log.e("Provider", "Provider is not avaible");
if (!manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
Log.e("Network Provider", "Provider is not avaible");
);
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
setGeofences();
经过一番调查,我发现我可以使用此代码示例重新创建 1000 错误代码。它基于此论坛帖子:https://androidforums.com/threads/error-adding-geofence-on-android-8.1289302/
所以按照这些指示(修复 - 但我翻转它们重新创建然后修复):
使用手机“设置 | 安全和位置 | 位置 | 模式” - 在“高精度、省电或仅设备”之间切换,直到您收到此提示(设置路径会因 android 版本而异):
在此示例代码中 - 如果您以“DISAGREE”响应,示例代码将生成 1000 错误代码;如果您重复并回复“同意”,它将成功添加地理围栏。
【讨论】:
感谢您的样品。最有趣的是,我仍然得到同样的错误(1000)。因此,在您的情况下,onSuccess
中的 addOnSuccessListener
会记录您,地理围栏是否已成功设置?
正确 - 不妨指定您的目标 api 级别和测试设备。
我已经在物理和模拟器上尝试了不同的 API 级别 - 从 26 到 28
发布您应用的 build.gradle - 这样我可以确定我使用的是相同的库级别 - 我使用的是 com.google.android.gms:play-services-location:16.0.0
不幸的是我也在用同样的【参考方案2】:
对于 android oreo 到 android S,请确保访问设置高优先级,因为地理围栏需要它,否则它会变成错误 1000
fun ceksetting()
val builder = LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest)
val locationRequest = LocationRequest()
locationRequest!!.interval = 50000
locationRequest!!.fastestInterval = 50000
locationRequest!!.smallestDisplacement = 170f // 170 m = 0.1 mile
locationRequest!!.priority = LocationRequest.PRIORITY_HIGH_ACCURACY //set according to your app function
val client: SettingsClient = LocationServices.getSettingsClient(requireActivity())
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())
task.addOnSuccessListener locationSettingsResponse ->
//here call your geofence
task.addOnFailureListener exception ->
if (exception is ResolvableApiException)
// Location settings are not satisfied, but this can be fixed
// by showing the user a dialog.
try
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
exception.startResolutionForResult(requireActivity(),
REQUEST_CHECK_SETTINGS)
catch (sendEx: IntentSender.SendIntentException)
// Ignore the error.
【讨论】:
以上是关于尝试设置地理围栏时 GEOFENCE_NOT_AVAIBLE(代码 1000)的主要内容,如果未能解决你的问题,请参考以下文章