专栏首页算法微时光位置定位(LocationManager)

位置定位(LocationManager)

image.png

目录

LocationManager

LocationManager是Android 提供的Location 服务,来获得当前的位置信息和卫星信息。

要使用它,先得获得系统所提供的location_service.

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

定位服务的提供一般有3种:

  • GPS_PROVIDER GPS获得
  • NETWORK_PROVIDER 网络获得
  • PASSIVE_PROVIDER 被动提供其他应用程序提供

通过api获取现有支持的定位服务模式:

lm.getAllProviders();

代码实战

xml文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <ListView
        android:id="@+id/pro"
        android:layout_width="368dp"
        android:layout_height="495dp"
        tools:layout_editor_absoluteX="20dp"
        tools:layout_editor_absoluteY="20dp" />
</android.support.constraint.ConstraintLayout>

代码文件:

package com.example.user.location;

import android.content.Context;
import android.location.LocationManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    ListView providers;
    LocationManager lm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        providers = (ListView)findViewById(R.id.pro);
        lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

        List<String> provideNames = lm.getAllProviders();

        ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1,
                provideNames);

        providers.setAdapter(adapter);
    }
}

获取定位

使用requestLocationUpdates注册监听,定时获取定位hal service返回的数据

整体项目如下:

manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.user.gps">
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        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>

active_main.xml

package com.example.user.gps;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumented test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.example.user.gps", appContext.getPackageName());
    }
}

代码:

package com.example.user.gps;

import android.annotation.SuppressLint;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONObject;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    private TextView positionTextView;
    private TextView positionLatLng;
    private LocationManager locationManager;
    private String provider;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        positionTextView=(TextView)findViewById(R.id.position_text_view);
        positionLatLng=(TextView)findViewById(R.id.position_plain_text);
        locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
        //获取所有可用的位置提供器

        provider=LocationManager.GPS_PROVIDER;

        Location location=locationManager.getLastKnownLocation(provider);
        if(location!=null){
            //显示当前设备的位置信息
            Log.d("lidu---", "location!=null");
            showLocation(location);
        }

        Log.d("lidu---", "location==null");
        locationManager.requestLocationUpdates(provider, 1000, 1, locationListener);
    }


    //LocationListener 用于当位置信息变化时由 locationManager 调用
    LocationListener locationListener=new LocationListener(){

        @Override
        public void onLocationChanged(Location location) {
            // TODO Auto-generated method stub
            Log.d("test", "onLocationChanged");
            //更新当前设备的位置信息
            showLocation(location);
        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }

    };

    private void showLocation(final Location location){
        StringBuilder sb = new StringBuilder();
        sb.append(location.getLatitude());
        positionTextView.setText(sb.toString());

    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 文字切换(TextSwitcher)使用

    TextSwitcher 继承自ViewSwitcher, ViewSwitcher继承自ViewAnimator.

    李小白是一只喵
  • 显示时间(TextClock和AnalogClock)

    TextClocks是以数字时钟的形式显示. AnalogClock是模拟时钟.

    李小白是一只喵
  • 时间选择(DatePicker和TimePicker)使用

    Android中日期选择控件-DatePicker的使用 android 开发 时间选择器TimePicker的使用

    李小白是一只喵
  • 文字切换(TextSwitcher)使用

    TextSwitcher 继承自ViewSwitcher, ViewSwitcher继承自ViewAnimator.

    李小白是一只喵
  • android通过servlet服务器保存文件到手机

    本文实例为大家分享了android通过servlet服务器保存文件到手机的具体代码,供大家参考,具体内容如下

    砸漏
  • Android Gradle实用技巧(五) | 善用AndroidManifest占位符

    占位符,其实是一个可以被替换的临时标记,比如${name},我们就可以使用真实的name变量的值替换这个占位符,达到可以动态的修改这个占位符的目的。所以Andr...

    飞雪无情
  • BottomNavigationView简单使用

    之前见过类似这个库, 是带ripple效果的 不记得具体地址了,和这个类似 https://github.com/Ashok-Varma/BottomNav...

    dodo_lihao
  • Android--vector动画

    aruba
  • 使用ViewPager+Fragment实现选项卡切换效果

    实现效果 本实例主要实现用ViewPage和Fragment实现选项卡切换效果,选项卡个数为3个,点击选项卡或滑动屏幕会切换Fragment并实现选项卡下方下边...

    古时的风筝
  • 蓝牙门禁Android客户端

     先来了解下Android传统蓝牙连接的大致简单的流程: ? 其中涉及到几个类依次来介绍,废话不多说,下面是从Android4.4开发指南蓝牙所用到的类的截图:...

    用户1148881

扫码关注云+社区

领取腾讯云代金券