Thứ Ba, 21 tháng 8, 2018

Android - Dịch vụ dựa trên vị trí

API vị trí của lập trình Android giúp bạn dễ dàng xây dựng các ứng dụng nhận biết vị trí mà không cần phải tập trung vào các chi tiết của công nghệ vị trí cơ bản.

Điều này trở nên khả thi với sự trợ giúp của các dịch vụ của Google Play , điều này tạo điều kiện cho việc thêm nhận thức về vị trí vào ứng dụng của bạn với tính năng theo dõi vị trí tự động, định vị địa lý và nhận dạng hoạt động.

Hướng dẫn này cho bạn thấy cách sử dụng Dịch vụ vị trí trong APP của bạn để nhận vị trí hiện tại, nhận các cập nhật vị trí định kỳ, tra cứu địa chỉ, v.v.

Đối tượng vị trí

Các Location đối tượng đại diện cho một vị trí địa lý mà có thể bao gồm một vĩ độ, kinh độ, tem thời gian, và các thông tin khác như mang, độ cao và vận tốc. Có những phương pháp quan trọng sau đây mà bạn có thể sử dụng với đối tượng Vị trí để nhận thông tin cụ thể về vị trí

Sr.No.Phương thức & Mô tả
1float distanceTo (Vị trí dest)

Trả về khoảng cách gần đúng tính bằng mét giữa vị trí này và vị trí đã cho.
2float getAccuracy ()

Nhận độ chính xác ước tính của vị trí này, tính bằng mét.
3double getAltitude ()

Lấy độ cao nếu có, tính bằng mét trên mực nước biển.
4float getBearing ()

Lấy vòng bi, theo độ.
5double getLatitude ()

Lấy vĩ độ, theo độ.
6double getLongitude ()

Lấy kinh độ, theo độ.
7float getSpeed ​​()

Nhận tốc độ nếu nó có sẵn, tính bằng mét / giây trên mặt đất.
số 8boolean hasAccuracy ()

Đúng nếu vị trí này có độ chính xác.
9boolean hasAltitude ()

Đúng nếu vị trí này có độ cao.
10boolean hasBearing ()

Đúng nếu vị trí này có vòng bi.
11boolean hasSpeed ​​()

Đúng nếu vị trí này có tốc độ.
12void reset ()

Xóa nội dung của vị trí.
13void setAccuracy (độ chính xác nổi)

Đặt độ chính xác ước tính của vị trí này, mét.
14void setAltitude (độ cao gấp đôi)

Đặt độ cao, tính bằng mét trên mực nước biển.
15void setBearing (mang phao)

Đặt ổ đỡ, theo độ.
16void setLatitude (vĩ độ kép)

Đặt vĩ độ, theo độ.
17void setLongitude (kinh độ kép)

Đặt kinh độ, theo độ.
18void setSpeed ​​(tốc độ nổi)

Đặt tốc độ, tính bằng mét / giây trên mặt đất.
19Chuỗi toString ()

Trả về một chuỗi chứa mô tả ngắn gọn, có thể đọc được của con người về đối tượng này.

Lấy vị trí hiện tại

Để có được vị trí hiện tại, hãy tạo một máy khách định vị là đối tượng LocationClient , kết nối nó với Dịch vụ định vị bằng phương thức connect ()và sau đó gọi phương thức getLastLocation () của nó . Phương thức này trả về vị trí gần đây nhất dưới dạng đối tượng Location có chứa vĩ độ và kinh độ và các thông tin khác như được giải thích ở trên. Để có chức năng dựa trên vị trí trong hoạt động của bạn, bạn sẽ phải triển khai hai giao diện -

GooglePlayServicesClient.ConnectionCallbacks

GooglePlayServicesClient.OnConnectionFailedListener

Các giao diện này cung cấp các phương thức gọi lại quan trọng sau đây mà bạn cần thực hiện trong lớp hoạt động của mình

Sr.No.Phương thức gọi lại & Mô tả
1trừu tượng void onConnected (Bundle connectionHint)

Phương thức gọi lại này được gọi khi dịch vụ vị trí được kết nối với máy khách định vị thành công. Bạn sẽ sử dụng phương thức connect () để kết nối với máy khách định vị.
2abstract void onDisconnected ()

Phương thức gọi lại này được gọi khi máy khách bị ngắt kết nối. Bạn sẽ sử dụng phương thức disconnect () để ngắt kết nối với máy khách định vị.
3abstract void onConnectionFailed (Kết quả ConnectionResult)

Phương thức gọi lại này được gọi khi có lỗi khi kết nối máy khách với dịch vụ.
Bạn nên tạo máy khách định vị trong phương thức onCreate () của lớp hoạt động của bạn, sau đó kết nối nó trong onStart () , để Dịch vụ vị trí duy trì vị trí hiện tại trong khi hoạt động của bạn hoàn toàn hiển thị. Bạn nên ngắt kết nối máy khách trong phương thức onStop () , để khi ứng dụng của bạn không hiển thị, Dịch vụ vị trí không duy trì vị trí hiện tại. Điều này giúp tiết kiệm pin lên đến một mức độ lớn.

Nhận vị trí được cập nhật

Nếu bạn sẵn sàng cập nhật vị trí, ngoài các giao diện được đề cập ở trên, bạn cũng sẽ cần phải triển khai giao diện LocationListener . Giao diện này cung cấp phương thức gọi lại sau mà bạn cần triển khai trong lớp hoạt động của mình

Sr.No.Phương thức gọi lại & Mô tả
1abstract void onLocationChanged (Vị trí địa điểm)

Phương thức gọi lại này được sử dụng để nhận thông báo từ LocationClient khi vị trí đã thay đổi.

Chất lượng dịch vụ vị trí

Các LocationRequest đối tượng được sử dụng để yêu cầu chất lượng dịch vụ (QoS) để cập nhật vị trí từ LocationClient . Có những phương thức setter hữu ích mà bạn có thể sử dụng để xử lý QoS. Có sẵn phương thức getter tương đương mà bạn có thể kiểm tra trong tài liệu chính thức của Android.

Sr.No.Phương thức & Mô tả
1setExpirationDuration (millis dài)

Đặt thời lượng của yêu cầu này, tính bằng mili giây.
2setExpirationTime (millis dài)

Đặt thời gian hết hạn yêu cầu, tính bằng mili giây kể từ khi khởi động.
3setFastestInterval (millis dài)

Đặt rõ ràng khoảng thời gian nhanh nhất để cập nhật vị trí, tính bằng mili giây.
4setInterval (millis dài)

Đặt khoảng thời gian mong muốn cho các cập nhật vị trí hoạt động, tính bằng mili giây.
5setNumUpdates (int numUpdates)

Đặt số lượng cập nhật vị trí.
6setPriority (ưu tiên int)

Đặt mức độ ưu tiên của yêu cầu.
Ví dụ: nếu ứng dụng của bạn muốn vị trí có độ chính xác cao, nó sẽ tạo yêu cầu vị trí với setPriority (int) được đặt thành PRIORITY_HIGH_ACCURACY và setInterval (dài) thành 5 giây. Bạn cũng có thể sử dụng khoảng thời gian lớn hơn và / hoặc các ưu tiên khác như PRIORITY_LOW_POWER để yêu cầu độ chính xác cấp "thành phố" hoặc PRIORITY_BALANCED_POWER_ACCURACY cho độ chính xác cấp "chặn".

Các hoạt động nên cân nhắc loại bỏ tất cả yêu cầu vị trí khi nhập nền (ví dụ tại onPause ()), hoặc ít nhất trao đổi yêu cầu đến một khoảng thời gian lớn hơn và chất lượng thấp hơn để tiết kiệm điện năng tiêu thụ.

Hiển thị địa chỉ vị trí

Khi bạn có đối tượng Vị trí , bạn có thể sử dụng phương thức Geocoder.getFromLocation () để lấy địa chỉ cho một vĩ độ và kinh độ nhất định. Phương thức này là đồng bộ và có thể mất nhiều thời gian để thực hiện công việc của nó, vì vậy bạn nên gọi phương thức từ phương thức doInBackground () của lớp AsyncTask .

Các AsyncTask phải được subclassed được sử dụng và các lớp con sẽ ghi đè doInBackground (Params ...) phương pháp để thực hiện một nhiệm vụ trong nền và onPostExecute (Result) phương pháp được gọi trên thread UI sau khi kết thúc nền tính toán và vào thời điểm đó đến hiển thị kết quả. Có một phương thức quan trọng hơn có sẵn trong AyncTask được thực hiện (Params ... params) , phương thức này thực hiện nhiệm vụ với các tham số đã chỉ định.

