2014-02-19 2 views
0

설명서에 따라 안드로이드의 지오 펜싱에 대한 데모를 방금 만들었지 만, 지오 펜싱 방송 수신기는 울타리 영역에서 나가거나 입력 할 때 호출하지 않습니다.Android : 지오 펜싱 수신자가 전화하지 않음

사람들이 코드를보고 문제를 잡으려고합니다.

감사 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는 브로드 캐스트 리시버 { 컨텍스트 컨텍스트를 확장;

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

안드로이드 지오 펜스는 GPS를 사용하지를 알게 방송 수신기를 호출하지 않습니다 (API가 너무 끔찍하고 기기의 전력 소모량이 너무 높기 때문에). 지오 펜스를 설정 한 다음 GPS를 통해 지오 펜싱을 원할 경우 GPS를 별도로 폴링해야합니다.

관련 문제