Pengalaman pertama menggunakan GPS Android


Pengenalan kepada bahagian ini:

Bercakap tentang istilah GPS, saya percaya semua orang sudah biasa dengan teknologi penentududukan global GPS, baiklah, cara penentududukan dalam Android Secara amnya terdapat empat jenis: Penentududukan GPS, penentududukan WIFI, penentududukan stesen pangkalan, penentududukan AGPS (stesen pangkalan + GPS); GPS memperoleh longitud dan latitud semasa peranti dengan berinteraksi dengan satelit, yang tepat Ia agak tinggi, tetapi ia juga mempunyai beberapa kelemahan. Kelemahan terbesar ialah:

Hampir mustahil untuk digunakan di dalam rumah

... Ia perlu menerima 4 satelit atau lebih. Isyarat boleh memastikan kedudukan GPS yang tepat! Tetapi jika anda berada di luar rumah dan tiada rangkaian, GPS masih boleh digunakan! Dalam bahagian ini kita akan membincangkan penggunaan asas GPS dalam Android~

1 Beberapa API berkaitan kedudukan


1 ) LocationManager

Dokumen API rasmi:

LocationManager

Perkara ini datang daripada perkhidmatan sistem dan tidak boleh baharu secara langsung Ia memerlukan:

rreee

Di samping itu Jangan lupa untuk menambah kebenaran apabila menggunakan kedudukan GPS:

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

Baiklah, selepas mendapatkan objek LocationManager, kita boleh memanggil kaedah biasa berikut:

  • addGpsStatusListener(GpsStatus.Listener listener): Tambahkan pendengar status GPS
  • addProximityAlert(double latitud, double longitud, floating radius, longitud ration , niat PendingIntent): Tambahkan amaran kritikal
  • getAllProviders(): Dapatkan semua senarai LocationProvider
  • getBestProvider(Kriteria kriteria, boolean didayakanSahaja): Kembali mengikut yang ditentukan syarat Pembekal Lokasi Optimum
  • getGpsStatus(status GpsStatus): Dapatkan status GPS
  • getLastKnownLocation(Pembekal rentetan): Dapatkan lokasi terakhir yang diketahui berdasarkan LocationProvider Location
  • getProvider(String name): Dapatkan LocationProvider berdasarkan nama
  • getProviders(boolean enabledOnly): Dapatkan semua LocationProvider yang tersedia
  • getProviders(Kriteria kriteria, boolean enabledOnly): Dapatkan semua LocationProviders yang memenuhi syarat mengikut syarat yang ditetapkan
  • isProviderEnabled(String provider): Tentukan LocationProvider dengan nama yang ditentukan Available
  • removeGpsStatusListener(GpsStatus.Listener listener): Alih keluar pendengar status GPS
  • removeProximityAlert(Intent PendingIntent): amaran kedekatan
  • requestLocationUpdates(long minTime, float minDistance, kriteria Kriteria, PendingIntent intent): Dapatkan maklumat lokasi secara berkala melalui LocationProvider yang ditentukan, dan mulakan komponen yang sepadan melalui Intent
  • requestLocationUpdates(Pembekal rentetan, masa min panjang, jarak min apung, pendengar LocationListener): Dapatkan maklumat penentududukan secara berkala melalui LocationProvider yang ditentukan dan cetuskan pencetus yang sepadan dengan pendengar

2) LocationProvider (penyedia lokasi)

Dokumen API rasmi : Pembekal Lokasi

Ini ialah perwakilan abstrak komponen penentududukan GPS Panggil kaedah berikut untuk mendapatkan maklumat yang berkaitan tentang komponen penentududukan.

Kaedah yang biasa digunakan adalah seperti berikut:

  • getAccuracy(): Mengembalikan ketepatan LocationProvider
  • getName(): Mengembalikan nama LocationProvider
  • getPowerRequirement🎜>getPowerRequirement >(): Dapatkan keperluan kuasa LocationProvider
  • hasMonetaryCost(): Kembalikan sama ada LocationProvider dibayar atau percuma
  • memenuhiKriteria(Kriteria kriteria): Tentukan sama ada LocationProvider memenuhi syarat Kriteria
  • requiresCell(): Tentukan sama ada LocationProvider perlu mengakses stesen pangkalan rangkaian
  • requiresNetwork(): Tentukan sama ada LocationProvider perlu mengakses stesen pangkalan rangkaian Akses data rangkaian
  • memerlukanSatelit(): Tentukan sama ada LocationProvider perlu mengakses sistem penentududukan berasaskan satelit
  • menyokongAltitude(): Tentukan sama ada LocationProvider menyokong Maklumat ketinggian
  • supportsBearing(): Tentukan sama ada LocationProvider menyokong maklumat arah
  • supportsSpeed(): Tentukan sama ada LocationProvider menyokong maklumat kelajuan

3) Lokasi (maklumat lokasi)

Dokumen API rasmi :

Lokasi

Maklumat lokasi kelas abstrak, Kami boleh menghubungi kaedah berikut untuk mendapatkan maklumat kedudukan yang berkaitan!

Kaedah yang biasa digunakan adalah seperti berikut:

    float
  • getAccuracy(): Dapatkan ketepatan maklumat kedudukan
  • double
  • getAltitude ( ): Dapatkan ketinggian maklumat kedudukan
  • float
  • getBearing(): Dapatkan arah maklumat kedudukan
  • double
  • getLatitud( ): Dapatkan maklumat kedudukan Latitud
  • double
  • getLongitude(): Dapatkan ketepatan maklumat kedudukan
  • String
  • getProvider(): Dapatkan LocationProvider yang menyediakan maklumat kedudukan
  • float
  • getSpeed(): Kelajuan mendapatkan maklumat kedudukan
  • boolean
  • mempunyai Ketepatan(): Tentukan sama ada kedudukan maklumat mengandungi maklumat ketepatan

4) Kriteria (syarat penapis)

Dokumentasi API rasmi:

Kriteria

Apabila mendapatkan LocationProvider, anda boleh menetapkan syarat penapis , melalui kelas ini untuk menetapkan syarat yang berkaitan~

Kaedah biasa adalah seperti berikut:

  • setAccuracy(int accuracy): Tetapkan keperluan ketepatan
  • setAltitudeRequired(boolean altitudeRequired): Tetapkan sama ada LocationProvider diperlukan untuk memberikan maklumat ketinggian
  • setBearingRequired(boolean bearingRequired): Tetapkan sama ada LocationProvider diperlukan untuk memberikan maklumat arah
  • setCostAllowed(boolean costAllowed): Tetapkan sama ada LocationProvider diperlukan untuk dapat memberikan maklumat arah Menyediakan maklumat arah
  • setPowerRequirement(int level): Tetapkan penggunaan kuasa yang diperlukan LocationProvider
  • setSpeedRequired (boolean speedRequired): Tetapkan sama ada memerlukan LocationProvider Boleh memberikan maklumat kelajuan

2. Dapatkan contoh LocationProvider

Menjalankan pemaparan :

1.gif

Seperti yang anda lihat dari gambar, terdapat tiga Penyedia Lokasi yang tersedia pada masa ini, iaitu:

  • pasif: disediakan secara pasif oleh program lain
  • gps: Dapatkan maklumat penentududukan melalui GPS
  • rangkaian: Dapatkan maklumat penentududukan melalui rangkaian

Kod pelaksanaan:

Fail reka letak: activity_main.xml:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

MainActivity.java:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_one"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获得系统所有的LocationProvider" />

    <Button
        android:id="@+id/btn_two"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="根据条件获取LocationProvider" />

    <Button
        android:id="@+id/btn_three"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获取指定的LocationProvider" />

    <TextView
        android:id="@+id/tv_result"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:background="#81BB4D"
        android:padding="5dp"
        android:textColor="#FFFFFF"
        android:textSize="20sp"
        android:textStyle="bold" /></LinearLayout>

Tentukan sama ada GPS dihidupkan dan dua syarat untuk menghidupkan GPS Dengan cara ini

Perkara pertama sebelum kita menggunakan kedudukan GPS hendaklah menentukan sama ada GPS dihidupkan atau tersedia Jika ia tidak dihidupkan, kita perlu Hidupkan GPS untuk melengkapkan kedudukan! AGPS tidak dipertimbangkan di sini~


