android - প্রয়োজনীয় এন্ড্রয়েড এপস ২০১৮




Android এর ব্যবহারকারীর বর্তমান অবস্থানটি পেতে সহজতম এবং সবচেয়ে জোরালো উপায় কী? (18)

আপনি সর্বদা LocationManager.getLastKnownLocation() মেনগারে ব্যবহার করতে পারেন LocationManager.getLastKnownLocation() কিন্তু এটির মতো এটি বলে যে এটি পুরানো হতে পারে।

এবং একটি সাধারণ অবস্থান পেতে একটি সহজ উপায় নেটওয়ার্ক (সাধারণত বেশ দ্রুত) জন্য নিবন্ধন করা হতে পারে।

LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(
     LocationManager.NETWORK_PROVIDER, 1000, 1000, this);

এবং তারপর করছেন

locationManager.removeUpdates(this);

শ্রোতাদের onLocationChanged() পদ্ধতিতে।

অ্যান্ড্রয়েডের LocationManager মঞ্জুরির API মনে হচ্ছে এটি এমন একটি ব্যথা যা কিছু অ্যাপ্লিকেশনের জন্য ব্যবহারযোগ্য, যা শুধুমাত্র ব্যবহারকারীর অবস্থানের মাঝে মাঝে এবং রুক্ষ পরিমানের প্রয়োজন।

যে অ্যাপ্লিকেশনটি আমি কাজ করছি সেটি আসলেই একটি অবস্থান অ্যাপ্লিকেশন নয় তবে এটি কাছাকাছি থাকা ব্যবসার তালিকা প্রদর্শনের জন্য ব্যবহারকারীর অবস্থানটি পেতে হবে। ব্যবহারকারীর আশেপাশে বা এরকম কিছু চলছে কিনা তা নিয়ে চিন্তা করার দরকার নেই।

এখানে আমি যা করতে চাই তা হল:

  1. ব্যবহারকারী কাছাকাছি অবস্থানের একটি তালিকা প্রদর্শন করুন।
  2. ব্যবহারকারীর অবস্থানটি লোড করুন যাতে আমি Activity এক্স-এ এটির প্রয়োজন অনুসারে এটি উপলব্ধ হবে।
  3. আমি বিশেষভাবে আপডেট সঠিকতা বা ফ্রিকোয়েন্সি সম্পর্কে যত্ন না। শুধু একটি অবস্থান grabbing যতক্ষণ না এটি বন্ধ উপায় নেই। হয়তো আমি যদি অভিনব হতে চাই তবে আমি কয়েক মিনিট বা একবার একবার অবস্থান আপডেট করব, কিন্তু এটি একটি বিশাল অগ্রাধিকার নয়।
  4. যে কোনও ডিভাইসের জন্য যতক্ষণ এটি একটি GPS বা একটি নেটওয়ার্ক অবস্থান প্রদানকারীর জন্য কাজ করে।

মনে হচ্ছে এটি কঠিন হওয়া উচিত নয়, তবে আমার মনে হয় যে আমাকে দুটি ভিন্ন অবস্থান সরবরাহকারী (GPS এবং নেটওয়ার্কে) এবং প্রতিটি জীবনচক্র পরিচালনা করতে হবে। এটি শুধুমাত্র নয়, তবে আমাকে একই কোডটি একাধিক ক্রিয়াকলাপে # 2 সন্তুষ্ট করতে হবে। আমি সমাধান করার জন্য অতীতের getBestProvider() ব্যবহার করে চেষ্টা করেছি যাতে সমাধানটি কেবল একটি অবস্থান প্রদানকারীর ব্যবহার করা যায়, তবে মনে হচ্ছে যে আপনি কেবল সেই প্রদানকারীর চেয়ে সেরা "তাত্ত্বিক" সরবরাহকারী যা আপনাকে সর্বোত্তম ফলাফল দিতে যাচ্ছে।

এই সাধন করার একটি সহজ উপায় আছে?


আমি এখানে demonuts.com এ বর্তমান অবস্থানকে আচ্ছাদিত বিস্তারিত টিউটোরিয়াল লিখেছি । আপনি এখানে আরো বিবরণ খুঁজে পেতে পারেন এবং আরও ভাল বোঝার জন্য আপনি সম্পূর্ণ ডেমো সোর্স কোডটি ডাউনলোড করতে পারেন।

সেখানে ইতিমধ্যে অনেকগুলি উত্তর আছে তবে আমি Google API ব্যবহার করে অবস্থান পেতে সর্বশেষ উপায় প্রদর্শন করতে চাই, তাই নতুন প্রোগ্রামার নতুন পদ্ধতি ব্যবহার করতে পারে:

সব প্রথম, ধীরে ধীরে ফাইল এই রাখা

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

তারপর প্রয়োজনীয় ইন্টারফেস বাস্তবায়ন

public class MainActivity  extends BaseActivitiy implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener

উদাহরণ ঘোষণা

  private GoogleApiClient mGoogleApiClient;
  private Location mLocation;
  private LocationManager locationManager;
  private LocationRequest mLocationRequest;

onCreate() এটিকে রাখুন onCreate()

 mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