Thí dụ

Ví dụ sau cho bạn thấy cách thực tế để sử dụng Dịch vụ vị trí trong ứng dụng của bạn để có được vị trí hiện tại và địa chỉ tương đương của nó, v.v.

Để thử nghiệm với ví dụ này, bạn sẽ cần thiết bị di động thực tế được trang bị hệ điều hành Android mới nhất, nếu không bạn sẽ phải đấu tranh với trình mô phỏng có thể không hoạt động.

Tạo ứng dụng Android

Bậc thangSự miêu tả
1Bạn sẽ sử dụng Android studio IDE để tạo một ứng dụng Android và đặt tên nó là Tutorialspoint dưới một góicom.example.tutorialspoint7.myapplication .
2thêm tệp src / GPSTracker.java và thêm mã yêu cầu.
3Sửa đổi tệp src / MainActivity.java và thêm mã yêu cầu như được hiển thị bên dưới để quản lý vị trí hiện tại và địa chỉ tương đương của nó.
4Sửa đổi tệp XML bố trí res / layout / activity_main.xml để thêm tất cả các thành phần GUI bao gồm ba nút và hai khung nhìn văn bản để hiển thị vị trí / địa chỉ.
5Sửa đổi res / values ​​/ strings.xml để xác định các giá trị không đổi bắt buộc
6Sửa đổi AndroidManifest.xml như hình dưới đây
7Chạy ứng dụng để khởi chạy trình giả lập Android và xác minh kết quả của các thay đổi được thực hiện trong ứng dụng.
Sau đây là nội dung của tệp hoạt động chính đã sửa đổi MainActivity.java .
package com.example.tutorialspoint7.myapplication;

import android.Manifest;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.test.mock.MockPackageManager;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

   Button btnShowLocation;
   private static final int REQUEST_CODE_PERMISSION = 2;
   String mPermission = Manifest.permission.ACCESS_FINE_LOCATION;

   // GPSTracker class
   GPSTracker gps;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
  
      try {
         if (ActivityCompat.checkSelfPermission(this, mPermission)
            != MockPackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this, new String[]{mPermission}, 
               REQUEST_CODE_PERMISSION);

            // If any permission above not allowed by user, this condition will
               execute every time, else your else part will work
         }
      } catch (Exception e) {
         e.printStackTrace();
      }

      btnShowLocation = (Button) findViewById(R.id.button);

      // show location button click event
      btnShowLocation.setOnClickListener(new View.OnClickListener() {

         @Override
         public void onClick(View arg0) {
            // create class object
            gps = new GPSTracker(MainActivity.this);

            // check if GPS enabled
            if(gps.canGetLocation()){

               double latitude = gps.getLatitude();
               double longitude = gps.getLongitude();

               // \n is for new line
               Toast.makeText(getApplicationContext(), "Your Location is - \nLat: "
                  + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
            }else{
               // can't get location
               // GPS or Network is not enabled
               // Ask user to enable GPS/network in settings
               gps.showSettingsAlert();
            }

         }
      });
   }
}
Sau đây là nội dung của tệp hoạt động chính đã sửa đổi GPSTracker.java .
package com.example.tutorialspoint7.myapplication;

