في الأندرويد Geofencing استخدام



ما هو الـ Geofencing ؟ 

الـ Geofencing هو تتبع مكان الجهاز الي ان يدخل في نطاق محدد وعنده دخوله او خروجه من هذا النطاق يتعمل عمل event محدد في الأبلكيشن .


الـ Geofencing خاصية موجودة في الاندرويد ويمكن استخدامها بدون اللجوء الي libraries جاهزة وهي موجودة في Google serivces لذلك في البداية سنضيف هذا الكود في ملف build.gradle 

 

compile 'com.google.android.gms:play-services:8.1.0' 
 


بعد ذلك سنفتح ملف AndroidManifest.xml ونضيف permission يسمح للتطبيق بمعرفة مكان الجهاز .


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



MainActivity 


في الـ class الرئيسي لدينا سوف نستخدم object من GoogleApiClient class لكي نتمكن من استخدام Google Play services والتي من ضمنها الـ Geofencing .


 



 mGoogleApiClient = new GoogleApiClient.Builder(this)


                .addConnectionCallbacks(this)


                .addOnConnectionFailedListener(this)


                .addApi(LocationServices.API)


                .build();


  mGoogleApiClient.connect();
  

 


ولا ننسي ان نجعل الـ class يستخدم ConnectionCallbacks ومهمته هي ان يتحقق من ان mGoogleApiClient متصل ام لا .


 

public class MainActivity extends ActionBarActivity implements ConnectionCallbacks

 






بعد اتصال mGoogleApiClient سنبدأ في اضافة الاماكن المراد تتبعها عن طريق هذا الكود .




 
 

HashMap my_geofences = new HashMap();


        {
            my_geofences.put("Home", new LatLng(30.1, 30));
            my_geofences.put("Work", new LatLng(33.5,30));
        }


       for (Map.Entry entry : my_geofences.entrySet()) {

           mGeofenceList.add(new Geofence.Builder()
                .setRequestId(entry.getKey())
                .setCircularRegion(
                           entry.getValue().latitude,
                           entry.getValue().longitude,
                           (float) 100.0)
                .setExpirationDuration( 1 * 60 * 60 * 1000) // 1 hour
                .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER |
                           Geofence.GEOFENCE_TRANSITION_EXIT)
                .build());

       }

 
   



سنلاحظ من الكود اننا استخدمنا HashMap تحتوي علي اسم النقطة و موقعها الجغرافي ثم اضفنا محتويات هذا الـ object في mGeofenceList وهي ArrayList تحتوي علي Geofence وكل object من Geofence نعطيه اسم وموقعه ونصف قطر الدائرة المحيطة به (بالمتر) وايضا وقت انتهاء (بالمللي ثانية) لكل موقع حيث بعد انتهاء هذا الوقت سيتم مسحه وايضا سنضيف الـ event المراد تعقبها سواء دخول فقط او خروج فقط او الاثنين معا.



الان اصبح لدينا Arraylist تحتوي علي كل المواقع المراد تعقبها ويجب مراعاة ان الاندرويد يسمح بحد الاقصي ١٠٠  مكان في الـ Arraylist (يمكن بعد ذلك مسح اماكن واضافة اخري ولكن ايضا بحد اقصي ١٠٠ مكان) .



تبقي الان ان نضيف mGeofenceList الي GeofencingRequest وارسالهم الي service تعمل في الـ background لتعقب هذه الاماكن .


 


GeofencingRequest.Builder builder = new GeofencingRequest.Builder();


        builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);


        builder.addGeofences(mGeofenceList);


        builder.build();


Intent intent = new Intent(this, GeofenceService.class);

LocationServices.GeofencingApi.addGeofences(
                       mGoogleApiClient,
                       // The GeofenceRequest object.
                      builder,
                        PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)) ;


 






الان اصبح كل شئ جاهز في الـ MainActivity وتبقي لنا فقط ان نحدد ماذا سيحدث عن الدخول او الخروج من هذه المناطق وهذه هي مهمة GeofenceService التي سوف ننشئها الان .



GeofenceService



ننشئ Class جديد ونسميه GeofenceService ويكون نوعه IntentService وهذا الـ class سيستخدم لعمل event معين عند الدخول الي المناطق التي حددنها.


 public class GeofenceService extends IntentService 




ولا ننسي ان نضيف هذا الكلاس كـ Service في ملف  AndroidManifest.xml
  


  

android:name="android.permission.ACCESS_FINE_LOCATION" />
<application>
....
<service android:name=".GeofenceService" />
</application>


 




عند دخول منطقة من المناطق المحددة مسبقا يتم تشغيل الـ service و تبدأ onHandleIntent بالعمل لذلك سنكتب بداخلها هذا الكود .


 


@Override
protected void onHandleIntent(Intent intent) {


GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
if (geofencingEvent.hasError()) {
int errorMessage = geofencingEvent.getErrorCode();
Log.e(TAG, "Error: "+errorMessage);
return;
}


int geofenceTransition = geofencingEvent.getGeofenceTransition();

if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER) {
// When Enter geofence
List triggeringGeofences = geofencingEvent.getTriggeringGeofences();

String geofenceTransitionDetails = getGeofenceTransitionDetails(
                    this,
                    geofenceTransition,
                    triggeringGeofences
            );

sendNotification();


Log.i(TAG, geofenceTransitionDetails);


}




else if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT){


// When Exit geofence


}


}


 

هذا الكود مهمته هي تحديد نوعية الـ event الذي حدث سواء دخول للمنطقة او الخروج منها في هذا المثال حددنا انه اذا كان نوع الـ event هو دخول سنشغل ميثود sendNotification وهي ميثود ستظهر اشعار للمستخدم انه دخل هذه المنطقة
لاحظ اننا استخدمنا هذا السطر
 List triggeringGeofences = geofencingEvent.getTriggeringGeofences();

هذا السطر مهمته معرفة المكان أو الاماكن الذي دخلها الان  وكل مكان يكون متواجدة في ArrayList  بها objects من Geofence class وهذا الـ object يحتوي علي المكان (خط الطول (latitude) و خط العرض (longitude))  بالاضافة الي نصف خطر الدائرة حول هذه النقطة (Range) والتي ستحدد اذا كان الجهاز بداخل او خارج المنطقة.





وبذلك نكون انتهينا من عمل التطبيق واصبح جاهز لتعقب الجهاز في النقاط المحددة مسبقا. يمكنك قراءة الكود كاملا او تحميله علي GitHub
Previous
Next Post »