7

私は奇妙な問題があります。Androidジオフェンシング - 意図はありませんか?

Googleサービスを使用してジオフェンシングを実装しました。 (下の実装) 私のデバイス(Samsung Galaxy SとMoto X)では、完全に機能します。いくつかの他のデバイス(HTC Incredible S、Galaxy Note)では、私は遷移の意図を受け取りません。決して。フェンスの真ん中に立つ素晴らしい、正確なGPS修正。何もない。ログに疑わしいものはありません。エラーも警告もありません。いいえ、サービスは開始しません。

誰もこのようなことを見たことがありますか? (動作しているデバイスとそうでないデバイスとの間に何らかの関係がないため、これは異常です。メーカーではなく、Androidバージョンではないため、Playサービスはすべて最新のものです)

実装:

マニフェスト:

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

更新ジオフェンス:

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(); 
    }  
} 

表示通知サービス:

彼らは基本的にデモアプリケーションからコピーされ、私は他の場所で正常にそれらを使用しておりますので、私は、PlayServicesに接続するために必要なメソッドを省略UpdateGeofencesで
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")); 
      } 
     } 
    } 
} 

...

主な活動これは無関係です。開始するたびにUpdateGeofencesを開始するようにブロードキャストを送信するだけです。

GeofenceProviderも問題ではありませんが、私は問題のない別の場所で同じコードを使用しています。

答えて

1

最終的に、私はShowNofiticationServiceでexported = "true"と設定することでこれを解決することができました。このよう

は:

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

意図が間違ったIDを持つプロセスによって発射されたようで、そのcousedセキュリティエラー。なぜそれが起こるのかわかりません...

+0

私はgeofence2に入れなければならない緯度と経度を教えてください。デモではデモサイトで利用できます。 ? –

+1

アンドロイド:exported = "true"とはどのような違いがありますか? –

関連する問題