1) Tentukan sama ada GPS tersedia

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_one;
    private Button btn_two;
    private Button btn_three;
    private TextView tv_result;
    private LocationManager lm;
    private List pNames = new ArrayList(); // 存放LocationProvider名称的集合

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        bindViews();
    }

    private void bindViews() {
        btn_one = (Button) findViewById(R.id.btn_one);
        btn_two = (Button) findViewById(R.id.btn_two);
        btn_three = (Button) findViewById(R.id.btn_three);
        tv_result = (TextView) findViewById(R.id.tv_result);

        btn_one.setOnClickListener(this);
        btn_two.setOnClickListener(this);
        btn_three.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_one:
                pNames.clear();
                pNames = lm.getAllProviders();
                tv_result.setText(getProvider());
                break;
            case R.id.btn_two:
                pNames.clear();
                Criteria criteria = new Criteria();
                criteria.setCostAllowed(false);   //免费
                criteria.setAltitudeRequired(true);  //能够提供高度信息
                criteria.setBearingRequired(true);   //能够提供方向信息
                pNames = lm.getProviders(criteria, true);
                tv_result.setText(getProvider());
                break;
            case R.id.btn_three:
                pNames.clear();
                pNames.add(lm.getProvider(LocationManager.GPS_PROVIDER).getName()); //指定名称
                tv_result.setText(getProvider());
                break;
        }
    }

    //遍历数组返回字符串的方法
    private String getProvider(){
        StringBuilder sb = new StringBuilder();
        for (String s : pNames) {
            sb.append(s + "\n");
        }
        return sb.toString();
    }
}

2) Kesan bahawa GPS tidak dihidupkan , hidupkan GPS

Kaedah 1: Hidupkan GPS secara paksa, tidak berguna selepas Android 5.0....

private boolean isGpsAble(LocationManager lm){
    return lm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)?true:false;
}

Kaedah 2: Hidupkan lokasi GPS Halaman tetapan maklumat membolehkan pengguna membuka

//强制帮用户打开GPS 5.0以前可用
private void openGPS(Context context){
    Intent gpsIntent = new Intent();
    gpsIntent.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
    gpsIntent.addCategory("android.intent.category.ALTERNATIVE");
    gpsIntent.setData(Uri.parse("custom:3"));
    try {
        PendingIntent.getBroadcast(LocationActivity.this, 0, gpsIntent, 0).send();
    } catch (PendingIntent.CanceledException e) {
        e.printStackTrace();
    }
}

4 Dapatkan maklumat lokasi secara dinamik

Ini sangat mudah, cuma hubungi kaedah requestLocationUpdates untuk menyediakan LocationListener untuk mengesan. lokasi dengan kerap!

Kod sampel adalah seperti berikut:

Layout:activity_location.xml:

//打开位置信息设置页面让用户自己设置
private void openGPS2(){
    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivityForResult(intent,0);
}

LocationActivity.java:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="5dp"
        android:textSize="20sp"
        android:textStyle="bold" /></LinearLayout>

Okay , sangat Mudah, kerana GPS perlu digunakan di luar rumah, jadi saya mengambil peluang ini untuk berlari keluar ke kedai serbaneka dan membeli secawan teh susu. Ambil tangkapan skrin di bawah~

2.png3..png

4.png

requestLocationUpdates (Pembekal rentetan, masa min panjang, jarak min terapung, LocationListener pendengar)

Apabila masa melebihi minTime (unit: milisaat), atau kedudukan bergerak melebihi minDistance (unit: meter), kaedah dalam pendengar akan dipanggil untuk mengemas kini maklumat GPS Adalah disyorkan bahawa minTime tidak kurang daripada 60000, iaitu 1 minit, yang akan lebih cekap Dan menjimatkan kuasa, tambah sebanyak yang anda perlukan Untuk mengemas kini GPS dalam masa nyata, anda boleh menetapkan minTime dan minDistance kepada 0

By the way, jangan lupa, anda juga memerlukan kebenaran:

/**
 * Created by Jay on 2015/11/20 0020.
 */
public class LocationActivity extends AppCompatActivity {

