অ্যান্ড্রয়েডে ব্যবহারকারীর অবস্থান
অ্যান্ড্রয়েডে ব্যবহারকারীর অবস্থান আইওএসের চেয়ে কিছুটা কম সোজা। বিভ্রান্তি শুরু করতে, আপনি এটি করতে পারেন এমন দুটি সম্পূর্ণ ভিন্ন উপায়। প্রথমটি এন্ড্রয়েড এপিআই ব্যবহার করছে android.location.LocationListener
এবং দ্বিতীয়টি গুগল প্লে পরিষেবাদি এপিআই ব্যবহার করছে com.google.android.gms.location.LocationListener
। চলুন উভয় মাধ্যমে যেতে দিন।
Android এর অবস্থান API
অ্যান্ড্রয়েডের অবস্থান এপিআইগুলি অবস্থান পেতে তিনটি পৃথক সরবরাহকারী ব্যবহার করে -
LocationManager.GPS_PROVIDER
- এই সরবরাহকারী উপগ্রহ ব্যবহার করে অবস্থান নির্ধারণ করে। অবস্থার উপর নির্ভর করে, এই সরবরাহকারীর কোনও অবস্থানের ফিক্স ফিরে পেতে কিছুটা সময় নিতে পারে।
LocationManager.NETWORK_PROVIDER
- এই সরবরাহকারী সেল টাওয়ার এবং ওয়াইফাই অ্যাক্সেস পয়েন্টগুলির উপলব্ধতার ভিত্তিতে অবস্থান নির্ধারণ করে। নেটওয়ার্ক দেখার জন্য ফলাফলগুলি পুনরুদ্ধার করা হয়।
LocationManager.PASSIVE_PROVIDER
- এই সরবরাহকারী অন্যান্য সরবরাহকারী দ্বারা উত্পাদিত অবস্থানগুলি ফিরিয়ে দেবে। অন্যান্য অ্যাপ্লিকেশন বা পরিষেবাদিগুলি নিজেরাই লোকেশনগুলিতে অনুরোধ না করে যখন আপনি আবেদন করতে পারেন তখন আপনি প্যাসিভভাবে অবস্থান আপডেটগুলি পান।
এর সংক্ষিপ্তসারটি হ'ল আপনি LocationManager
সিস্টেম থেকে কোনও অবজেক্ট পাবেন , প্রয়োগ করুন LocationListener
এবং এরপরে কল requestLocationUpdates
করুন LocationManager
।
এখানে একটি কোড স্নিপেট রয়েছে:
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
makeUseOfNewLocation(location);
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};
// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
অবস্থান কৌশলগুলিতে গুগলের এপিআই গাইডকোডটি খুব সুন্দরভাবে ব্যাখ্যা করে। তবে তারা আরও উল্লেখ করে যে বেশিরভাগ ক্ষেত্রে আপনি তার পরিবর্তে গুগল লোকেশন সার্ভিসেস এপিআই ব্যবহার করে আরও ভাল ব্যাটারি পারফরম্যান্স পাবেন । এখন শুরু হয় বিভ্রান্তি!
- গুগলের অবস্থান পরিষেবাদি এপিআই
গুগলের লোকেশন সার্ভিসেস এপিআই গুগল প্লে সার্ভিস APK এর একটি অংশ ( এটি কীভাবে সেট আপ করবেন তা এখানে রয়েছে )। এগুলি অ্যান্ড্রয়েডের এপিআইয়ের শীর্ষে নির্মিত। এই এপিআইগুলি উপরে উল্লিখিত সরবরাহকারীর পরিবর্তে একটি "ফিউজড লোকেশন প্রোভাইডার" সরবরাহ করে। নির্ভুলতা, ব্যাটারি ব্যবহার ইত্যাদির উপর ভিত্তি করে এই সরবরাহকারী কোন অন্তর্নিহিত সরবরাহকারীকে স্বয়ংক্রিয়ভাবে চয়ন করে তা দ্রুত হয় কারণ আপনি সিস্টেম-বিস্তৃত পরিষেবা থেকে অবস্থান পান যা এটি আপডেট করে চলে। এবং আপনি আরও উন্নত বৈশিষ্ট্য যেমন জিওফেন্সিং ব্যবহার করতে পারেন।
গুগলের অবস্থান পরিষেবাগুলি ব্যবহার করতে, আপনার অ্যাপ্লিকেশনটির সাথে সংযুক্ত হওয়া দরকার GooglePlayServicesClient
। ক্লায়েন্টের সাথে সংযোগ স্থাপন করতে, আপনার ক্রিয়াকলাপটি (বা টুকরো টুকরো, বা তাই) প্রয়োগ GooglePlayServicesClient.ConnectionCallbacks
এবং GooglePlayServicesClient.OnConnectionFailedListener
ইন্টারফেসের প্রয়োজন। এখানে একটি নমুনা কোড রয়েছে:
public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener {
LocationClient locationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
locationClient = new LocationClient(this, this, this);
}
@Override
public void onConnected(Bundle bundle) {
Location location = locationClient.getLastLocation() ;
Toast.makeText(this, "Connected to Google Play Services", Toast.LENGTH_SHORT).show();
}
@Override
public void onDisconnected() {
Toast.makeText(this, "Connected from Google Play Services.", Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
// code to handle failed connection
// this code can be found here — http://developer.android.com/training/location/retrieve-current.html
}
locationClient.getLastLocation()
নাল কেন ?
locationClient.getLastLocation()
ক্লায়েন্ট থেকে শেষ বার দেখা গিয়েছিল পায়। তবে, কমপক্ষে একটি ক্লায়েন্ট এর সাথে সংযুক্ত থাকলে ফিউজড অবস্থান সরবরাহকারী কেবল পটভূমির অবস্থান বজায় রাখবেন। প্রথম ক্লায়েন্ট একবার সংযুক্ত হয়ে গেলে, এটি অবিলম্বে একটি অবস্থান পাওয়ার চেষ্টা করবে। আপনার কার্যকলাপের প্রথম ক্লায়েন্ট সংযোগ করতে হয় এবং আপনি কল তাহলে getLastLocation()
ডানদিকে দূরে onConnected()
, এ সময়ে প্রথম অবস্থানে আসার জন্য নাও হতে পারে। এই পরিণাম ডেকে আনবে location
হচ্ছে null
।
এই সমস্যাটি সমাধান করার জন্য, সরবরাহকারীর অবস্থান না পাওয়া পর্যন্ত আপনাকে (অনির্দিষ্টকালের জন্য) অপেক্ষা করতে হবে এবং তারপরে কল করুন getLastLocation()
, যা জানা অসম্ভব। আরেকটি (আরও ভাল) বিকল্প হ'ল com.google.android.gms.location.LocationListener
পর্যায়ক্রমিক লোকেশন আপডেটগুলি পেতে ইন্টারফেসটি প্রয়োগ করা (এবং আপনি প্রথম আপডেট পাওয়ার পরে এটি স্যুইচ অফ করে)।
public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
// . . . . . . . . more stuff here
LocationRequest locationRequest;
LocationClient locationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
// . . . . other initialization code
locationClient = new LocationClient(this, this, this);
locationRequest = new LocationRequest();
// Use high accuracy
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
// Set the update interval to 5 seconds
locationRequest.setInterval(UPDATE_INTERVAL);
// Set the fastest update interval to 1 second
locationRequest.setFastestInterval(FASTEST_INTERVAL);
}
// . . . . . . . . other methods
@Override
public void onConnected(Bundle bundle) {
Location location = locationClient.getLastLocation();
if (location == null)
locationClient.requestLocationUpdates(locationRequest, this);
else
Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
// . . . . . . . . other methods
@Override
public void onLocationChanged(Location location) {
locationClient.removeLocationUpdates(this);
// Use the location here!!!
}
এই কোডটিতে, আপনি ক্লায়েন্টের ইতিমধ্যে শেষ অবস্থান (ইন onConnected
) আছে কিনা তা পরীক্ষা করছেন । যদি তা না হয় তবে আপনি অবস্থান আপডেটের জন্য অনুরোধ করছেন এবং আপডেট পাওয়ার সাথে সাথে অনুরোধগুলি ( onLocationChanged()
কলব্যাকে) স্যুইচ করছেন ।
মনে রাখবেন যে কলব্যাকের locationClient.requestLocationUpdates(locationRequest, this);
অভ্যন্তরে থাকতে হবে onConnected
, অন্যথায় আপনি একটি পাবেন IllegalStateException
কারণ আপনি গুগল প্লে পরিষেবা ক্লায়েন্টের সাথে সংযুক্ত না হয়ে অবস্থানের জন্য অনুরোধ করার চেষ্টা করবেন।
- ব্যবহারকারী অবস্থান পরিষেবাদি অক্ষম করেছে
অনেক সময়, ব্যবহারকারীর লোকেশন পরিষেবাদি অক্ষম থাকত (ব্যাটারি বাঁচাতে বা গোপনীয়তার কারণে)। এই জাতীয় ক্ষেত্রে, উপরের কোডটি এখনও অবস্থান আপডেটের জন্য অনুরোধ onLocationChanged
করবে , তবে কখনও কল করা হবে না। আপনি যদি লোকেশন পরিষেবাগুলি অক্ষম করেছেন কিনা তা পরীক্ষা করে আপনি অনুরোধগুলি থামাতে পারেন can
আপনার অ্যাপ্লিকেশনটির যদি লোকেশন পরিষেবাদি সক্ষম করার প্রয়োজন হয় তবে আপনি একটি বার্তা বা টোস্ট দেখাতে চাইবেন। দুর্ভাগ্যক্রমে, ব্যবহারকারী যদি গুগলের অবস্থান পরিষেবাদি এপিআইতে লোকেশন পরিষেবাদি অক্ষম করেছে কিনা তা পরীক্ষা করার কোনও উপায় নেই। এর জন্য আপনাকে অ্যান্ড্রয়েডের এপিআইতে ফিরে যেতে হবে।
আপনার onCreate
পদ্ধতিতে:
LocationManager manager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
locationEnabled = false;
Toast.makeText(getActivity(), "Enable location services for accurate data", Toast.LENGTH_SHORT).show();
}
else locationEnabled = true;
এবং locationEnabled
আপনার onConnected
পদ্ধতিতে পতাকাটি এভাবে ব্যবহার করুন:
if (location != null) {
Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
else if (location == null && locationEnabled) {
locationClient.requestLocationUpdates(locationRequest, this);
}
হালনাগাদ
দস্তাবেজ আপডেট হয়েছে, অবস্থানক্লিয়েন্ট সরানো হয়েছে এবং এপিআই ডায়ালগ থেকে এক ক্লিকে জিপিএস সক্ষম করতে সহায়তা করে:
task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
// All location settings are satisfied. The client can initialize
// location requests here.
// ...
}
});
task.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
if (e instanceof ResolvableApiException) {
// Location settings are not satisfied, but this can be fixed
// by showing the user a dialog.
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
ResolvableApiException resolvable = (ResolvableApiException) e;
resolvable.startResolutionForResult(MainActivity.this,
REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sendEx) {
// Ignore the error.
}
}
}
});
লিঙ্ক https://developer.android.com/training/location/change-location-settings#prompt
নতুন অবস্থানের ক্লায়েন্ট: ফিউজড লোকেশনপ্রভাইডারক্লায়েন্ট
private FusedLocationProviderClient fusedLocationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}
যেকোন অবস্থানের কাজ করার আগে https://developer.android.com/training/location এ যাওয়ার পরামর্শ দেওয়া হয় ।