私は奇妙な問題があります。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も問題ではありませんが、私は問題のない別の場所で同じコードを使用しています。
私はgeofence2に入れなければならない緯度と経度を教えてください。デモではデモサイトで利用できます。 ? –
アンドロイド:exported = "true"とはどのような違いがありますか? –