সর্বশেষে, প্রয়োজনীয় পদ্ধতি override

 @Override
    public void onConnected(Bundle bundle) {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        mLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if(mLocation == null){
            startLocationUpdates();
        }
        if (mLocation != null) {
            double latitude = mLocation.getLatitude();
            double longitude = mLocation.getLongitude();
        } else {
            // Toast.makeText(this, "Location not Detected", Toast.LENGTH_SHORT).show();
        }
    }

    protected void startLocationUpdates() {
        // Create the location request
        mLocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(UPDATE_INTERVAL)
                .setFastestInterval(FASTEST_INTERVAL);
        // Request location updates
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
                mLocationRequest, this);
        Log.d("reque", "--->>>>");
    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.i(TAG, "Connection Suspended");
        mGoogleApiClient.connect();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.i(TAG, "Connection failed. Error: " + connectionResult.getErrorCode());
    }

    @Override
    public void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

    @Override
    public void onStop() {
        super.onStop();
        if (mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }
    @Override
    public void onLocationChanged(Location location) {

    }

অ্যাপ্লিকেশন চালানোর আগে আপনার ডিভাইসে জিপিএস শুরু করতে ভুলবেন না।


এখানে আমি কি করি:

  1. প্রথমত আমি কি প্রদানকারীদের সক্রিয় আছে চেক। কিছু ডিভাইসে অক্ষম করা হতে পারে, কিছু অ্যাপ্লিকেশন ম্যানিফেস্টে অক্ষম করা হতে পারে।
  2. যদি কোন প্রদানকারী পাওয়া যায় তবে আমি অবস্থান শ্রোতা এবং সময়সীমার টাইমার শুরু করি। আমার উদাহরণে এটি 20 সেকেন্ড, GPS এর জন্য যথেষ্ট নাও হতে পারে তাই আপনি এটি সম্প্রসারিত করতে পারেন।
  3. আমি অবস্থান শ্রোতা থেকে আপডেট পেতে হলে আমি প্রদান মান ব্যবহার করুন। আমি শ্রোতা এবং টাইমার বন্ধ।
  4. আমি কোন আপডেট এবং টাইমার elapses না পেতে হলে আমি শেষ পরিচিত মান ব্যবহার করতে হবে।
  5. আমি উপলব্ধ প্রদানকারীদের কাছ থেকে শেষ পরিচিত মান অর্জন এবং তাদের সবচেয়ে সাম্প্রতিক চয়ন।

এখানে আমি কিভাবে আমার ক্লাস ব্যবহার করি:

LocationResult locationResult = new LocationResult(){
    @Override
    public void gotLocation(Location location){
        //Got the location!
    }
};
MyLocation myLocation = new MyLocation();
myLocation.getLocation(this, locationResult);

এবং এখানে MyLocation ক্লাস:

import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

public class MyLocation {
    Timer timer1;
    LocationManager lm;
    LocationResult locationResult;
    boolean gps_enabled=false;
    boolean network_enabled=false;

    public boolean getLocation(Context context, LocationResult result)
    {
        //I use LocationResult callback class to pass location value from MyLocation to user code.
        locationResult=result;
        if(lm==null)
            lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        //exceptions will be thrown if provider is not permitted.
        try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){}
        try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}

        //don't start listeners if no provider is enabled
        if(!gps_enabled && !network_enabled)
            return false;

        if(gps_enabled)
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
        if(network_enabled)
            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
        timer1=new Timer();
        timer1.schedule(new GetLastLocation(), 20000);
        return true;
    }

    LocationListener locationListenerGps = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            locationResult.gotLocation(location);
            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerNetwork);
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    LocationListener locationListenerNetwork = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            locationResult.gotLocation(location);
            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerGps);
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    class GetLastLocation extends TimerTask {
        @Override
        public void run() {
             lm.removeUpdates(locationListenerGps);
             lm.removeUpdates(locationListenerNetwork);

             Location net_loc=null, gps_loc=null;
             if(gps_enabled)
                 gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
             if(network_enabled)
                 net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

             //if there are both values use the latest one
             if(gps_loc!=null && net_loc!=null){
                 if(gps_loc.getTime()>net_loc.getTime())
                     locationResult.gotLocation(gps_loc);
                 else
                     locationResult.gotLocation(net_loc);
                 return;
             }

             if(gps_loc!=null){
                 locationResult.gotLocation(gps_loc);
                 return;
             }
             if(net_loc!=null){
                 locationResult.gotLocation(net_loc);
                 return;
             }
             locationResult.gotLocation(null);
        }
    }

    public static abstract class LocationResult{
        public abstract void gotLocation(Location location);
    }
}

কেউ আমার যুক্তি পরিবর্তন করতে চান। উদাহরণস্বরূপ, যদি আপনি নেটওয়ার্ক প্রদানকারীর কাছ থেকে আপডেট পান তবে শ্রোতা বন্ধ করবেন না তবে অপেক্ষা চালিয়ে যান। জিপিএস আরো সঠিক তথ্য দেয় যাতে এটির জন্য অপেক্ষা করা উপযুক্ত। যদি টাইমার বিলুপ্ত হয় এবং আপনি নেটওয়ার্ক থেকে আপডেট পেয়ে থাকেন তবে জিপিএস থেকে নন তবে আপনি নেটওয়ার্ক থেকে প্রদত্ত মান ব্যবহার করতে পারেন।

আরও একটি পদ্ধতি হল অবস্থান http://developer.android.com/training/location/retrieve-current.html ব্যবহার করা। তবে এটি ব্যবহারকারীর ডিভাইসে ইনস্টল করার জন্য Google Play পরিষেবাদি apk প্রয়োজন।


নিচের কোডটি ব্যবহার করুন, এটি সর্বোত্তম সরবরাহকারীকে সরবরাহ করবে:

String locCtx = Context.LOCATION_SERVICE; 

LocationManager locationMgr = (LocationManager) ctx.getSystemService(locCtx);

Criteria criteria  = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);

String provider = locationMgr.getBestProvider(criteria, true);

System.out.println("Best Available provider::::"+provider);

সর্বোত্তম বাস্তবায়নের জন্য অনুসন্ধানের পরে কীভাবে যথাযথ সুনির্দিষ্ট ব্যবহারকারীর অবস্থানটি পেতে হয় আমি সমস্ত সর্বোত্তম পদ্ধতিগুলি একত্রিত করতে এবং নিম্নোক্ত শ্রেণীতে আসার জন্য পরিচালিত হলাম:

/**
 * Retrieve accurate location from GPS or network services. 
 * 
 *
 * Class usage example:
 * 
 * public void onCreate(Bundle savedInstanceState) {
 *      ...
 *      my_location = new MyLocation();
 *      my_location.init(main.this, locationResult);
 * }
 * 
 * 
 * public LocationResult locationResult = new LocationResult(){
 *      @Override
 *      public void gotLocation(final Location location){
 *          // do something
 *          location.getLongitude();
 *          location.getLatitude();
 *      }
 *  };
 */
class MyLocation{

    /**
     * If GPS is enabled. 
     * Use minimal connected satellites count.
     */
    private static final int min_gps_sat_count = 5;

    /**
     * Iteration step time.
     */
    private static final int iteration_timeout_step = 500;

    LocationResult locationResult;
    private Location bestLocation = null;
    private Handler handler = new Handler();
    private LocationManager myLocationManager; 
    public Context context;

    private boolean gps_enabled = false;

    private int counts    = 0;
    private int sat_count = 0;

    private Runnable showTime = new Runnable() {

         public void run() {
            boolean stop = false;
            counts++;
            System.println("counts=" + counts);

            //if timeout (1 min) exceeded, stop tying
            if(counts > 120){
                stop = true;
            }

            //update last best location
            bestLocation = getLocation(context);

            //if location is not ready or don`t exists, try again
            if(bestLocation == null && gps_enabled){
                System.println("BestLocation not ready, continue to wait");
                handler.postDelayed(this, iteration_timeout_step);
            }else{
                //if best location is known, calculate if we need to continue to look for better location
                //if gps is enabled and min satellites count has not been connected or min check count is smaller then 4 (2 sec)  
                if(stop == false && !needToStop()){
                    System.println("Connected " + sat_count + " sattelites. continue waiting..");
                    handler.postDelayed(this, iteration_timeout_step);
                }else{
                    System.println("#########################################");
                    System.println("BestLocation finded return result to main. sat_count=" + sat_count);
                    System.println("#########################################");

                    // removing all updates and listeners
                    myLocationManager.removeUpdates(gpsLocationListener);
                    myLocationManager.removeUpdates(networkLocationListener);    
                    myLocationManager.removeGpsStatusListener(gpsStatusListener);
                    sat_count = 0;

                    // send best location to locationResult
                    locationResult.gotLocation(bestLocation);
                }
            }
         }
    };

    /**
     * Determine if continue to try to find best location
     */
    private Boolean needToStop(){

        if(!gps_enabled){
                          return true;
                     }
          else if(counts <= 4){
                return false;
            }
            if(sat_count < min_gps_sat_count){
                //if 20-25 sec and 3 satellites found then stop
                if(counts >= 40 && sat_count >= 3){
                    return true;
                }
                return false;
            }
        }
        return true;
    }

    /**
     * Best location abstract result class
     */
    public static abstract class LocationResult{
         public abstract void gotLocation(Location location);
     }

    /**
     * Initialize starting values and starting best location listeners
     * 
     * @param Context ctx
     * @param LocationResult result
     */
    public void init(Context ctx, LocationResult result){
        context = ctx;
        locationResult = result;

        myLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        gps_enabled = (Boolean) myLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

        bestLocation = null;
        counts = 0;

        // turning on location updates
        myLocationManager.requestLocationUpdates("network", 0, 0, networkLocationListener);
        myLocationManager.requestLocationUpdates("gps", 0, 0, gpsLocationListener);
        myLocationManager.addGpsStatusListener(gpsStatusListener);

        // starting best location finder loop
        handler.postDelayed(showTime, iteration_timeout_step);
    }

    /**
     * GpsStatus listener. OnChainged counts connected satellites count.
     */
    public final GpsStatus.Listener gpsStatusListener = new GpsStatus.Listener() {
        public void onGpsStatusChanged(int event) {

             if(event == GpsStatus.GPS_EVENT_SATELLITE_STATUS){
                try {
                    // Check number of satellites in list to determine fix state
                     GpsStatus status = myLocationManager.getGpsStatus(null);
                     Iterable<GpsSatellite>satellites = status.getSatellites();

                     sat_count = 0;

                     Iterator<GpsSatellite>satI = satellites.iterator();
                     while(satI.hasNext()) {
                         GpsSatellite satellite = satI.next();
                         System.println("Satellite: snr=" + satellite.getSnr() + ", elevation=" + satellite.getElevation());                         
                         sat_count++;
                     }
                } catch (Exception e) {
                    e.printStackTrace();
                    sat_count = min_gps_sat_count + 1;
                }

                 System.println("#### sat_count = " + sat_count);
             }
         }
    };

    /**
     * Gps location listener.
     */
    public final LocationListener gpsLocationListener = new LocationListener(){
        @Override
         public void onLocationChanged(Location location){

        }
         public void onProviderDisabled(String provider){}
         public void onProviderEnabled(String provider){}
         public void onStatusChanged(String provider, int status, Bundle extras){}
    }; 

    /**
     * Network location listener.
     */
    public final LocationListener networkLocationListener = new LocationListener(){
        @Override
         public void onLocationChanged(Location location){

        }
         public void onProviderDisabled(String provider){}
         public void onProviderEnabled(String provider){}
         public void onStatusChanged(String provider, int status, Bundle extras){}
    }; 


    /**
     * Returns best location using LocationManager.getBestProvider()
     * 
     * @param context
     * @return Location|null
     */
    public static Location getLocation(Context context){
        System.println("getLocation()");

        // fetch last known location and update it
        try {
            LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

            Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
             criteria.setAltitudeRequired(false);
             criteria.setBearingRequired(false);
             criteria.setCostAllowed(true);
             String strLocationProvider = lm.getBestProvider(criteria, true);

             System.println("strLocationProvider=" + strLocationProvider);
             Location location = lm.getLastKnownLocation(strLocationProvider);
             if(location != null){
                return location;
             }
             return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

GPS সক্ষম থাকলে এই ক্লাসটি min_gps_sat_count উপগ্রহগুলিতে সংযোগ করার চেষ্টা করে। অন্যথায় LocationManager.getBestProvider() অবস্থানটি ফেরত দেয়। কোড চেক করুন!


অবস্থান ভিত্তিক পরিষেবাদি জিপিএস ব্যতীত অন্যান্য অবকাঠামো থেকে অবস্থান পেতে পারে কিনা তা আমি নিশ্চিত নই, তবে সেই নিবন্ধ অনুসারে, এটি সম্ভব মনে হচ্ছে:

অ্যাপ্লিকেশন বিভিন্ন ধরনের অবস্থান পদ্ধতিতে কল করতে পারেন।

মোবাইল ফোন নেটওয়ার্ক ব্যবহার করে: বর্তমান সেল আইডিটি বেজ ট্রান্সসিভার স্টেশন (বিটিএস) সনাক্ত করতে ব্যবহার করা যেতে পারে যা ডিভাইসটির সাথে যোগাযোগ করছে এবং সেই বিটিএসগুলির অবস্থান। স্পষ্টতই, এই পদ্ধতির সঠিকতা কোষের আকারের উপর নির্ভর করে এবং এটি বেশ ভুল হতে পারে। একটি জিএসএম কোষ ২ থেকে ২0 কিলোমিটার ব্যাস হতে পারে। সেল আইডি বরাবর ব্যবহৃত অন্যান্য কৌশল 150 মিটার মধ্যে সঠিকতা অর্জন করতে পারেন।

উপগ্রহ ব্যবহার করে: মার্কিন যুক্তরাষ্ট্রের প্রতিরক্ষা বিভাগ দ্বারা নিয়ন্ত্রিত গ্লোবাল পজিশনিং সিস্টেম (জিপিএস) পৃথিবীকে ঘিরে থাকা 24 টি উপগ্রহের একটি উপগ্রহ ব্যবহার করে। জিপিএস বিভিন্ন উপগ্রহ থেকে সিগন্যাল রিসিভার পৌঁছানোর সময় পার্থক্য গণনা করে ডিভাইসের অবস্থান নির্ধারণ করে। GPS সিগন্যালগুলি এনকোড করা হয়েছে, তাই মোবাইল ডিভাইসটি অবশ্যই একটি GPS রিসিভারের সাথে সজ্জিত করা আবশ্যক। জিপিএস সম্ভাব্য সবচেয়ে সঠিক পদ্ধতি (4 এবং 40 মিটারের মধ্যে যদি জিপিএস রিসিভার আকাশের স্পষ্ট দৃষ্টিভঙ্গি থাকে), তবে এতে কিছু ত্রুটি রয়েছে: অতিরিক্ত হার্ডওয়্যার ব্যয়বহুল হতে পারে, ব্যবহারের সময় ব্যাটারি খাওয়া যায় এবং কিছু উষ্ণ- দৃশ্যমান উপগ্রহগুলিতে প্রাথমিক সংশোধন পেতে ঠান্ডা শুরু হওয়ার পরে। এটি শহরগুলিতে "ক্যানিয়ন প্রভাব" থেকেও ভুগছে, যেখানে উপগ্রহ দৃশ্যমানতা অন্তর্বর্তী।

স্বল্প-পরিসীমা পজিশনিং বীকনগুলি ব্যবহার করে: তুলনামূলকভাবে ছোট এলাকায় যেমন একটি একক বিল্ডিং, স্থানীয় এলাকা নেটওয়ার্ক অন্যান্য পরিষেবাদি সহ অবস্থান সরবরাহ করতে পারে। উদাহরণস্বরূপ, উপযুক্ত সজ্জিত ডিভাইসগুলি স্বল্প-পরিসীমা পজিশনিংয়ের জন্য Bluetooth ব্যবহার করতে পারে।


সম্পাদনা করুন: Google Play পরিষেবাদি লাইব্রেরি থেকে সর্বশেষ অবস্থান পরিষেবা API এ আপডেট করা হয়েছে (জুলাই 2014)

আমি আপনাকে Google Play পরিষেবাদি লাইব্রেরি থেকে উপলব্ধ নতুন অবস্থান পরিষেবা API ব্যবহার করার সুপারিশ করব , যা আরো শক্তিশালী, উচ্চ স্তরের কাঠামো সরবরাহ করবে যা লোকেশন সরবরাহকারী পছন্দ এবং পাওয়ার ম্যানেজমেন্ট হিসাবে কাজগুলিকে স্বয়ংক্রিয় করে। আনুষ্ঠানিক ডকুমেন্টেশন অনুসারে: "... অবস্থান এপিআই আপনার অবস্থান-সচেতন অ্যাপ্লিকেশনগুলি নির্মাণের জন্য অন্তর্নিহিত অবস্থান প্রযুক্তির বিশদের উপর নজর দেওয়ার প্রয়োজন ছাড়া সহজ করে তোলে। তারা আপনাকে সমস্ত ক্ষমতা ব্যবহার করে বিদ্যুৎ খরচ কমিয়ে দেয়। ডিভাইস হার্ডওয়্যার। "

আরও তথ্যের জন্য যান: আপনার অ্যাপ অবস্থান-সচেতন করা

সর্বশেষ অবস্থান পরিষেবা API ব্যবহার করে একটি সম্পূর্ণ উদাহরণ দেখতে এখানে যান: Android অবস্থান ক্লায়েন্ট শ্রেণীটি অব্যবহৃত কিন্তু ডকুমেন্টেশন ব্যবহার করা হয়


অ্যান্ড্রয়েডে অবস্থান আপডেট পেতে এটিতে অনেকগুলি জিনিস প্রয়োজন, এতে প্রচুর বলিয়ারপ্লেট কোড প্রয়োজন।

আপনি যত্ন নিতে হবে

  • গুগল প্লে সেবা উপকারিতা চেক করুন,
  • এটি পুরানো বা উপলব্ধ না হলে Google Play পরিষেবা আপডেট করুন
  • গুগল এপিআই ক্লায়েন্টের ডায়ালগ সৃষ্টি এবং এর কলব্যাক সংযুক্ত, বিচ্ছিন্ন ইত্যাদি
  • অবস্থান আপডেট জন্য বন্ধ এবং রিলিজ সম্পদ
  • অবস্থান অনুমতি পরিস্থিতিতে হ্যান্ডলিং
  • অবস্থান সেবা পরীক্ষা চালু বা বন্ধ
  • Lastknown অবস্থান পেয়ে তাই হয় না
  • কিছু নির্দিষ্ট সময়ের পরে অবস্থান না পেয়ে শেষ পরিচিত অবস্থান থেকে Fallback

আমি অ্যান্ড্রয়েড-ইজলোকোশন (ছোট অ্যান্ড্রয়েড লাইব্রেরি) তৈরি করেছি যা এই সমস্ত জিনিসগুলি যত্ন নেবে এবং আপনি ব্যবসায়িক লজিকের উপর মনোযোগ দিতে পারেন।

আপনি প্রয়োজন EasyLocation অ্যাক্টিভিটি এবং এই প্রসারিত করা হয়

requestSingleLocationFix(easyLocationRequest);

অথবা

requestLocationUpdates(easyLocationRequest);

চেকআউট নমুনা অ্যাপ্লিকেশন এবং এখানে https://github.com/akhgupta/Android-EasyLocation এ প্রয়োজনীয় পদক্ষেপ


এই কোড যে ব্যবহারকারী বর্তমান অবস্থান উপলব্ধ করা হয়

মানচিত্র অ্যাক্টিভিটি তৈরি করুন:

public class Maps extends MapActivity {

    public static final String TAG = "MapActivity";
    private MapView mapView;
    private LocationManager locationManager;
    Geocoder geocoder;
    Location location;
    LocationListener locationListener;
    CountDownTimer locationtimer;
    MapController mapController;
    MapOverlay mapOverlay = new MapOverlay();

    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        initComponents();
        mapView.setBuiltInZoomControls(true);
        mapView.setSatellite(true);
        mapView.setTraffic(true);
        mapView.setStreetView(true);
        mapController = mapView.getController();
        mapController.setZoom(16);
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        if (locationManager == null) {
            Toast.makeText(Maps.this, "Location Manager Not Available",
                Toast.LENGTH_SHORT).show();
            return;
        }
        location = locationManager
                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (location == null)
            location = locationManager
                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        if (location != null) {
            double lat = location.getLatitude();
            double lng = location.getLongitude();
            Toast.makeText(Maps.this, "Location Are" + lat + ":" + lng,
                Toast.LENGTH_SHORT).show();
            GeoPoint point = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
            mapController.animateTo(point, new Message());
            mapOverlay.setPointToDraw(point);
            List<Overlay> listOfOverlays = mapView.getOverlays();
            listOfOverlays.clear();
            listOfOverlays.add(mapOverlay);
        }
        locationListener = new LocationListener() {

            public void onStatusChanged(String arg0, int arg1, Bundle arg2) {}

            public void onProviderEnabled(String arg0) {}

            public void onProviderDisabled(String arg0) {}

            public void onLocationChanged(Location l) {
                location = l;
                locationManager.removeUpdates(this);
                if (l.getLatitude() == 0 || l.getLongitude() == 0) {
                } else {
                    double lat = l.getLatitude();
                    double lng = l.getLongitude();
                    Toast.makeText(Maps.this, "Location Are" + lat + ":" + lng,
                        Toast.LENGTH_SHORT).show();
                }
            }
        };
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
            locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, 1000, 10f, locationListener);
        locationManager.requestLocationUpdates(
            LocationManager.NETWORK_PROVIDER, 1000, 10f, locationListener);
        locationtimer = new CountDownTimer(30000, 5000) {

            @Override
            public void onTick(long millisUntilFinished) {
                if (location != null) locationtimer.cancel();
            }

            @Override
            public void onFinish() {
                if (location == null) {
                }
            }
        };
        locationtimer.start();
    }

    public MapView getMapView() {
        return this.mapView;
    }

    private void initComponents() {
        mapView = (MapView) findViewById(R.id.map_container);
        ImageView ivhome = (ImageView) this.findViewById(R.id.imageView_home);
        ivhome.setOnClickListener(new OnClickListener() {

            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(Maps.this, GridViewContainer.class);
                startActivity(intent);
                finish();
            }
        });
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    class MapOverlay extends Overlay {

        private GeoPoint pointToDraw;

        public void setPointToDraw(GeoPoint point) {
            pointToDraw = point;
        }

        public GeoPoint getPointToDraw() {
            return pointToDraw;
        }

        @Override
        public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
                long when) {
            super.draw(canvas, mapView, shadow);
            Point screenPts = new Point();
            mapView.getProjection().toPixels(pointToDraw, screenPts);
            Bitmap bmp = BitmapFactory.decodeResource(getResources(),
                R.drawable.select_map);
            canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 24, null);
            return true;
        }
    }
}

main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/black"
        android:orientation="vertical" >

        <com.google.android.maps.MapView
            android:id="@+id/map_container"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:apiKey="yor api key"
            android:clickable="true"
            android:focusable="true" />

    </LinearLayout>

এবং ম্যানিফেস্টে নিম্নলিখিত অনুমতি সংজ্ঞায়িত:

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

এখানে আমি কি করি:

  1. প্রথমত আমি নেটওয়ার্কে বা জিপিএস সরবরাহকারী সক্ষম কিনা তা পরীক্ষা করে দেখি। কিছু ডিভাইসে অক্ষম করা হতে পারে, কিছু অ্যাপ্লিকেশন ম্যানিফেস্টে অক্ষম করা হতে পারে। যদি কোনও প্রদানকারী সক্ষম থাকে, তবে আমি এই প্রদানকারীর জন্য ক্যাশেড শেষ অবস্থান আনতে এবং এই প্রদানকারীর জন্য অবস্থান আপডেট শুরুর শুরু করি।
  2. লিংক হিসাবে উল্লিখিত সর্বশেষ প্রাপ্ত অবস্থানের চেয়ে একটি অবস্থান ভাল কিনা তা নির্ধারণ করার একটি পদ্ধতি রয়েছে: - https://developer.android.com/guide/topics/location/strategies.html#BestEstimate
  3. আমি অবস্থান শ্রোতা থেকে আপডেট পেতে হলে আমি এই অবস্থান পূর্বে প্রাপ্ত অবস্থানের চেয়ে ভাল কিনা তা পরীক্ষা করে দেখুন। এবং যদি এটি পূর্বের সেরা অবস্থান ( mFinalLocation) এ এই অবস্থানটি প্রতিস্থাপন করার চেয়ে ভাল হয় ।
  4. দুই মিনিটের জন্য একটি হ্যান্ডলার (টাইমার) রয়েছে, যা অবশেষে পরিষেবাটি এবং পরিষেবা onDestroy()পদ্ধতিতে বন্ধ করে দেয় , প্রতিটি প্রদানকারীর অবস্থান আপডেটের জন্য শোনা বন্ধ করে দিন।