    private LocationManager lm;
    private TextView tv_show;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location);
        tv_show = (TextView) findViewById(R.id.tv_show);
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        if (!isGpsAble(lm)) {
            Toast.makeText(LocationActivity.this, "请打开GPS~", Toast.LENGTH_SHORT).show();
            openGPS2();
        }
        //从GPS获取最近的定位信息
        Location lc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        updateShow(lc);
        //设置间隔两秒获得一次GPS定位信息
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 8, new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                // 当GPS定位信息发生改变时,更新定位
                updateShow(location);
            }

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

            }

            @Override
            public void onProviderEnabled(String provider) {
                // 当GPS LocationProvider可用时,更新定位
                updateShow(lm.getLastKnownLocation(provider));
            }

            @Override
            public void onProviderDisabled(String provider) {
                updateShow(null);
            }
        });
    }


    //定义一个更新显示的方法
    private void updateShow(Location location) {
        if (location != null) {
            StringBuilder sb = new StringBuilder();
            sb.append("当前的位置信息:\n");
            sb.append("精度:" + location.getLongitude() + "\n");
            sb.append("纬度:" + location.getLatitude() + "\n");
            sb.append("高度:" + location.getAltitude() + "\n");
            sb.append("速度:" + location.getSpeed() + "\n");
            sb.append("方向:" + location.getBearing() + "\n");
            sb.append("定位精度:" + location.getAccuracy() + "\n");
            tv_show.setText(sb.toString());
        } else tv_show.setText("");
    }


    private boolean isGpsAble(LocationManager lm) {
        return lm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER) ? true : false;
    }


    //打开设置页面让用户自己设置
    private void openGPS2() {
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivityForResult(intent, 0);
    }

}

5 amaran (geofence) )

Nah, ini bermakna menetapkan titik Apabila jarak antara telefon dan titik kurang daripada julat yang ditentukan, pemprosesan yang sepadan boleh dicetuskan! Seperti geofencing... kita boleh memanggil kaedah addProximityAlert LocationManager untuk menambah amaran kedekatan! Kaedah lengkap adalah seperti berikut:

addProximityAlert(double latitud,double longitud,float radius, long expired,PendingIntent intent)

Attribut description:

  • latitud: Tentukan longitud titik tetap
  • longitud: Tentukan latitud titik tetap
  • jejari : Tentukan panjang jejari
  • tamat tempoh: tentukan bilangan milisaat selepas itu amaran kehampiran akan tamat tempoh -1 bermakna ia tidak akan tamat tempoh
  • niat: parameter ini menentukan Komponen yang sepadan dengan niat dicetuskan apabila menghampiri titik tetap

Kod sampel adalah seperti berikut:

ProximityActivity.java:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Anda juga perlu mendaftarkan penerima siaran: ProximityReceiver.java:

/**
 * Created by Jay on 2015/11/21 0021.
 */
public class ProximityActivity extends AppCompatActivity {
    private LocationManager lm;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_proximity);
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //定义固定点的经纬度
        double longitude = 113.56843;
        double latitude = 22.374937;
        float radius = 10;     //定义半径,米
        Intent intent = new Intent(this, ProximityReceiver.class);
        PendingIntent pi = PendingIntent.getBroadcast(this, -1, intent, 0);
        lm.addProximityAlert(latitude, longitude, radius, -1, pi);
    }
}

Jangan lupa untuk mendaftar:

/**
 * Created by Jay on 2015/11/21 0021.
 */
public class ProximityReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        boolean isEnter = intent.getBooleanExtra( LocationManager.KEY_PROXIMITY_ENTERING, false);
        if(isEnter) Toast.makeText(context, "你已到达南软B1栋附近", Toast.LENGTH_LONG).show();
        else Toast.makeText(context, "你已离开南软B1栋附近", Toast.LENGTH_LONG).show();
    }
}

Jalankan rendering :

PS: Okay, saya tetapkan 10m, tetapi apabila saya berjalan dari B1 ke D1, ia lebih daripada 10m... Ia berlaku untuk hujan

6.png 6.png


6 Muat turun kod contoh bahagian ini

GPSDemo.zip

.

Ringkasan bahagian ini:

Baiklah, bahagian ini memperkenalkan anda kepada beberapa penggunaan asas kedudukan GPS dalam Android. Sila rujuk bahagian kandungan. "Nota Kuliah Gila Android" Cikgu Li Gang baru sahaja membuat beberapa pengubahsuaian pada contoh dan menjalankan ujian kebolehgunaan! Itu sahaja untuk bahagian ini, terima kasih~6.jpg