import android.app.AlertDialog;
import android.app.Service;
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.os.IBinder;
import android.provider.Settings;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {

   private final Context mContext;

   // flag for GPS status
   boolean isGPSEnabled = false;

   // flag for network status
   boolean isNetworkEnabled = false;

   // flag for GPS status
   boolean canGetLocation = false;

   Location location; // location
   double latitude; // latitude
   double longitude; // longitude

   // The minimum distance to change Updates in meters
   private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

   // The minimum time between updates in milliseconds
   private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

   // Declaring a Location Manager
   protected LocationManager locationManager;

   public GPSTracker(Context context) {
      this.mContext = context;
      getLocation();
   }

   public Location getLocation() {
      try {
         locationManager = (LocationManager) mContext.getSystemService(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
         } else {
            this.canGetLocation = true;
            // First get location from Network Provider
            if (isNetworkEnabled) {
               locationManager.requestLocationUpdates(
                  LocationManager.NETWORK_PROVIDER,
                  MIN_TIME_BW_UPDATES,
                  MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
      
               Log.d("Network", "Network");
               if (locationManager != null) {
                  location = locationManager
                     .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
       
                  if (location != null) {
                     latitude = location.getLatitude();
                     longitude = location.getLongitude();
                  }
               }
            }
    
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
               if (location == null) {
                  locationManager.requestLocationUpdates(
                     LocationManager.GPS_PROVIDER,
                     MIN_TIME_BW_UPDATES,
                     MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
       
                  Log.d("GPS Enabled", "GPS Enabled");
                  if (locationManager != null) {
                     location = locationManager
                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        
                     if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                     }
                  }
               }
            }
         }

      } catch (Exception e) {
         e.printStackTrace();
      }

      return location;
   }

   /**
      * Stop using GPS listener
      * Calling this function will stop using GPS in your app
   * */
 
   public void stopUsingGPS(){
      if(locationManager != null){
         locationManager.removeUpdates(GPSTracker.this);
      }
   }

   /**
      * Function to get latitude
   * */
 
   public double getLatitude(){
      if(location != null){
         latitude = location.getLatitude();
      }

      // return latitude
      return latitude;
   }

   /**
      * Function to get longitude
   * */
 
   public double getLongitude(){
      if(location != null){
         longitude = location.getLongitude();
      }

      // return longitude
      return longitude;
   }

   /**
      * Function to check GPS/wifi enabled
      * @return boolean
   * */
 
   public boolean canGetLocation() {
      return this.canGetLocation;
   }

   /**
      * Function to show settings alert dialog
      * On pressing Settings button will lauch Settings Options
   * */
 
   public void showSettingsAlert(){
      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 Settings button
      alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog,int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            mContext.startActivity(intent);
         }
      });

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

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

   @Override
   public void onLocationChanged(Location location) {
   }

   @Override
   public void onProviderDisabled(String provider) {
   }

   @Override
   public void onProviderEnabled(String provider) {
   }

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

   @Override
   public IBinder onBind(Intent arg0) {
      return null;
   }
}
Sau đây sẽ là nội dung của tệp res / layout / activity_main.xml
<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
   android:layout_width = "fill_parent"
   android:layout_height = "fill_parent"
   android:orientation = "vertical" >


   <Button
      android:id = "@+id/button"
      android:layout_width = "fill_parent"
      android:layout_height = "wrap_content"
      android:text = "getlocation"/>

</LinearLayout>
Sau đây sẽ là nội dung của res / values ​​/ strings.xml để xác định hai hằng số mới
<?xml version = "1.0" encoding = "utf-8"?>
<resources>
   <string name = "app_name">Tutorialspoint</string>
</resources>
Sau đây là nội dung mặc định của AndroidManifest.xml
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
   package = "com.example.tutorialspoint7.myapplication">
   <uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" />
   <uses-permission android:name = "android.permission.INTERNET" />
   <application
      android:allowBackup = "true"
      android:icon = "@mipmap/ic_launcher"
      android:label = "@string/app_name"
      android:supportsRtl = "true"
      android:theme = "@style/AppTheme">
  
      <activity android:name = ".MainActivity">
         <intent-filter>
            <action android:name = "android.intent.action.MAIN" />

            <category android:name = "android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>

</manifest>
Hãy thử chạy ứng dụng Tutorialspoint của bạn . Tôi cho rằng, bạn đã kết nối thiết bị Android Mobile thực tế với máy tính của mình.

Để chạy ứng dụng từ Android Studio, mở một trong các tệp hoạt động của dự án của bạn và nhấp vào Chạy biểu tượng từ thanh công cụ.

Trước khi bắt đầu ứng dụng của bạn, trình cài đặt Android studio sẽ hiển thị cửa sổ sau để chọn tùy chọn mà bạn muốn chạy ứng dụng Android của mình.

lập trình android

Bây giờ để xem vị trí, chọn nút Vị trí sẽ hiển thị thông tin vị trí như sau:

lập trình android

Không có nhận xét nào:

Đăng nhận xét

Lập trình Android - RenderScript

Trong chương này, chúng ta sẽ tìm hiểu về Android RenderScript. Thông thường các ứng dụng trên Android được thiết kế để tiêu thụ tài nguyên ...