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

بپرسید

0

{{ digitTrunc(content.likes) }}

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

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

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

داخل کلاس 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 هم اجرا بشه و تغییر کنه.

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

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

پاسخ ها به این سوال

پاسخ ها به این سوال

{{ digitTrunc(post.likes) }}

این پست در تاریخ {{ dateString(new Date(post.deleteDate)) }} توسط {{ post.deletedByUser }} حذف شده است.

دلیل حذف: {{ post.deleteReason ?? 'نامشخص' }}

{{ err }}
{{ post.userAchivements.rhodiumAchievements }}
{{ post.userAchivements.platinumAchievements }}
{{ post.userAchivements.goldAchievements }}
{{ post.userAchivements.silverAchievements }}
{{ post.userAchivements.bronzeAchievements }}
{{ timeSince(new Date(post.date)) }} قبل

برای ثبت پاسخ خود در وب سایت وارد حساب کاربری خود شوید
قابلیت ارسال مطلب توسط مدیریت سایت غیر فعال شده است