安卓:地理围栏接收器不是要求 [英] Android : Geo Fencing Receiver not calling

查看:381
本文介绍了安卓:地理围栏接收器不是要求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只是在做机器人演示了地理围栏按文档,但这里地质击剑广播接收器并没有叫,当我从围栏面积外出或进入它。

I just made a demo for the Geo Fencing in android as per the documentation but here Geo Fencing Broadcast Receiver is not calling when I go out from the fence area or entered into it.

专家看code和试图抓住这个问题。

Guys look the code and try to catch the issue.

由于金吾

SplashActivity.java

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

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.java

公共类GeofenceReceiver扩展广播接收器{
        上下文的背景下;

public class GeofenceReceiver extends BroadcastReceiver { Context context;

    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中

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>

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

It add the Geo Fence successfully but later it does not call the Broadcast receiver to get to know whether entered/exit

推荐答案

Android的地理围栏从未启用GPS(因为它们的API是可怕的和器件的功耗已经是如此不可收拾的地步)。你必须设置你的地理围栏,然后不断的,如果你想在GPS地理围栏分别轮询GPS。

Android GeoFences never enable the GPS (because their API is awful and their device power consumption is already so out of hand). You have to set up your geofences and then constantly poll the GPS separately if you want geofencing over GPS.

这篇关于安卓:地理围栏接收器不是要求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