IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 使用百度API获取位置信息 -> 正文阅读

[移动开发]使用百度API获取位置信息

? ? ? ??建议使用Android Studio3.0版本,最初我使用书中的2.0版本,导入BaiduLBS_Android.jar库之后报出各种错误,改一个就会出现另一个错误。于是下了一个AS3.5.0版本,并按照百度开发者文档中所要求的步骤成功移植库。

一、注册和获取密匙&&AS的配置

参考百度Android定位的SDK网址,配置的结果如下:

工程文件结构为:

AndroidManifest.xml文件为:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.lbstest">

    <!-- 这个权限用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!-- 这个权限用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!-- 访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

    <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">
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="XkgsMYYtBgIblZ0NLD3DUnF35cf3oFFV" >
        </meta-data>
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote">
        </service>
        <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>

build.gradle文件为:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 31
    buildToolsVersion "31.0.0"
    defaultConfig {
        applicationId "com.example.lbstest"
        minSdkVersion 15
        targetSdkVersion 31
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets{
        main{
            jniLibs.srcDir 'libs'
            jni.srcDirs = []    //disable automatic ndk-build
        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation ('androidx.test.espresso:espresso-core:3.1.1',{
        exclude group: 'com.android.support',  module: 'support-annotations'
    })
}

二、定位的实现部分

? ? ? ? 参考官方文档:Android定位SDK -?获取经纬度 | 百度地图API SDK

1.前端的界面就一个TextView,activity_main.xml代码如下:

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

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

</LinearLayout>

2.代码逻辑实现以及结果显示在MainActivity.java文件中,代码如下:

public class MainActivity extends AppCompatActivity {

    public LocationClient mLocationClient = null;
    private TextView positionText;
    private MyLocationListener myListener = new MyLocationListener();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLocationClient = new LocationClient(getApplicationContext());

        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationMode.Hight_Accuracy);
        option.setCoorType("bd09ll");
        option.setScanSpan(1000);
        option.setOpenGps(false);
        option.setLocationNotify(false);
        option.setIgnoreKillProcess(false);
        option.SetIgnoreCacheException(false);
        option.setWifiCacheTimeOut(1000);
        option.setEnableSimulateGps(false);
        option.setIsNeedAddress(true);
        option.setNeedNewVersionRgc(true);

        mLocationClient.setLocOption(option);
        mLocationClient.registerLocationListener(myListener);

        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.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
        }
        if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_WIFI_STATE)!= PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.ACCESS_WIFI_STATE);
        }
        if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_NETWORK_STATE)!= PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.ACCESS_NETWORK_STATE);
        }
        if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CHANGE_WIFI_STATE)!= PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.CHANGE_WIFI_STATE);
        }
        if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.INTERNET)!= PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.INTERNET);
        }
        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(){
        mLocationClient.start();
    }

    @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();
                }
        }
    }

    public class MyLocationListener extends BDAbstractLocationListener{
        @Override
        public void onReceiveLocation(BDLocation location){
            //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
            //以下只列举部分获取经纬度相关(常用)的结果信息
            //更多结果信息获取说明,请参照类参考中BDLocation类中的说明
            //final double latitude = location.getLatitude();    //获取纬度信息
            //final double longitude = location.getLongitude();    //获取经度信息
            //final float radius = location.getRadius();    //获取定位精度,默认值为0.0f

            //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
            //final String coorType = location.getCoorType();

            //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
            //final int errorCode = location.getLocType();
            //final String addr = location.getAddrStr();    //获取详细地址信息
            //final String country = location.getCountry();    //获取国家
            //final String province = location.getProvince();    //获取省份
            //final String city = location.getCity();    //获取城市
            //final String district = location.getDistrict();    //获取区县
            //final String street = location.getStreet();    //获取街道信息
            //final String adcode = location.getAdCode();    //获取adcode
            //final String town = location.getTown();    //获取乡镇信息
            //回到主线程中更新UI
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    StringBuilder currentPosition = new StringBuilder();
                    currentPosition.append("纬度:").append(location.getLatitude()).append("\n");
                    currentPosition.append("经度:").append(location.getLongitude()).append("\n");
                    currentPosition.append("定位精度:").append(location.getRadius()).append("\n");
                    currentPosition.append("经纬度坐标类型:").append(location.getCoorType()).append("\n");
                    currentPosition.append("定位类型、定位错误返回码:").append(location.getLocType()).append(":");
                    if(location.getLocType() == 161){
                        currentPosition.append("网络定位成功").append("\n");
                    }else if(location.getLocType() == 505){
                        currentPosition.append("server校验KEY失败,请确认KEY合法").append("\n");
                    }
                    currentPosition.append("地址:").append(location.getAddrStr()).append("\n");
                    currentPosition.append("定位方式:");
                    if(location.getLocType() == BDLocation.TypeGpsLocation){
                        currentPosition.append("GPS").append("\n");
                    }else if(location.getLocType() == BDLocation.TypeNetWorkLocation){
                        if(location.getNetworkLocationType().equals("wf")){
                            currentPosition.append("wifi").append("\n");
                        }else if(location.getNetworkLocationType().equals("cl") ){
                            currentPosition.append("cell").append("\n");
                        }else if(location.getNetworkLocationType().equals("ll")){
                            currentPosition.append("GPS").append("\n");
                        }else if(location.getNetworkLocationType() .equals("null")){
                            currentPosition.append("未获取到定位结果采用的类型").append("\n");
                        }
                    }
                    currentPosition.append("位置描述信息:").append(location.getLocationDescribe()).append("\n");

                    /*
                    Poi poi = location.getPoiList().get(2);
                    currentPosition.append("POI:").append(poi.getName()).append(poi.getTags()).append(poi.getAddr()).append("\n");
                    PoiRegion poiRegion= location.getPoiRegion();
                    currentPosition.append( poiRegion.getDerectionDesc()).append(poiRegion.getName()).append(poiRegion.getTags()).append("\n");
                    */
                    positionText.setText(currentPosition.toString());
                }
            });

        }
    }
}

三、效果展示

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 15:59:21  更:2021-11-15 15:59:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:26:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码