Android开发(9):基于位置的服务

Android开发(9):基于位置的服务,第1张

Android开发(9):基于位置的服务

个人笔记整理

基于位置的服务 百度地图API 申请API

前往百度开放服务平台 (baidu.com)注册开发者

来到控制台 | 百度地图开放平台 (baidu.com)创建应用

应用名称随意,应用类型选择【Android SDK】

获取开发版(debug) SHA1

前往系统的.android目录,默认位于~/.android

输入命令

E:codeAndroid.android>keytool -list -v -keystore debug.keystore
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: androiddebugkey
创建日期: 2021-2-27
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: C=US, O=Android, CN=Android Debug
发布者: C=US, O=Android, CN=Android Debug
序列号: 1
有效期为 Sat Feb 27 18:40:11 CST 2021 至 Mon Feb 20 18:40:11 CST 2051
证书指纹:
         MD5:  84:9D:C6:94:D8:2F:C2:90:00:00:00:00:00:00:00:00
         SHA1: D2:4C:7C:89:85:83:9A:68:1C:6F:FF:0F:00:00:00:00:00:00:00:00
         SHA256: EF:5A:67:E6:15:68:64:05:AD:95:90:7F:0F:5C:34:2B:79:54:15:C0:85:94:1E:9B:00:00:00:00:00:00:00:00
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 1


*******************************************
*******************************************



Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

获取发布板(release) SHA1

Android百度地图开发-第一篇:申请、搭建百度地图 - zhangmiao14 - 博客园 (cnblogs.com)创建相应的签名文件,并获取相应的SHA1

(测试,可以相同)

包名正常设置 点击提交 可复制key,或者[设置]修改上述配置 使用百度定位

官方开发文档:Android地图SDK | 百度地图API SDK (baidu.com)

下载&配置SDK 下载SDK

SDK下载 - 百度LBS开放平台 (baidu.com)

(根据需要)选择基础定位和基础地图,选择jar格式、标准开发包选择下载

配置SDK

解压下载的jar包,然后进入libs目录

选择其中的BaiduLBS_Android.jar文件放入项目中app/libs目录

// gradle中需配置

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    ...
}

之后新建src/main/jniLibs目录,将 剩余所有 复制到此处

项目配置 AndroidManifest配置

    
    
    
    
    
    
    
    
    
    
    
    

    
    
    
        
          
        
        
            
                
                
            
        
        
    

代码

动态申请权限代码示例

public class MainActivity extends AppCompatActivity {
    public LocationClient mLocationClient;

    private TextView positionText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLocationClient = new LocationClient(getApplicationContext());
        // 注册一个定位监听器,当获得位置时,就会回调该监听器
        mLocationClient.registerLocationListener(new MyLocationListener());
        setContentView(R.layout.activity_main);
        positionText = (TextView) findViewById(R.id.position_text_view);

        //动态申请权限
        // 申请权限较多,建立权限数组
        List 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[]数组
            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, String[] permissions,
        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 location) {
            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("定位方式:");
                    if (location.getLocType() == BDLocation.TypeGpsLocation) {
                        currentPosition.append("GPS");
                    } else if (location.getLocType() ==
                        BDLocation.TypeNetWorkLocation) {
                        currentPosition.append("网络");
                    }
                    positionText.setText(currentPosition);
                }
            });
        }
        @Override
        public void onConnectHotSpotMessage(String s, int i) {
        }
    }
}
实时更新位置
public class MainActivity extends AppCompatActivity {
    ...
    private void requestLocation() {
        initLocation();
        mLocationClient.start();
    }
    private void initLocation(){
        LocationClientOption option = new LocationClientOption();
        option.setScanSpan(5000);
        mLocationClient.setLocOption(option);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();

        mLocationClient.stop();
    }
    ...
}
选择定位模式

上述方式为网络定位

切换到GPS定位。手机设置:位置信息模式→高精确度

定位模式进行指定,一共有3种模式可选:Hight_Accuracy、Battery_Saving和Device_Sensors。

