سلام به تمامی برنامه نویسان اندروید؛
من میخوام یک برنامه ردیابی برای اندروید بنویسم که اگه کاربر از برنامه بیرون اومد همچنان اطلاعات مکانیو دریافت کنه و داخل بانک ذخیره کنه.
کد هایی که نوشتم
داخل کلاس 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 هم اجرا بشه و تغییر کنه.
اگ میشه راهنماییم کنین، ممنون.
این پست در تاریخ {{ dateString(new Date(post.deleteDate)) }} توسط {{ post.deletedByUser }} حذف شده است.
دلیل حذف: {{ post.deleteReason ?? 'نامشخص' }}
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود