Android:Geo Fencing Receiver没有打电话

时间:2014-02-19 16:17:27

标签: android android-geofence

我刚刚根据文档为Android中的Geo Fencing做了一个演示,但是当我从围栏区域出来或进入它时,Geo Fencing Broadcast Receiver没有打电话。

伙计们查看代码并尝试解决问题。

感谢Kingo

SplashActivity.java

public class SplashActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        List<Geofence> mCurrentGeofences = new ArrayList<Geofence>();

        SimpleGeofence mUIGeofence1 = new SimpleGeofence("1",
        // Get latitude, longitude, and radius from the UI
                26.87473379143512, 75.78373555021025, 1,
                // Set the expiration time
                Geofence.NEVER_EXPIRE,
                // Only detect entry transitions
                Geofence.GEOFENCE_TRANSITION_ENTER);

        /*
         * Add Geofence objects to a List. toGeofence() creates a Location
         * Services Geofence object from a flat object
         */
        mCurrentGeofences.add(mUIGeofence1.toGeofence());

        // Start the request. Fail if there's already a request in progress
        try {
            // Try to add geofences
            GeofenceRequester mGeofenceRequester = new GeofenceRequester(this);
            mGeofenceRequester.addGeofences(mCurrentGeofences);
        } catch (UnsupportedOperationException e) {
        }

    }
}

GeoFenceRequestor.java

private PendingIntent createRequestPendingIntent() {

    // If the PendingIntent already exists
    if (null != mGeofencePendingIntent) {

        // Return the existing intent
        return mGeofencePendingIntent;

        // If no PendingIntent exists
    } else {

        // Create an Intent pointing to the IntentService
        Intent intent = new Intent(
                "com.example.demo.ACTION_RECEIVE_GEOFENCE");

        // MAKE SURE YOU CHANGE THIS TO getBroadcast if you are coming from
        // the sample code.
        return PendingIntent.getBroadcast(mActivity, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
    }
}


@Override
public void onAddGeofencesResult(int statusCode, String[] geofenceRequestIds) {

    // Create a broadcast Intent that notifies other components of success
    // or failure
    Intent broadcastIntent = new Intent();

    // Temp storage for messages
    String msg;

    // If adding the geocodes was successful
    if (LocationStatusCodes.SUCCESS == statusCode) {

        // Create a message containing all the geofence IDs added.
        msg = mActivity.getString(R.string.add_geofences_result_success,
                Arrays.toString(geofenceRequestIds));

        // In debug mode, log the result
        Log.d(GeofenceUtils.APPTAG, msg);

        // Create an Intent to broadcast to the app
        broadcastIntent.setAction(GeofenceUtils.ACTION_GEOFENCES_ADDED)
                .addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES)
                .putExtra(GeofenceUtils.EXTRA_GEOFENCE_STATUS, msg);
        // If adding the geofences failed
    } else {

        /*
         * Create a message containing the error code and the list of
         * geofence IDs you tried to add
         */
        msg = mActivity.getString(R.string.add_geofences_result_failure,
                statusCode, Arrays.toString(geofenceRequestIds));

        // Log an error
        Log.e(GeofenceUtils.APPTAG, msg);

        // Create an Intent to broadcast to the app
        broadcastIntent.setAction(GeofenceUtils.ACTION_GEOFENCE_ERROR)
                .addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES)
                .putExtra(GeofenceUtils.EXTRA_GEOFENCE_STATUS, msg);
    }

    // Broadcast whichever result occurred
    LocalBroadcastManager.getInstance(mActivity).sendBroadcast(
            broadcastIntent);

    // Disconnect the location client
    requestDisconnection();
}

GeofenceReceiver.java

公共类GeofenceReceiver扩展BroadcastReceiver {         上下文上下文;

    Intent broadcastIntent = new Intent();

    @Override
    public void onReceive(Context context, Intent intent) {
        this.context = context;

        broadcastIntent.addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES);
        Toast.makeText(context, "Receiver", Toast.LENGTH_LONG).show();
        if (LocationClient.hasError(intent)) {
            handleError(intent);
        } else {
            handleEnterExit(intent);
        }
    }
}

的AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.demo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="10" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/app_id" />

        <activity
            android:name=".SplashActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".GeofenceReceiver"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.example.demo.ACTION_RECEIVE_GEOFENCE" />
            </intent-filter>
        </receiver>

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
    </application>

</manifest>

它成功添加地理围栏,但后来它没有调用广播接收器来了解是否进入/退出

1 个答案:

答案 0 :(得分:3)

Android GeoFences永远不会启用GPS(因为他们的API非常糟糕,他们的设备功耗已经失控)。如果您想通过GPS进行地理围栏,则必须设置地理围栏然后不断轮询GPS。