Hight_Accuracy表示高精确度模式,会在GPS信号正常的情况下优先使用GPS定位,在无法接收GPS信号的时候使用网络定位。

Battery_Saving表示节电模式,只会使用网络进行定位。

Device_Sensors表示传感器模式,只会使用GPS进行定位。

其中,Hight_Accuracy是默认的模式。

private void initLocation(){
        LocationClientOption option = new LocationClientOption();
        option.setScanSpan(5000);
        // 设置定位模式
        option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);
        mLocationClient.setLocOption(option);
}
显示位置相关信息
// 设置LocationClientOption的 需要获取当前位置详细的地址信息
option.setIsNeedAddress(true);

StringBuilder currentPosition = new StringBuilder();
currentPosition.append("纬度:").append(location.getLatitude()).
append("n");
currentPosition.append("经线:").append(location.getLongitude()).
append("n");
currentPosition.append("国家:").append(location.getCountry()).
append("n");
currentPosition.append("省:").append(location.getProvince()).
append("n");
currentPosition.append("市:").append(location.getCity()).
append("n");
currentPosition.append("区:").append(location.getDistrict()).
append("n");
currentPosition.append("街道:").append(location.getStreet()).
append("n");
currentPosition.append("定位方式:");
if (location.getLocType() == BDLocation.TypeGpsLocation) {
currentPosition.append("GPS");
} else if (location.getLocType() ==
BDLocation.TypeNetWorkLocation) {
currentPosition.append("网络");
}
positionText.setText(currentPosition);
使用百度地图

添加地图控件


添加Application继承类

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //初始化百度地图
        SDKInitializer.initialize(this);
    }
}

    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();

        mLocationClient.stop();
        mapView.onDestroy();
    }
    ...
}
定位到当前位置

先获得地图总控制器

BaiduMap baiduMap = mapView.getMap();

    设置缩放级别

    // 设置缩放级别(3~21),值越大地图越精细
    MapStatusUpdate update = MapStatusUpdateFactory.zoomTo(12.5f);
    // 最后需要调用该方法 使update的设置生效
    baiduMap.animateMapStatus(update);
    

    设置经纬度

    LatLng ll = new LatLng(39.915, 116.404);
    MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
    baiduMap.animateMapStatus(update);
    
显示所在位置光标
public class MainActivity extends AppCompatActivity {
    ...
    private BaiduMap baiduMap;
    private boolean isFirstLocate = true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 初始化要在 setContentView 前
        mLocationClient = new LocationClient(getApplicationContext());
        mLocationClient.registerLocationListener(new MyLocationListener());
        
        setContentView(R.layout.activity_main);

        mapView = (MapView) findViewById(R.id.bmapView);
        // 获得Map控制器
        baiduMap = mapView.getMap();

        // 启用我的位置显示
        baiduMap.setMyLocationEnabled(true);
        ...
    }
    private void navigateTo(BDLocation location) {
        
        // 判断是不是第一次定位
        // 定位到当前位置,同时设置精度
        if (isFirstLocate) {
            LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
            MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
            baiduMap.animateMapStatus(update);
            update = MapStatusUpdateFactory.zoomTo(16f);
            baiduMap.animateMapStatus(update);
            isFirstLocate = false;
        }
        
        // 封装设备当前所在位置
        MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
        locationBuilder.latitude(location.getLatitude());
        locationBuilder.longitude(location.getLongitude());
        MyLocationData locationData = locationBuilder.build();
        // 设置上“我的位置”
        baiduMap.setMyLocationData(locationData);
    }
    public class MyLocationListener implements BDLocationListener {
        @Override

        public void onReceiveLocation(BDLocation location) {

            if (location.getLocType() == BDLocation.TypeGpsLocation
                || location.getLocType() == BDLocation.TypeNetWorkLocation) {
                // 初始化地图
                navigateTo(location);
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mLocationClient.stop();
        mapView.onDestroy();
        // 关闭我的位置显示,节约资源
        baiduMap.setMyLocationEnabled(false);
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5712911.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存