নীচে পরিষেবা জন্য কোড। আপনি প্রয়োজন অবস্থান আপডেট ফ্রিকোয়েন্সি উপর ভিত্তি করে এটি চালাতে পারেন।

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.annotation.Nullable;
import android.util.Log;


public class RecordLocationService extends Service {

    private final String TAG = RecordLocationService.class.getSimpleName();

    private final int TWO_MINUTES = 1000 * 60 * 2;

    private LocationManager mLocationManager;

    private MyLocationListener mLocationListeners[] = new MyLocationListener[]{
            new MyLocationListener(LocationManager.NETWORK_PROVIDER),
            new MyLocationListener(LocationManager.GPS_PROVIDER)
    };

    private Location mFinalLocation;

    private class MyLocationListener implements LocationListener {
        private String mProvider;

        public MyLocationListener(String provider) {
            Log.d(TAG, "LocationListener : " + provider);
            mProvider = provider;
        }

        public String getProvider() {
            return mProvider;
        }

        @Override
        public void onLocationChanged(Location location) {
            Log.d(TAG, "onLocationChanged : " + location);

            if (isBetterLocation(location, mFinalLocation)) {
                Log.d(TAG, "Setting current Final Location to recent most Location for Provider : " + location.getProvider());
                Log.d(TAG, "Setting current Final Location to : " + location);
                mFinalLocation = location;
            } else {
                Log.d(TAG, "Keeping current Final Location to previous Final Location");
            }

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.d(TAG, "onStatusChanged provider " + provider);
        }

        @Override
        public void onProviderEnabled(String provider) {
            Log.d(TAG, "onProviderEnabled provider " + provider);
        }

        @Override
        public void onProviderDisabled(String provider) {
            Log.d(TAG, "onProviderDisabled provider " + provider);
        }
    }

    private Handler mStopServiceHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1: {
                    stopSelf();
                }
                break;
            }
        }
    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        Log.d(TAG, "onStartCommand");
        return START_STICKY;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
        requestLocation();
        mStopServiceHandler.sendEmptyMessageDelayed(1, TWO_MINUTES);
    }

    private void requestLocation() {
        // Acquire a reference to the system Location Manager
        if (mLocationManager == null) {
            mLocationManager = (LocationManager) this.getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        }

        try {
            if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER) && mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
                Log.d(TAG, "Fetching Cached Location for Provider : " + LocationManager.NETWORK_PROVIDER);
                Location cachedNetworkLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

                if (cachedNetworkLocation != null) {
                    Log.d(TAG, "Setting Final Location to Cached Location for Provider : " + LocationManager.NETWORK_PROVIDER);
                    Log.d(TAG, "Setting Final Location to : " + cachedNetworkLocation);
                    mFinalLocation = cachedNetworkLocation;
                } else {
                    Log.d(TAG, "Cached Location for Provider : " + LocationManager.NETWORK_PROVIDER + " is NULL");
                }

                Log.d(TAG, "Requesting Location Update for Provider : " + LocationManager.NETWORK_PROVIDER);
                mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListeners[0]);
            }

        } catch (SecurityException se) {
            Log.e(TAG, se.getMessage(), se);
        } catch (IllegalArgumentException iae) {
            Log.e(TAG, iae.getMessage(), iae);
        }

        try {
            if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER) && mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                Log.d(TAG, "Fetching Cached Location for Provider : " + LocationManager.GPS_PROVIDER);
                Location cachedGPSLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

                if (cachedGPSLocation != null) {
                    if (isBetterLocation(cachedGPSLocation, mFinalLocation)) {
                        Log.d(TAG, "Setting Final Location to Cached Location for Provider : " + LocationManager.GPS_PROVIDER);
                        Log.d(TAG, "Setting Final Location to : " + cachedGPSLocation);
                        mFinalLocation = cachedGPSLocation;
                    }
                } else {
                    Log.d(TAG, "Cached Location for Provider : " + LocationManager.GPS_PROVIDER + " is NULL");
                }

                Log.d(TAG, "Requesting Location Update for Provider : " + LocationManager.GPS_PROVIDER);
                mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListeners[1]);
            }

        } catch (SecurityException se) {
            Log.e(TAG, se.getMessage(), se);
        } catch (IllegalArgumentException iae) {
            Log.e(TAG, iae.getMessage(), iae);
        }


    }

    /**
     * Determines whether one Location reading is better than the current Location fix
     *
     * @param location            The new Location that you want to evaluate
     * @param currentBestLocation The current Location fix, to which you want to compare the new one
     */
    protected boolean isBetterLocation(Location location, Location currentBestLocation) {
        if (currentBestLocation == null) {
            // A new location is always better than no location
            return true;
        }

        // Check whether the new location fix is newer or older
        long timeDelta = location.getTime() - currentBestLocation.getTime();
        boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
        boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
        boolean isNewer = timeDelta > 0;

        // If it's been more than two minutes since the current location, use the new location
        // because the user has likely moved
        if (isSignificantlyNewer) {
            return true;
            // If the new location is more than two minutes older, it must be worse
        } else if (isSignificantlyOlder) {
            return false;
        }

        // Check whether the new location fix is more or less accurate
        int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
        boolean isLessAccurate = accuracyDelta > 0;
        boolean isMoreAccurate = accuracyDelta < 0;
        boolean isSignificantlyLessAccurate = accuracyDelta > 200;

        // Check if the old and new location are from the same provider
        boolean isFromSameProvider = isSameProvider(location.getProvider(),
                currentBestLocation.getProvider());

        // Determine location quality using a combination of timeliness and accuracy
        if (isMoreAccurate) {
            return true;
        } else if (isNewer && !isLessAccurate) {
            return true;
        } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
            return true;
        }
        return false;
    }

    /**
     * Checks whether two providers are the same
     */
    private boolean isSameProvider(String provider1, String provider2) {
        if (provider1 == null) {
            return provider2 == null;
        }
        return provider1.equals(provider2);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        if (mLocationManager != null) {
            for (int i = 0; i < mLocationListeners.length; i++) {
                try {
                    Log.d(TAG, "Removing Location Update for Provider : " + mLocationListeners[i].getProvider());
                    mLocationManager.removeUpdates(mLocationListeners[i]);
                } catch (Exception ex) {
                    Log.e(TAG, "fail to remove location listeners, ignore", ex);
                }
            }
        }
    }
}

