2014-02-19 29 views
0

我剛剛根據文檔爲Android中的Geo Fencing做了一個演示,但在這裏Geo擊劍廣播接收器不會調用當我從柵欄區域出來或進入它。Android:Geo擊劍接收器不打電話

夥計們看看代碼並試圖解決問題。

由於金吾

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> 

它成功地添加地理圍欄,但後來它不會調用廣播接收器來了解是否進入/退出

+0

在你的'SplashActivity'中,你沒有處理異常(通常是壞主意)。你的變量'mGeofenceRequester'幾乎立刻就會出現在範圍之內......你確定你想要發生這種情況嗎? –

+0

在我上面的代碼中沒有發生異常,只是接收器沒有調用,但應該是 – android

+0

您是否設法解決此問題? – ashutiwari4

回答

3

Android的地理圍欄從未啓用GPS (因爲它們的API非常糟糕,而且它們的設備功耗已經非常低)。您必須設置您的地理圍欄,然後如果要通過GPS進行地理圍欄,請不斷分別調查GPS。