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


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


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

1- الملف MainActivity.java

فالمجلد java كاين الملف MainActivity.java لي هو الملف الرئيسي ديالنا ديال MainActivity لي هي الصفحة الرئيسية ديال التطبيق ديالنا فأولا كاين des variables لي غادي تسجل فيهم الإحداثيات والعناوين لي اختار المستخدم فمنبعد مكنسترجع listview ديالي من الملف activity_main.xml كنزيد فل ArrayList places جملة كتنبه المستخدم بلي عندو الإمكانية باش يضيف عناوين منبعد كنخدم بل adapter باش كنزيد لplaces للlistview ديالي من بعد كنخدم ب setOnItemClickListener 
باش ملي كيكليكي المستخدم على شي عنصر منها كتديه للملف MapsActivity لي كيستقبل العنوان ولموقع ديالو الكود ديال الملف هو:

                                package com.example.belasri.saveplaces;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.google.android.gms.maps.model.LatLng;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    static ListView placesList;
    static ArrayList<String> places = new ArrayList<>();
    static ArrayList<LatLng> locations = new ArrayList<>();
    static ArrayAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        placesList = (ListView) findViewById(R.id.listPlaces);
        places.clear();
        places.add("Ajouter une adresse");
        locations.add(new LatLng(0,0));
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        adapter = new ArrayAdapter(this,R.layout.list_item,places);
        placesList.setAdapter(adapter);
        placesList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent i = new Intent(MainActivity.this,MapsActivity.class);
                i.putExtra("place",position);
                startActivity(i);
            }
        });

    }

    @Override
    protected void onResume() {
        super.onResume();
        adapter.notifyDataSetChanged();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

                            

2- الملف activity_maps.java

من بعد كنمشي للمجلد res/layout فيه كاين الملف لي زدناه فالجزء الأول لي هو activity_maps.java فهادا هو ل interface فين غادي تكون الخريطة ديالنا ولي عبارة عن fragment وللمزيد من المعلومات على les fragments شوف الرابط الكود ديال الملف هو :

                                <fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.belasri.saveplaces.MapsActivity" />
                            

3- الملف MapsActivity.java

من بعد كنكمشي للمجلد  java فيه كاين الملف MapsActivity.java ولي فيه الكود لي كيمكن من عرض العناوين على الخريطة وتسجيلها فل listview فكاين les variables لي كيمكنو من تتبع التغييرات لي كتحصل على موقع المستخدم من بعد ف onCreate كنسترجع الfragment من الملف activity_maps.xml وكنزيدها للMapsActivity منبعد كاين onRequestPermissionsResult لي فقط كتطلب الإدن من المستخدم باش ت activer google maps و منبعد مكتاخد الإدن كتعرض الموقع ديالو فالخريطة بواسطة centerLocation لي كتcentrer ل position ديال المستخدم فالخريطة منبعد كاين onMapReady لي كتستقبل ل position ديال العنوان لي اختار المستخدم من ل MainActivity وكتحقق يلا كان 0 كتعرض الموقع par défault لي هو ديال المستخدم و 0 هنا كتعني انه ضغط على ajouter une adresse ويلا كان كيخالف الصفر كيسترجع الإحداثيات ديال العنوان لي اختار من الجدول locations وكيصيفطها لل methode centerLocation لي كتعرضو على الخريطة من بعد كاين onMapLongClick لي ملي كيكليكي المستخدم على شي عنوان على الخريطة كتاخد الإحداثيات ديالو وكتزيدهم ف ListAdress لي كيتسجل فيها إسم العنوان ويلا مكانش عندو اسم كيتسجل تاريخ اليوم فبلاصت الإسم من بعد كيتزادو العناوين فالجدول places لي عندنا فل MainActivity وكتعرض رسالة بلي العنوان تسجل الكود ديال الملف هو :

                                package com.example.belasri.saveplaces;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleMap.OnMapLongClickListener {

    private GoogleMap mMap;
    LocationManager locationManager;
    android.location.LocationListener locationListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,locationListener);
                Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                centerLocation(lastKnownLocation, "Votre postion");
            }
        }
    }

    public void centerLocation(Location location, String title) {
        LatLng userLocation = new LatLng(location.getLatitude(), location.getLongitude());
        mMap.clear();
        if(title != "Votre postion") {
            mMap.addMarker(new MarkerOptions().position(userLocation).title(title));
        }
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation,16));
    }

    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setOnMapLongClickListener(this);
        Intent intent = getIntent();
        if (intent.getIntExtra("place",0) == 0) {
            locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
            locationListener = new android.location.LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    centerLocation(location, "Votre position");
                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {

                }

                @Override
                public void onProviderEnabled(String provider) {

                }

                @Override
                public void onProviderDisabled(String provider) {

                }
            };
            if (Build.VERSION.SDK_INT < 23) {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,locationListener);
            } else {
                if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,locationListener);
                    Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    centerLocation(lastKnownLocation, "Votre postion");
                } else {
                    ActivityCompat.requestPermissions(this, new String[]{
                            Manifest.permission.ACCESS_FINE_LOCATION
                    }, 1);
                }
            }
        }else{
            Location location = new Location(LocationManager.GPS_PROVIDER);
            location.setLatitude( MainActivity.locations.get(intent.getIntExtra("place",0)).latitude);
            location.setLongitude( MainActivity.locations.get(intent.getIntExtra("place",0)).longitude);
            centerLocation(location,MainActivity.places.get(intent.getIntExtra("place",0)));
        }
    }

    @Override
    public void onMapLongClick(LatLng latLng) {
        Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
        String address = "";
        try {
            List<Address> ListAdress = geocoder.getFromLocation(latLng.latitude,latLng.longitude,1);
            if(ListAdress != null && ListAdress.size() > 0){
                if(ListAdress.get(0).getThoroughfare() != null){
                    if(ListAdress.get(0).getSubThoroughfare() != null){
                        address += ListAdress.get(0).getSubThoroughfare() + " ";
                    }
                    address += ListAdress.get(0).getThoroughfare() + " ";
                }
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
        if(address == ""){
            SimpleDateFormat sdf = new SimpleDateFormat("mm:HH yyyyMMdd");
            address = sdf.format(new Date());
        }
        mMap.addMarker(new MarkerOptions().position(latLng).title(address));
        MainActivity.places.add(address);
        MainActivity.locations.add(latLng);
        MainActivity.adapter.notifyDataSetChanged();
        Toast.makeText(getApplicationContext(),"Position enregistrée",Toast.LENGTH_SHORT).show();
    }
}

                            

4- الملف AndroidManifest.xml

آخر حاجة كنزيد فالملف AndroidManifest.xml  الكود لي كيمكن من استخدام الأنترنيت من طرف التطبيق وأيضا كيعطيه الإدن باش يسترجع الموقع الدقيق ديال المستخدم الكود لي غادي تزيد هو :

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


إشترك في قناتنا على اليوتيوب

بحث في الموقع


إشترك للتوصل بالجديد