Android初级开发(十)——百度定位—确定你的位置

来源:互联网 发布:微信 for mac 2.2 dmg 编辑:程序博客网 时间:2024/06/06 00:10

一、申请API Key
1、登录百度账号,打开http://developer.baidu.com/user/reg这个网址,填注册信息,按照提示完成注册。
这里写图片描述

2、打开http://lbsyun.baidu.com/apiconsole/key这个地址点击创建应用,应用类型选择Android SDK,启用服务保持默认。发布版SHAI指的是打包程序时所用签名文件的SHAI指纹,打开Android Studio的任意一个项目,点击右侧工具栏Gradle——项目名——:app——Tasks——android,这里展示了一个Android Studio项目中所有内置的Gradle Tasks,其中signingReport这个Task就可以用来查看签名文件信息。双击signingReport,其中SHAI就是我们所需的SHAI指纹。包名自己命名吧,点击提交,应用就创建成功了。访问应用(AK)出现的就是我们申请的API Key。

二、准备LBS SDK
1、下载LBS开放平台中提供的SDK 打开地址http://lbsyun.baidu.com/sdk/download ,本例中用到基础地图和定位功能这两个SDK
2、将下载的文件解压,将BaiduLBS_Android.jar复制到app模块下面的libs目录下,然后点击Android Studio顶部工具栏的Sync按钮,使我们复制的jar包引用进来。
这里写图片描述

这里写图片描述

点击Sync按钮之后,libs目录下的jar文件就会多出一个向右的箭头,这就表示项目已经能够引用到这些Jar包了

3、在src/main目录下,右键——New——Directory,创建一个名为jniLibs的目录,把压缩包中的so文件全部复制到这里。
这里写图片描述

三、编码
1、写个布局

<?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/position_text_view"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout>

就是一个TextView用于显示获取到的信息

2、AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.administrator.lbstest">    **<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.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"/>    <uses-permission android:name="android.permission.WAKE_LOCK"/>**    <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="rU852fcpod6KOXM1NKMEICwQIYPUqOpO"/>**        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        **<service android:name="com.baidu.location.f"            android:enabled="true"            android:process=":remote"/>**    </application></manifest>

首先添加权限,然后在标签内添加一个

public class MainActivity extends AppCompatActivity {    public LocationClient mLoacationClient;    private TextView positionText;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //创建一个LocationClient的实例,接受一个Context参数        mLoacationClient = new LocationClient(getApplicationContext());        //调用LocationClient的registerLocationListener()方法注册一个定位监听器        //当获取到位置信息时,就会回调这个定位监听器        mLoacationClient.registerLocationListener(new MyLocationListener());        setContentView(R.layout.activity_main);        positionText = (TextView) findViewById(R.id.position_text_view);        //创建一个空的List集合        //依次判断这3个权限有没有被授权,如果没有被授权就添加到List集合中        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);        }        //将List转换成数据        //调用ActivityCompat。requestPermissions()方法一次性申请        if(!permissionList.isEmpty()){            String[] permissions = permissionList.toArray(new String[permissionList.size()]);            ActivityCompat.requestPermissions(MainActivity.this,permissions,1);        }else{            requestLocation();        }    }    //开始地理位置定位    private void requestLocation() {        //更新地理位置        initLocation();        //调用LocationClient的start()方法开始定位        //定位的结果会回调到前面注册的监听器中        mLoacationClient.start();    }    private void initLocation() {        //创建一个LocationClientOption对象        LocationClientOption option = new LocationClientOption();        //设置更新的间隔,单位毫秒        option.setScanSpan(5000);        //表示我们需要获取当前位置的详细地址信息        option.setIsNeedAddress(true);        mLoacationClient.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 location) {            StringBuilder currentPosition = new StringBuilder();            currentPosition.append("纬度:").append(location.getLatitude()).append("\n");            currentPosition.append("经线:").append(location.getLongitude()).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);        }    }    @Override    protected void onDestroy() {        super.onDestroy();        //当活动被销毁的时候调用LocationClient的stop()方法来停止定位        mLoacationClient.stop();    }}

四、运行
这里写图片描述

因为我们设置了位置每5s的更新,所以当你移动位置的时候,数据也会随之改变

PS:在安装APK的时候出现如下错误
Installation failed with message INSTALL_PARSE_FAILED_MANIFEST_MALFORMED.

这是因为在清单文件中注册服务时,android:process = “:remote”中少了冒号

阅读全文
0 0