安卓之位置服务(简单定位用户所在的位置)

  • Post author:
  • Post category:其他




*

位置的服务(Location Based Service)

基于位置的服务简称LBS,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动设备所在的位置。

基于位置的服务所围绕的核心就是要先确定出用户所在的位置。一种是通过GPS定位,一种是通过网络定位。GPS定位的工作原理是基于手机内置的GPS硬件直接和卫星交互来获取当前的经纬度信息,这种定位方式精确度非常高,但确定是只能在室外使用,室内基本无法接受到卫星的信号。网络定位的工作原理是根据手机当前网络附近的三个基站进行测速,以此计算出手机和每个基站之间的距离,在通过三角定位确定出一个大概的位置,这种定位方式精确度一般,但有点是在室内室外都可以使用。(引用郭霖老师书中的知识)

首先需要申请百度地图密钥:

https://blog.csdn.net/weixin_42813606/article/details/88556804

.这个连接里面有如何获取密钥。

还得需要申请百度地图SDK,在这里我就不介绍如何申请了,申请下来的就是如下所示:

在这里插入图片描述
话不多说,先上个案列更加明确。

首先需要创建一个安卓项目,这个我就更加不要接受如何创建了。

在这里插入图片描述
只需要把压缩包放进libs下面,其他的需要在创建一个包名字为jniLibs,

jniLibs文件夹是默认的,如果用其他名字需要在app目录下gradle配置文件中指定重定向的目录,没有必要了。

在xml中编写如下代码:

<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/position_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

主要是通过一个TextView来显示出。

在java中编写如下代码:

public class MainActivity extends AppCompatActivity {
    public LocationClient mLocationClient;//定位服务的客户端。宿主程序在客户端声明此类,并调用
    private TextView positionText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLocationClient=new LocationClient(getApplicationContext());//调用getApplicationContext()方法来调用一个全局的Context参数并传入
        mLocationClient.registerLocationListener(new MyLocationListener());//调用.registerLocationListener()方法来注册一个定位监听器,当你获得
        //位置信息的时候,就会回调这个定位监听器
        setContentView(R.layout.activity_main);
        positionText=(TextView)findViewById(R.id.position_text_view);
        List<String> permissionList=new ArrayList<>();
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (!permissionList.isEmpty()){
            String[] permissions=permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(MainActivity.this,permissions,1);
        }else {
            requestLocation();
        }


    }

    private void requestLocation() {
        initLocation();
        mLocationClient.start();//开始定位,定位的结果会回调到我们前面注册的监听器中MyLocationListener
        //LocationClient的start()方法只会定位一次
    }

    private void initLocation() {
        LocationClientOption option=new LocationClientOption();
        option.setScanSpan(4000);//设置更新的间隔 多长时间进行一次请求
        option.setIsNeedAddress(true);//是否获取当前详细的地址信息
        mLocationClient.setLocOption(option);// 使用设置
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case 1:
                if (grantResults.length>0){
                    for (int result:grantResults){
                        if (result!=PackageManager.PERMISSION_GRANTED){
                            Toast.makeText(this,"必须同意所有权限才能使用本程序",Toast.LENGTH_SHORT).show();
                            finish();
                            return;
                        }
                    }
                    requestLocation();
                }else {
                    Toast.makeText(this,"发生未知错误",Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
            default:
        }
    }
    public class MyLocationListener implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            StringBuilder currentPosition=new StringBuilder();
            //BDLocation的getLatitude()方法获取当前位置的纬度
            currentPosition.append("纬度:").append(bdLocation.getLatitude()).append("\n");
            //BDLocation的getLongitude()方法获取当前位置的经度
            currentPosition.append("经线:").append(bdLocation.getLongitude()).append("\n");
            currentPosition.append("国家:").append(bdLocation.getCountry()).append("\n");
            currentPosition.append("省:").append(bdLocation.getProvince()).append("\n");
            currentPosition.append("市:").append(bdLocation.getCity()).append("\n");
            currentPosition.append("区:").append(bdLocation.getDistrict()).append("\n");
            currentPosition.append("街道:").append(bdLocation.getStreet()).append("\n");

                       currentPosition.append("定位方式:");
            //BDLocation的getLocType()方法获取当前位置的定位方式
            if (bdLocation.getLocType()==BDLocation.TypeGpsLocation){
                currentPosition.append("GPS");
            }
            if (bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){
                currentPosition.append("网络");
            }
            positionText.setText(currentPosition);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mLocationClient.stop();
    }
}

主要的我在代码上已经注释了,在这里我就不在讲述了。

最后别忘了要设置权限和注册你所申请的百度密钥:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.lbstest3">
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.READ_LOGS"
        tools:ignore="ProtectedPermissions" />
    <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>
        <meta-data android:name="com.baidu.lbsapi.API_KEY"
            android:value="ADuRoL0gilmwrS6MnskQyWGSaaQxhwaH"/>
        <service android:name="com.baidu.location.f" android:enabled="true"
            android:process=":remote"
            />
    </application>

</manifest>

这是Manifest.xml中要写的。

这就是一个简单的定位你所在的位置。

效果图如下:

在这里插入图片描述



版权声明:本文为jzdcuccess原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。