সম্প্রতি কোডের অবস্থানটি পুনরুদ্ধার করা, কিছু ভাল ধারণা শিখতে এবং অবশেষে তুলনামূলকভাবে নিখুঁত লাইব্রেরি এবং ডেমো অর্জন করে।

//request all valid provider(network/gps)
private boolean requestAllProviderUpdates() {
    checkRuntimeEnvironment();
    checkPermission();

    if (isRequesting) {
        EasyLog.d("Request location update is busy");
        return false;
    }


    long minTime = getCheckTimeInterval();
    float minDistance = getCheckMinDistance();

    if (mMapLocationListeners == null) {
        mMapLocationListeners = new HashMap<>();
    }

    mValidProviders = getValidProviders();
    if (mValidProviders == null || mValidProviders.isEmpty()) {
        throw new IllegalArgumentException("Not available provider.");
    }

    for (String provider : mValidProviders) {
        LocationListener locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                if (location == null) {
                    EasyLog.e("LocationListener callback location is null.");
                    return;
                }
                printf(location);
                mLastProviderTimestamp = location.getTime();

                if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
                    finishResult(location);
                } else {
                    doLocationResult(location);
                }

                removeProvider(location.getProvider());
                if (isEmptyValidProviders()) {
                    requestTimeoutMsgInit();
                    removeUpdates();
                }
            }

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

            @Override
            public void onProviderEnabled(String provider) {
            }

            @Override
            public void onProviderDisabled(String provider) {
            }
        };
        getLocationManager().requestLocationUpdates(provider, minTime, minDistance, locationListener);
        mMapLocationListeners.put(provider, locationListener);
        EasyLog.d("Location request %s provider update.", provider);
    }
    isRequesting = true;
    return true;
}

//remove request update
public void removeUpdates() {
    checkRuntimeEnvironment();

    LocationManager locationManager = getLocationManager();
    if (mMapLocationListeners != null) {
        Set<String> keys = mMapLocationListeners.keySet();
        for (String key : keys) {
            LocationListener locationListener = mMapLocationListeners.get(key);
            if (locationListener != null) {
                locationManager.removeUpdates(locationListener);
                EasyLog.d("Remove location update, provider is " + key);
            }
        }
        mMapLocationListeners.clear();
        isRequesting = false;
    }
}

//Compared with the last successful position, to determine whether you need to filter
private boolean isNeedFilter(Location location) {
    checkLocation(location);

    if (mLastLocation != null) {
        float distance = location.distanceTo(mLastLocation);
        if (distance < getCheckMinDistance()) {
            return true;
        }
        if (location.getAccuracy() >= mLastLocation.getAccuracy()
                && distance < location.getAccuracy()) {
            return true;
        }
        if (location.getTime() <= mLastProviderTimestamp) {
            return true;
        }
    }
    return false;
}

private void doLocationResult(Location location) {
    checkLocation(location);

    if (isNeedFilter(location)) {
        EasyLog.d("location need to filtered out, timestamp is " + location.getTime());
        finishResult(mLastLocation);
    } else {
        finishResult(location);
    }
}

//Return to the finished position
private void finishResult(Location location) {
    checkLocation(location);

    double latitude = location.getLatitude();
    double longitude = location.getLongitude();
    float accuracy = location.getAccuracy();
    long time = location.getTime();
    String provider = location.getProvider();

    if (mLocationResultListeners != null && !mLocationResultListeners.isEmpty()) {
        String format = "Location result:<%f, %f> Accuracy:%f Time:%d Provider:%s";
        EasyLog.i(String.format(format, latitude, longitude, accuracy, time, provider));

        mLastLocation = location;
        synchronized (this) {
            Iterator<LocationResultListener> iterator =  mLocationResultListeners.iterator();
            while (iterator.hasNext()) {
                LocationResultListener listener = iterator.next();
                if (listener != null) {
                    listener.onResult(location);
                }
                iterator.remove();
            }
        }
    }
}

সম্পূর্ণ কোড: https://github.com/bingerz/FastLocation/blob/master/fastlocationlib/src/main/java/cn/bingerz/fastlocation/FastLocation.java

* অবস্থানটি সম্পূর্ণ করার জন্য প্রতিটি অনুরোধ, আপডেটগুলি অপসারণ করা সেরা, অন্যথা ফোন স্ট্যাটাস বার সর্বদা পজিশনিং আইকন প্রদর্শন করবে।


@Fedor এর Kotlin সংস্করণ Greate উত্তর:

ক্লাস ব্যবহার:

val locationResult = object : MyLocation.LocationResult() {

    override fun gotLocation(location: Location?) {

        val lat = location!!.latitude
        val lon = location.longitude

        Toast.makeText(context, "$lat --SLocRes-- $lon", Toast.LENGTH_SHORT).show()
    }

}

val myLocation = MyLocation()
myLocation.getLocation(inflater.context, locationResult)

MyLocation ক্লাস:

class MyLocation {
    internal lateinit var timer1: Timer
    internal var lm: LocationManager? = null
    internal lateinit var locationResult: LocationResult
    internal var gps_enabled = false
    internal var network_enabled = false

    internal var locationListenerGps: LocationListener = object : LocationListener {


        override fun onLocationChanged(location: Location) {
            timer1.cancel()
            locationResult.gotLocation(location)
            lm!!.removeUpdates(this)
            lm!!.removeUpdates(locationListenerNetwork)
        }

        override fun onProviderDisabled(provider: String) {}
        override fun onProviderEnabled(provider: String) {}
        override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
    }

    internal var locationListenerNetwork: LocationListener = object : LocationListener {
        override fun onLocationChanged(location: Location) {
            timer1.cancel()
            locationResult.gotLocation(location)
            lm!!.removeUpdates(this)
            lm!!.removeUpdates(locationListenerGps)
        }

        override fun onProviderDisabled(provider: String) {}
        override fun onProviderEnabled(provider: String) {}
        override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
    }

    fun getLocation(context: Context, result: LocationResult): Boolean {
        //I use LocationResult callback class to pass location value from MyLocation to user code.
        locationResult = result
        if (lm == null)
            lm = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager?

        //exceptions will be thrown if provider is not permitted.
        try {
            gps_enabled = lm!!.isProviderEnabled(LocationManager.GPS_PROVIDER)
        } catch (ex: Exception) {
        }

        try {
            network_enabled = lm!!.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
        } catch (ex: Exception) {
        }

        //don't start listeners if no provider is enabled
        if (!gps_enabled && !network_enabled)
            return false

        if (ActivityCompat.checkSelfPermission(context,
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ||
            ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) run {

            ActivityCompat.requestPermissions(context as Activity,
                arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION), 111)
        }


        if (gps_enabled)
            lm!!.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, locationListenerGps)
        if (network_enabled)
            lm!!.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0f, locationListenerNetwork)
        timer1 = Timer()
        timer1.schedule(GetLastLocation(context), 20000)
        return true
    }

    internal inner class GetLastLocation(var context: Context) : TimerTask() {
        override fun run() {
            lm!!.removeUpdates(locationListenerGps)
            lm!!.removeUpdates(locationListenerNetwork)

            var net_loc: Location? = null
            var gps_loc: Location? = null

            if (ActivityCompat.checkSelfPermission(context,
                    Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ||
                ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
            ) run {

                ActivityCompat.requestPermissions(context as Activity,
                    arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION),111)
            }


            if (gps_enabled)
                gps_loc = lm!!.getLastKnownLocation(LocationManager.GPS_PROVIDER)
            if (network_enabled)
                net_loc = lm!!.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)

            //if there are both values use the latest one
            if (gps_loc != null && net_loc != null) {
                if (gps_loc.getTime() > net_loc.getTime())
                    locationResult.gotLocation(gps_loc)
                else
                    locationResult.gotLocation(net_loc)
                return
            }

            if (gps_loc != null) {
                locationResult.gotLocation(gps_loc)
                return
            }
            if (net_loc != null) {
                locationResult.gotLocation(net_loc)
                return
            }
            locationResult.gotLocation(null)
        }
    }

     abstract class LocationResult {
          abstract fun gotLocation(location: Location?)
    }
}

