Android Geofencing – Pas d'intérêt?

J'ai un étrange problème.

J'ai implémenté la géodentification à l'aide des services Google. (Mise en œuvre ci-dessous) Sur mes appareils (Samsung Galaxy S et Moto X), ils fonctionnent parfaitement. Sur certains autres périphériques (HTC Incredible S, Galaxy Note), je ne reçois aucune intention de transition. Jamais. Avec une réparations GPS excellente et précise, debout au milieu de la clôture. Rien. Rien de suspect dans les journaux. Aucune erreur, aucun avertissement. Aucun problème ne vient, le service ne démarre pas.

  • Comment fonctionne Xamarin iOS et Android?
  • Service Android startService () et bindService ()
  • À l'heure actuelle, il ne reçoit pas de notification push GCM dans Mobile
  • Est-il possible d'autoriser l'utilisateur à sélectionner plusieurs fichiers dans un cadre d'accès au stockage ...?
  • La méthode OnDraw () étendue de SurfaceView n'a jamais été appelée
  • Comment puis-je déterminer la vitesse de l'Internet dans mon application Android?
  • Est-ce que quelqu'un a déjà vu une telle chose? (C'est étrange car je ne vois aucune connexion entre les périphériques qui fonctionnent et les périphériques qui ne le sont pas. Ce n'est pas un fabricant, ce n'est pas une version Android, Play Services était à jour sur tous.)

    La mise en oeuvre:

    Manifeste:

    <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="test.package" android:installLocation="auto" android:versionCode="17" android:versionName="1.1" > <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="test.package.MainActivity" android:label="Compass" android:screenOrientation="portrait" /> <service android:name="test.package.services.geofences.ShowNotificationService" android:label="@string/app_name" android:exported="false"/> <receiver android:name="test.package.services.geofences.UpdateGeofences"> <intent-filter> <action android:name="test.package.updateGeofecnes"/> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> 

    Mettre à jour Geofences:

      public class UpdateGeofences extends BroadcastReceiver implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, LocationClient.OnAddGeofencesResultListener, DataUpdateCallback { private LocationClient mLocationClient; private Context ctx; @Override public void onReceive(Context context, Intent intent) { Log.d("NOTICE", "Updating Geofences"); ctx = context; mLocationClient = new LocationClient(context, this, this); mLocationClient.connect(); } @Override public void onConnected(Bundle bundle) { GeofenceProvider geofenceProvider = new GeofenceProvider(ctx); geofenceProvider.open(); //reactivate geofences List<Geofence> geofences = geofenceProvider.getActiveGeofences(mLocationClient.getLastLocation()); Intent intent = new Intent(ctx, ShowNotificationService.class); PendingIntent pendingIntent = PendingIntent.getService(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); if (geofences.size() > 0) mLocationClient.addGeofences(geofences, pendingIntent, this); else mLocationClient.disconnect(); } @Override public void onAddGeofencesResult(int i, String[] strings) { // If adding the geofences was successful if (LocationStatusCodes.SUCCESS != i) { Log.e("Geofences", "Error adding geofences: "+ Arrays.toString(strings)+ " Code: "+i); } mLocationClient.disconnect(); } } 

    Afficher le service de notification:

      public class ShowNotificationService extends IntentService { public ShowNotificationService() { super("ReceiveTransitionsIntentService"); } @Override protected void onHandleIntent(Intent intent) { Log.d("NOTICE", "Android geofence notification!"); if (LocationClient.hasError(intent)) { int errorCode = LocationClient.getErrorCode(intent); Log.e("ReceiveTransitionsIntentService", "Location Services error: " + Integer.toString(errorCode)); Crashlytics.logException(new RuntimeException("Location Services error: "+errorCode)); } else { int transitionType = LocationClient.getGeofenceTransition(intent); if (transitionType == Geofence.GEOFENCE_TRANSITION_ENTER) { //ak vstupujem pozriem sa ci uz sa mi to nevyhodilo dnes List<Geofence> triggerList = LocationClient.getTriggeringGeofences(intent); Log.d("NOTICE", "Transition Enter"); GeofenceProvider mProvider = new GeofenceProvider(this); mProvider.open(); try { for (Geofence geofence : triggerList) { String id = geofence.getRequestId(); String[] data = id.split(MyGeofence.delimiter); Log.d("NOTICE", "Show notification: "+id); if (data.length != 3) { Crashlytics.logException(new RuntimeException("Invalid geofence id: " + id + "Data: "+ Arrays.toString(data))); continue; } if (mProvider.updateLastFire(Integer.valueOf(data[2]))) { NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentTitle(data[0]); builder.setContentText(data[1]); builder.setSmallIcon(R.drawable.noticon); Intent result = new Intent(this, CompassActivity.class); PendingIntent pendingResult = PendingIntent.getActivity(this, 0, result, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(pendingResult); builder.setOngoing(false); builder.setAutoCancel(true); Notification not = builder.build(); not.defaults = Notification.DEFAULT_ALL; NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); int notID = Integer.valueOf(data[2]); mNotificationManager.notify(notID, not); } } } catch (Exception e) { Crashlytics.logException(e); e.printStackTrace(); } finally { mProvider.close(); } } else if(transitionType == Geofence.GEOFENCE_TRANSITION_EXIT) { //ak odchadzam, oznacim to patricne v db List<Geofence> triggerList = LocationClient.getTriggeringGeofences(intent); Log.d("NOTICE", "Transition leave"); GeofenceProvider mProvider = new GeofenceProvider(this); mProvider.open(); try { for (Geofence geofence : triggerList) { String id = geofence.getRequestId(); String[] data = id.split(MyGeofence.delimiter); if (data.length != 3) { Crashlytics.logException(new RuntimeException("Invalid geofence id: " + id + "Data: "+ Arrays.toString(data))); continue; } mProvider.invalidateLastFire(Integer.valueOf(data[2])); Log.d("NOTICE", "Invalidate last fire: "+id); } } catch (Exception e) { Crashlytics.logException(e); e.printStackTrace(); } finally { mProvider.close(); } } else { // An invalid transition was reported Log.e("ReceiveTransitionsIntentService", "Geofence transition error: " + Integer.toString(transitionType)); Crashlytics.logException(new RuntimeException("Invalid geofence transition")); } } } } 

    Dans UpdateGeofences, j'ai omis les méthodes requises pour me connecter à PlayServices, car elles sont essentiellement copiées à partir de l'application de démonstration et je les utilise avec succès dans d'autres endroits …

    L'activité principale n'est pas pertinente, elle envoie simplement une émission pour démarrer UpdateGeofences chaque fois qu'elle commence.

    GeofenceProvider n'est pas un problème, j'utilise le même code ailleurs sans problèmes.

  • Directions API sur Android
  • SwipeRefreshLayout est caché derrière ActionBar avec des barres d'état transparentes
  • Où sont les options de ligne de commande supplémentaires dans Android Studio version 1.5.1 pour l'émulateur
  • Existe-t-il une limite pour le nombre de fichiers dans un répertoire sur une carte SD?
  • "Une erreur s'est produite lors de l'activation automatique du bundle com.android.ide.eclipse.adt"
  • Création d'un android.graphics.Bitmap depuis C ++
  • One Solution collect form web for “Android Geofencing – Pas d'intérêt?”

    Eventualy, j'ai réussi à résoudre ce problème en définissant exporté = "vrai" dans ShowNofiticationService.

    Comme ça:

     <service android:name="test.package.services.geofences.ShowNotificationService" android:label="@string/app_name" android:exported="true"/> 

    Il semble que les intentions ont été déclenchées par un processus avec un mauvais identifiant, et cette erreur de sécurité coused. Je ne sais pas pourquoi cela se produirait …

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.