تطبيق كيتبع مسار الحافلة بأندرويد الجزء الأول
فهاد الدرس الجديد من سلسلة أندرويد غادي نشوفو كيفاش نقادو تطبيق كيمكن المستخدم من تتبع مسار حافلة ديال النقل الحضري فمنبعد مكيشوف الإحداثيات ديالها كيمكنو من مشاهدة الموقع على الخريطة باستعمال 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>