تطبيق كيتبع مسار الحافلة بأندرويد الجزء الأول

فهاد الدرس الجديد من سلسلة أندرويد غادي نشوفو كيفاش نقادو تطبيق كيمكن المستخدم من تتبع مسار حافلة ديال النقل الحضري فمنبعد مكيشوف الإحداثيات ديالها كيمكنو من مشاهدة الموقع على الخريطة باستعمال google maps فالجزء الأول غادي نشوفو التطبيق الخاص بسائق الحافلة لي كيمكنوا من تخزين موقع الحافلة من بعد غادي نشوفوا التطبيق الثاني الخاص بالمستخدم لي كيمكنوا من الإطلاع على موقع الحافلة فالخريطة.

نظرة سريعة بالفيديو


1- الملف Tracker.java


فأول حاجة غادي نديرو غادي نزيدو project جديد ف android studio ختار Basic Activity سميه BusDriverApp من بعد ميتزاد غادي تمشي للمجلد java  فيه غادي تزيد class جديدة سميها Tracker.java فيها غادي يكون الكود لي كيمكن من استرجاع ال position ديال الحافلة من بعد مكيتحقق واش الشيفور م activer ل position أو لا لا يلا مكنش كاين fonction showAlertDialog لي كتعرض رسالة كتوجه الشيفور لل paramètres ديال التلفون ديالو باش ي activer ل position من بعد كنسترجع longitude و latitude بل fonction getLocation الكود ديال الملف هو:

                                    
                                        package com.example.belasri.busdriverapp;

import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;

import com.google.firebase.database.FirebaseDatabase;

/**
 * Created by belasri on 21/12/2017.
 */

public class Tracker extends Service implements LocationListener {
    private final Context context;
    boolean gpsIsEnabled = false;
    boolean networkIsEnabled = false;
    boolean canGetLocation = false;
    Location location;
    double longitude;
    double latitude;
    private static final long MIN_DISTANCE_FOR_UPDATING_LOCATION = 10;
    private static final long MIN_TIME_BETWEEN_UPDATING_LOCATION = 1*60*1;
    protected LocationManager locationManager;
    public Tracker(Context ctx){
        this.context = ctx;
        getLocation();
    }

    private Location getLocation() {
        try{
            locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
            gpsIsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            networkIsEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
            if(!gpsIsEnabled && !networkIsEnabled){

            }else{
                this.canGetLocation = true;
                if(networkIsEnabled){
                    if(ActivityCompat.checkSelfPermission((Activity)context,android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                            && ActivityCompat.checkSelfPermission((Activity)context,android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
                        return null;
                    }
                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,MIN_TIME_BETWEEN_UPDATING_LOCATION,MIN_DISTANCE_FOR_UPDATING_LOCATION,this);
                    if (locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if(location != null) {
                            longitude = location.getLongitude();
                            latitude = location.getLatitude();
                        }
                    }
                }
                if(gpsIsEnabled){
                    if(location == null){
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MIN_TIME_BETWEEN_UPDATING_LOCATION,MIN_DISTANCE_FOR_UPDATING_LOCATION,this);
                        if (locationManager != null) {
                            location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if(location != null) {
                                longitude = location.getLongitude();
                                latitude = location.getLatitude();
                            }
                        }
                    }
                }
            }

        }catch(Exception e ){
            e.printStackTrace();
        }
        return location;
    }
    //tur off gps
    public void turnOfGps(){
       if(locationManager != null){
           if(ActivityCompat.checkSelfPermission(context,android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                   && ActivityCompat.checkSelfPermission(context,android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
               return;
           }
           locationManager.removeUpdates(Tracker.this);
       }
    }
    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }
        return longitude;
    }
    public double getLatitude(){
        if(location != null){
            longitude = location.getLatitude();
        }
        return latitude;
    }
    public  Boolean canGetLocation(){
        return this.canGetLocation;
    }
    public void showAlertDialog(){
        AlertDialog.Builder alert = new AlertDialog.Builder(context);
        alert.setTitle("Paramétres de GPS");
        alert.setPositiveButton("Paramétres",new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                context.startActivity(intent);
            }
        });
        alert.setNegativeButton("Annuler",new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                return;
            }
        });
        alert.show();
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onLocationChanged(Location location) {

    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {

    }

    @Override
    public void onProviderEnabled(String s) {

    }

    @Override
    public void onProviderDisabled(String s) {

    }
}
                                    
                                

2- الملف activity_main.xml


غادي تمشي للمجلد res/layout فيه كاين ملف activity_main.xml هادا هو الملف ديال الصفحة الرئيسية ديالنا فيه الكود لي فيه textview غادي يكون فيها longitude وlatitude ديال الحافلة وال bouton لي غادي يمكن من التخزين ديال ل position الكود ديال activity_main.xml هو :

                                    
                                        <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.belasri.busdriverapp.MainActivity">

    <TextView
        android:id="@+id/location"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="26sp"
        android:padding="10dp"
        android:textAlignment="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <Button
        android:id="@+id/getLocation"
        android:text="Position"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
                                    
                                

3- MainActivity.java


فالمجلد java كاين الملف MainActivity.java  فيه كنسترجع ال bouton وtextview لي زدنا ف activity_main.xml منبعد  كنخدم ب firebase database باش كنخزن الموقع ديال الحافلة يلا معرفتيش كيفاش تزيد firebase شوف الدروس السابقة منبعد فل onClick ديال ل bouton كن créer l'objet من la classe Tracker وكنتحقق بلي شيفور عطى ل permission لل app باش تستخدم ل maps كنسترجع latitude و longitude وكنعرضهم ف textview من بعد كنزيد base de données ف firebase كنسميها locations فيها كنزيد لموقع ديال الحافلة ويلا الشيفور معطاش ل permission كنعرض رسالة باش يمشي لل paramètres ي activer la position الكود ديال الملف هو :

                                      
                                        package com.example.belasri.busdriverapp;

import android.Manifest;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.test.mock.MockPackageManager;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import static android.icu.lang.UCharacter.GraphemeClusterBreak.T;

public class MainActivity extends AppCompatActivity {
    private TextView textLocation;
    private Button btn;
    private Tracker gps;
    private static final int REQUEST_CODE_PERMISSION = 2;
    private FirebaseDatabase mDatabase;
    private DatabaseReference mRef;
    private String permission = Manifest.permission.ACCESS_FINE_LOCATION;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.getLocation);
        textLocation = (TextView) findViewById(R.id.location);
        try{
            if(ActivityCompat.checkSelfPermission(MainActivity.this,permission) != MockPackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(MainActivity.this,new String[]{permission},REQUEST_CODE_PERMISSION);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                gps = new Tracker(MainActivity.this);
                if(gps.canGetLocation()){
                    double latitude = gps.getLatitude();
                    double longitude = gps.getLongitude();
                    textLocation.setText(latitude+""+ longitude);
                    mDatabase = FirebaseDatabase.getInstance();
                    mRef = mDatabase.getReference("locations");
                    mRef.setValue(latitude+","+longitude);
                    Toast.makeText(MainActivity.this, "Position ajoutée", Toast.LENGTH_SHORT).show();
                }else{
                    gps.showAlertDialog();
                }
            }
        });
    }
}
                                      
                                    

4- الملف AndroidManifest.xml


فالملف AndroidManifest.xml كنزيد les permissions باش يمكن لتطبيق يستخدم الأنترنيت ول position الكود لي غادي تزيد هو: 

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

كلمات مفاتيح :