আমি উত্তর দেওয়ার আগে, আমি শুধু নিউইয়র্কের সাথে যুক্ত যে বিষয়টি সম্পর্কে অবগত হতে চাই। এখন আপনার প্রশ্ন। সুতরাং, আপনার ব্যবহারকারীর অবস্থান পেতে কোডিংয়ের পিছনে আপনার সময় নষ্ট করার পরিবর্তে, আপনি আমাদের SDK ব্যবহার করতে পারেন। এটি সংহত করার জন্য 30 মিনিটেরও কম সময় লাগে। Neura আপনাকে আপনার ব্যবহারকারীর অবস্থান / ক্রিয়াকলাপ সরবরাহ করে এবং আপনি তথ্যটি পাওয়ার পরে নির্দিষ্ট কাজগুলি সম্পাদনের জন্য আপনার অ্যাপ্লিকেশনটি সেই অনুযায়ী কনফিগার করতে পারেন। অন্যান্য কার্যকলাপ স্বীকৃতি API এর উপরে নিরার ব্যবহার করার কয়েকটি কারণ এখানে রয়েছে:

  1. আপনার ব্যবহারকারী বুঝতে লাইন টন কোড প্রয়োজন।
  2. আপনি সঠিক ফলাফল দেয়।
  3. আপনার ব্যাটারি 1% কম।

উত্তর এখানে ইতিমধ্যে দেওয়া হলেও। আমি শুধু বিশ্বের এই শেয়ার করতে চেয়েছিলেন যেমন পরিস্থিতিতে জুড়ে আসা।

আমার প্রয়োজন ছিল যে ব্যবহারকারীর বর্তমান অবস্থান সর্বাধিক 30 থেকে 35 সেকেন্ডের মধ্যে পেতে হবে তাই নিরভ রানপাড়ার উত্তর অনুসারে আমি যে সমাধানটি করেছি তা এখানে ।

1. আমি MyLocationManager.java ক্লাস তৈরি করেছি যা সমস্ত GPS এবং নেটওয়ার্ক স্টাফ পরিচালনা করে

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import com.app.callbacks.OnLocationDetectectionListener;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;

public class MyLocationManager {
    /** The minimum distance to GPS change Updates in meters **/
    private final long MIN_DISTANCE_CHANGE_FOR_UPDATES_FOR_GPS = 2; // 2
                                                                    // meters
    /** The minimum time between GPS updates in milliseconds **/
    private final long MIN_TIME_BW_UPDATES_OF_GPS = 1000 * 5 * 1; // 5
                                                                    // seconds

    /** The minimum distance to NETWORK change Updates in meters **/
    private final long MIN_DISTANCE_CHANGE_FOR_UPDATES_FOR_NETWORK = 5; // 5
                                                                        // meters
    /** The minimum time between NETWORK updates in milliseconds **/
    private final long MIN_TIME_BW_UPDATES_OF_NETWORK = 1000 * 10 * 1; // 10
                                                                        // seconds

    /**
     * Lets just say i don't trust the first location that the is found. This is
     * to avoid that
     **/

    private int NetworkLocationCount = 0, GPSLocationCount = 0;
    private boolean isGPSEnabled;
    private boolean isNetworkEnabled;
    /**
     * Don't do anything if location is being updated by Network or by GPS
     */
    private boolean isLocationManagerBusy;
    private LocationManager locationManager;
    private Location currentLocation;
    private Context mContext;
    private OnLocationDetectectionListener mListener;

    public MyLocationManager(Context mContext,
            OnLocationDetectectionListener mListener) {
        this.mContext = mContext;
        this.mListener = mListener;
    }

    /**
     * Start the location manager to find my location
     */
    public void startLocating() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(Context.LOCATION_SERVICE);

            // Getting GPS status
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // Getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // No network provider is enabled
                showSettingsAlertDialog();
            } else {
                // If GPS enabled, get latitude/longitude using GPS Services
                if (isGPSEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES_OF_GPS,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES_FOR_GPS,
                            gpsLocationListener);

                }
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES_OF_NETWORK,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES_FOR_NETWORK,
                            networkLocationListener);

                }
            }
            /**
             * My 30 seconds plan to get myself a location
             */
            ScheduledExecutorService se = Executors
                    .newSingleThreadScheduledExecutor();
            se.schedule(new Runnable() {

                @Override
                public void run() {
                    if (currentLocation == null) {
                        if (isGPSEnabled) {
                            currentLocation = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        } else if (isNetworkEnabled) {
                            currentLocation = locationManager
                                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

                        }
                        if (currentLocation != null && mListener != null) {
                            locationManager.removeUpdates(gpsLocationListener);
                            locationManager
                                    .removeUpdates(networkLocationListener);
                            mListener.onLocationDetected(currentLocation);
                        }
                    }
                }
            }, 30, TimeUnit.SECONDS);

        } catch (Exception e) {
            Log.e("Error Fetching Location", e.getMessage());
            Toast.makeText(mContext,
                    "Error Fetching Location" + e.getMessage(),
                    Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * Handle GPS location listener callbacks
     */
    private LocationListener gpsLocationListener = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onLocationChanged(Location location) {

            if (GPSLocationCount != 0 && !isLocationManagerBusy) {
                Log.d("GPS Enabled", "GPS Enabled");
                isLocationManagerBusy = true;
                currentLocation = location;
                locationManager.removeUpdates(gpsLocationListener);
                locationManager.removeUpdates(networkLocationListener);
                isLocationManagerBusy = false;
                if (currentLocation != null && mListener != null) {
                    mListener.onLocationDetected(currentLocation);
                }
            }
            GPSLocationCount++;
        }
    };
    /**
     * Handle Network location listener callbacks
     */
    private LocationListener networkLocationListener = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onLocationChanged(Location location) {
            if (NetworkLocationCount != 0 && !isLocationManagerBusy) {
                Log.d("Network", "Network");
                isLocationManagerBusy = true;
                currentLocation = location;
                locationManager.removeUpdates(gpsLocationListener);
                locationManager.removeUpdates(networkLocationListener);
                isLocationManagerBusy = false;
                if (currentLocation != null && mListener != null) {
                    mListener.onLocationDetected(currentLocation);
                }
            }
            NetworkLocationCount++;
        }
    };

    /**
     * Function to show settings alert dialog. On pressing the Settings button
     * it will launch Settings Options.
     * */
    public void showSettingsAlertDialog() {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

        // Setting Dialog Title
        alertDialog.setTitle("GPS is settings");

        // Setting Dialog Message
        alertDialog
                .setMessage("GPS is not enabled. Do you want to go to settings menu?");

        // On pressing the Settings button.
        alertDialog.setPositiveButton("Settings",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(
                                Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        mContext.startActivity(intent);
                    }
                });

        // On pressing the cancel button
        alertDialog.setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });

        // Showing Alert Message
        alertDialog.show();
    }
}

