امیرحسین میرزایی

ارسال لوکیشن با استفاده از Service ها دراندروید

سلام به تمامی برنامه نویسان اندروید؛

من میخوام یک برنامه ردیابی برای اندروید بنویسم که اگه کاربر از برنامه بیرون اومد همچنان اطلاعات مکانیو دریافت کنه و داخل بانک ذخیره کنه.

کد هایی که نوشتم

داخل کلاس MainActivity

public class MainActivity extends AppCompatActivity implements LocationListener {
Intent IntentMyIntentService;
@Override
    protected void onCreate(Bundle savedInstanceState) {
IntentMyIntentService=new Intent(MainActivity.this, MyLocationService.class);
                startService(IntentMyIntentService);
}

یک دکمه گذاشتم و گفتم زمانی که بر روی دکمه کلیک شد، سرویس مورد نظر از داخل Intent اجرا شود وداخل کلاس سرویس هم کد های زیر نوشتم:

public class MyLocationService extends Service {
    private static final String TAG = "MyLocationService";
    private LocationManager mLocationManager = null;
    private static final int LOCATION_INTERVAL = 1000;
    private static final float LOCATION_DISTANCE = 1f;
    private ThreadGroup threadGroup = new ThreadGroup("ServiceThreadGroup");
    String lat;
    String longi;

    private class LocationListener implements android.location.LocationListener, Runnable {
        Location mLastLocation;

        public LocationListener(String provider) {
            Log.e(TAG, "LocationListener " + provider);
            mLastLocation = new Location(provider);
            lat = "" + mLastLocation.getLatitude();
            longi = "" + mLastLocation.getLongitude();
        }

        public LocationListener(int counter, int startId) {

        }

        @Override
        public void onLocationChanged(Location location) {
            Log.e(TAG, "onLocationChanged: " + location);
            mLastLocation.set(location);
            if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                    ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                
                return;
            }
            mLocationManager.requestLocationUpdates(
                    LocationManager.PASSIVE_PROVIDER,
                    LOCATION_INTERVAL,
                    LOCATION_DISTANCE,
                    mLocationListeners[0]);
            lat=""+mLastLocation.getLatitude();
            longi=""+mLastLocation.getLongitude();
        }

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

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

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

        @Override
        public void run() {

            try {
                while (true) {
                    Log.e(TAG, "Run is run ");
                    Log.e(TAG,"lat is : "+lat);
                    Log.e(TAG,"long is : "+longi);
                    Thread.sleep(3000);

                }
            } catch (InterruptedException e) {
                Log.e(TAG, "Run is run ");
            }
        }
    }

   

    LocationListener[] mLocationListeners = new LocationListener[]{
            new LocationListener(LocationManager.PASSIVE_PROVIDER)
    };

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand");
        super.onStartCommand(intent, flags, startId);

        int counter = intent.getIntExtra("Counter", 0);
        new Thread(threadGroup, new LocationListener(counter, startId), "ServiceThread").start();

        return START_STICKY;
    }

    @Override
    public void onCreate() {

        Log.e(TAG, "onCreate");

        initializeLocationManager();

        try {
            mLocationManager.requestLocationUpdates(
                    LocationManager.PASSIVE_PROVIDER,
                    LOCATION_INTERVAL,
                    LOCATION_DISTANCE,
                    mLocationListeners[0]
            );
        } catch (java.lang.SecurityException ex) {
            Log.i(TAG, "fail to request location update, ignore", ex);
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "network provider does not exist, " + ex.getMessage());
        }

       
    }

    @Override
    public void onDestroy() {
        Log.e(TAG, "onDestroy");
        super.onDestroy();
       
    }

    private void initializeLocationManager() {
        Log.e(TAG, "initializeLocationManager - LOCATION_INTERVAL: "+ LOCATION_INTERVAL + " LOCATION_DISTANCE: " + LOCATION_DISTANCE);
        if (mLocationManager == null) {
            mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        }
    }
}

همه چیز کار میکنه و عالیه، زمانی که از برنامه بیرون میام یا به اصطلاح ondestroy() میزنم یا همون دکمه Home برنامه میزنم، برنامه stop نمیشه و به کار خودش ادامه میده، خب تا اینجا ظاهرا همه چیز خوبه! اما وقتی لوکیشن برنامه عوض میشه، اطلاعات نمایشی برای طول و عرض جغرافیایی تغییر نمیکنه! انگار دستورات داخل متد run فقط اجرا میشوند، ولی من میخوام onLocationChanged هم اجرا بشه و تغییر کنه.

اگ میشه راهنماییم کنین، ممنون.

#برنامه_ردیابی_در_اندروید #اجرای_بینهایت #اجرای_برنامه_در_بک_گراند #سرویس_ها_در_اندروید
لذت یادگیری با توسینسو
به عنوان شخصی که مدت هاست از سایت توسینسو استفاده می کنم باید بگم که واقعاً یکی از بهترین مرجع ها برای ارتقاء دانش شخصی هست. دوره های سایت، راهکارها و مطالب، همگی عالی هستند.
پاسخ شما
برای ارسال پاسخ خود وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....