2. আমি একটি ইন্টারফেস (কলব্যাক) OnLocationDetectectionListener.java তৈরি করেছি ফলাফল কলিং ফ্যাগমেন্ট বা কার্যকলাপ ফিরে যোগাযোগ করার জন্য

import android.location.Location;

public interface OnLocationDetectectionListener {
    public void onLocationDetected(Location mLocation);
}

3. তারপর আমি একটি MainAppActivty.java কার্যকলাপ তৈরি করেছি যা OnLocationDetectectionListenerইন্টারফেস প্রয়োগ করে এবং এখানে আমি কিভাবে আমার অবস্থানটি পেয়েছি

public class MainAppActivty extends Activity implements
        OnLocationDetectectionListener {

    private Location currentLocation;
    private MyLocationManager mLocationManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.activity_home);
        super.onCreate(savedInstanceState);
            mLocationManager = new MyLocationManager(this, this);
            mLocationManager.startLocating();
    }

    @Override
    public void onLocationDetected(Location mLocation) {
        //Your new Location is received here
        currentLocation = mLocation;
    }

4. আপনার ম্যানিফেস্ট ফাইলে নিম্নলিখিত অনুমতি যোগ করুন

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

এই অন্যদের জন্য সহায়ক আশা করি :)


এখানে কিছুক্ষন দেরী কিন্তু আমি এই ধরনের পরিস্থিতিতে কি করবো গুগল ম্যাপস এপিআই ব্যবহার করা এবং কাছাকাছি থাকা অবস্থানগুলি গুগল ম্যাপের ল্যাটিন এবং লং এপিআই ব্যবহার করে চিহ্নিত করা। প্লাস ব্যবহারকারীর অভিজ্ঞতা যদি আপনি মানচিত্রে তার অবস্থান প্রদর্শন করতে পারেন তবে ভাল। ব্যবহারকারী অবস্থান আপডেট বা Android api সঙ্গে frisking সম্পর্কে বিরক্ত করার প্রয়োজন নেই। গুগল ম্যাপস আপনার জন্য অভ্যন্তরীণ পরিচালনা করা যাক।

@emmby হয়তো এটির অ্যাপে সমাধান পেয়েছেন তবে ভবিষ্যতের রেফারেন্সের জন্য অবস্থানের নির্দিষ্ট জিনিসগুলির জন্য Google মানচিত্র API এ একটি চেহারা যা আমি সহকর্মী ডেভেলপারদের কাছে সুপারিশ করি।

সম্পাদনা করুন: গুগল ম্যাপে ব্যবহারকারীর অবস্থান প্রদর্শনের জন্য লিংক


প্রকৃতপক্ষে আমরা দুটি প্রদানকারীর (GPS এবং নেটওয়ার্কে) ব্যবহার করতে পারি। এবং তারা শুধু একটি পাবলিক শ্রোতা শেয়ার করুন:

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10 * 1000, (float) 10.0, listener);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 90 * 1000, (float) 10.0, listener);

এটি প্রয়োজনীয় কারণ OnLocationChanged()সর্বদা পদ্ধতিতে বলা দরকার।


সব উত্তর দেখে, এবং প্রশ্ন ( সরল এবং শক্তসমর্থ )। আমি কেবল লাইব্রেরি Android-ReactiveLocation সম্পর্কে ক্লিক করেছি ।

যখন আমি একটি অবস্থান ট্র্যাকিং অ্যাপ্লিকেশন তৈরি। তারপরে আমি বুঝতে পেরেছি যে ব্যাটারিটির সাথে অপ্টিমাইজেশানযুক্ত অবস্থান ট্র্যাকিংয়ের জন্য এটি খুব সাধারণ।

তাই আমি ফ্রেশার এবং আরও ডেভেলপারদের বলতে চাই যারা ভবিষ্যতের অপ্টিমাইজেশনগুলির সাথে তাদের অবস্থান কোড বজায় রাখতে চান না। এই লাইব্রেরি ব্যবহার করুন।

ReactiveLocationProvider locationProvider = new 

    ReactiveLocationProvider(context);
    locationProvider.getLastKnownLocation()
        .subscribe(new Consumer<Location>() {
            @Override
            public void call(Location location) {
                doSthImportantWithObtainedLocation(location);
            }
        });

নির্ভরতা app level build.gradle মধ্যে রাখা

dependencies {
    ...
    compile 'pl.charmas.android:android-reactive-location2:[email protected]'
    compile 'com.google.android.gms:play-services-location:11.0.4' //you can use newer GMS version if you need
    compile 'com.google.android.gms:play-services-places:11.0.4'
    compile 'io.reactivex:rxjava:2.0.5' //you can override RxJava version if you need
}

এই lib ব্যবহার করার জন্য পেশাদার:

  • এই lib এবং সক্রিয়ভাবে রক্ষণাবেক্ষণ করা হবে।
  • আপনি ব্যাটারি অপ্টিমাইজেশান সম্পর্কে চিন্তা করবেন না। বিকাশকারীরা তাদের সেরা কাজ করেছেন।
  • সহজ ইনস্টলেশন, নির্ভরতা এবং খেলা রাখা।
  • সহজেই প্লে সার্ভিসেস API এ সংযোগ করুন
  • শেষ পরিচিত অবস্থান প্রাপ্ত
  • অবস্থান আপডেট ব্যবহার করার জন্য সাবস্ক্রাইব করুন
  • অবস্থান সেটিংস এপিআই
  • Geofences পরিচালনা করুন
  • জিওকোড অবস্থান ঠিকানা তালিকা
  • কার্যকলাপ স্বীকৃতি
  • বর্তমান জায়গা API ফিচার জায়গা ব্যবহার করুন
  • স্বতঃপূর্ণ পরামর্শ

public static Location getBestLocation(Context ctxt) {
    Location gpslocation = getLocationByProvider(
        LocationManager.GPS_PROVIDER, ctxt);
    Location networkLocation = getLocationByProvider(
        LocationManager.NETWORK_PROVIDER, ctxt);
    Location fetchedlocation = null;
    // if we have only one location available, the choice is easy
    if (gpslocation != null) {
        Log.i("New Location Receiver", "GPS Location available.");
        fetchedlocation = gpslocation;
    } else {
        Log.i("New Location Receiver",
            "No GPS Location available. Fetching Network location lat="
                + networkLocation.getLatitude() + " lon ="
                + networkLocation.getLongitude());
        fetchedlocation = networkLocation;
    }
    return fetchedlocation;
}

/**
 * get the last known location from a specific provider (network/gps)
 */
private static Location getLocationByProvider(String provider, Context ctxt) {
    Location location = null;
    // if (!isProviderSupported(provider)) {
    // return null;
    // }
    LocationManager locationManager = (LocationManager) ctxt
            .getSystemService(Context.LOCATION_SERVICE);
    try {
        if (locationManager.isProviderEnabled(provider)) {
            location = locationManager.getLastKnownLocation(provider);
        }
    } catch (IllegalArgumentException e) {
        Log.i("New Location Receiver", "Cannot access Provider " + provider);
    }
    return location;
}




latitude-longitude