as作业

作者: sml1 | 来源:发表于2020-05-26 14:35 被阅读0次

(一)Android的三种定位方式与定位模式模块

(1)界面布局activity_main.xml代码:包含一个id为tv的TextView控件,用于显示定位结果(经纬度)

(2)配置权限:

<!-- 2个定位权限是危险权限并处于一个权限组,需要动态申请 -->

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><!--精确定位-->

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><!--粗糙定位-->

<!-- 网络权限和WiFi权限是普通权限,不需要动态申请 -->

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><!--网络状态-->

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><!--WiFi状态-->

(3)界面程序MainActivity.java架构及代码如下:

/*

    Android提供了三种定位方式(GPS定位、WiFI定位和基站定位)获得定位信息—经纬度【基站定位也称移动网络定位,也称为GPRS定位】

    打开位置服务时,必须从三种定位模式(高精度—混合定位、节电—网络定位和单独的GPS定位)中选择一种,通常选择混合定位

    GPS定位精度高,但可能由于GPS信号弱而较慢甚至获取不到

    GPS定位对应于权限android.permission.ACCESS_FINE_LOCATION

    网络定位(WiFi或移动网络)定位速度快,但精度相对GPS低

    网络定位对应于权限android.permission.ACCESS_COARSE_LOCATION【COARSE系粗糙之意】

*/

public class MainActivity extends AppCompatActivity {

    LocationManager lm;  //位置服务管理器

    ConnectivityManager cm;  //网络连接管理器

    WifiManager wfm;  //Wifi管理器

    TextView tv;  //显示经纬度

    final static int LOCATION_SETTING_REQUEST_CODE = 100;

    final static int NETWORK_SETTING_REQUEST_CODE = 200;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        //如果没有ACCESS_COARSE_LOCATION权限,动态请求用户允许使用该权限

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);

        }else {

            prepareLocatingService();

        }

    }

    @Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {

            case 1:

                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {  //危险权限

                    prepareLocatingService();

                } else {

                    Toast.makeText(this, "没有授予定位权限!", Toast.LENGTH_LONG).show();

                    finish();

                }

        }

    }

    //定位服务预备

    void prepareLocatingService() {

        tv = findViewById(R.id.tv);

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

        cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        //android API 24之后,必须使用 getApplicationContext()

        wfm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

        //打开定位服务时(有多种检测方法)

        if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER) || lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {

            //打开位置服务作为定位的入口

            locatingService();  //方法调用

        } else {

            new AlertDialog.Builder(this)

                    .setIcon(R.mipmap.ic_launcher)

                    .setTitle("消息框")

                    .setMessage("请先打开定位服务!")

                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {

                        @Override

                        public void onClick(DialogInterface dialog, int which) {

                            //定位服务设置意图

                            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);

                            //有返回值的调用,设置定位设置请求码

                            startActivityForResult(intent, LOCATION_SETTING_REQUEST_CODE);

                        }

                    })

                    .show();

            Log.i("wustwzxabc", "test1111");  //未阻塞,即用户单击“确定”按钮前此信息已经输出

            //即Android里的AlertDialog,是非阻塞的!

        }

    }

    void locatingService() {  //已开启位置服务时

        if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER) && lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {

            //使用混合定位(GPS+网络)

            if (cm.getActiveNetworkInfo() != null) {

                networkLocation();  //为了尽快获取定位数据,假定网络定位优先

            } else {

                GPSLocation();  //使用GPS定位

            }

        } else {

            if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {  //使用单GPS定位方式

                GPSLocation();

            } else {

                if (lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {  //未开启GPS定位—即网络定位—节电模式

                    networkLocation();

                }

            }

        }

    }

    void GPSLocation() {

        tv.setText("GPS定位中...");

        Toast.makeText(getApplicationContext(), "GPS定位", Toast.LENGTH_LONG).show();

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            return;

        }

        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, new LocationListener() {

            @Override

            public void onStatusChanged(String arg0, int arg1, Bundle arg2) {

                // TODO Auto-generated method stub

            }

            @Override

            public void onProviderEnabled(String arg0) {

                // TODO Auto-generated method stub

            }

            @Override

            public void onProviderDisabled(String arg0) {

                // TODO Auto-generated method stub

            }

            @Override

            public void onLocationChanged(Location location) {

                // TODO Auto-generated method stub

                String string1 = "纬度为:" + location.getLatitude() + "\n经度为:" + location.getLongitude();

                tv.setText(string1);

            }

        });

    }

    void networkLocation() {

        if (cm.getActiveNetworkInfo() != null) { //有网络连接时

            if (wfm.isWifiEnabled()) { //WIFI有效时

                Toast.makeText(getApplicationContext(), "WiFi方式的网络定位", Toast.LENGTH_LONG).show();

            } else {

                Toast.makeText(getApplicationContext(), "基站方式的网络定位", Toast.LENGTH_LONG).show();

            }

        } else { //没有网络连接时

            new AlertDialog.Builder(this)

                    .setIcon(R.mipmap.ic_launcher)

                    .setTitle("消息框")

                    .setMessage("无网络连接!请先设置一种网络连接...")

                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {

                        @Override

                        public void onClick(DialogInterface dialog, int which) {

                            //进入网络连接设置

                            Intent intent = new Intent(Settings.ACTION_SETTINGS);

                            //有返回值的调用,设置网络设置请求码

                            startActivityForResult(intent, NETWORK_SETTING_REQUEST_CODE);

                        }

                    })

                    .show();

        }

        //下面的请求位置(实时)更新,Android 6.0及以上版本需要在首次运行时动态加载上述权限

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            return;

        }

        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1, new LocationListener() {  //实时监听

            @Override

            public void onStatusChanged(String arg0, int arg1, Bundle arg2) {

                // TODO Auto-generated method stub

            }

            @Override

            public void onProviderEnabled(String arg0) {

                // TODO Auto-generated method stub

            }

            @Override

            public void onProviderDisabled(String arg0) {

                // TODO Auto-generated method stub

            }

            @Override

            public void onLocationChanged(Location location) {

                // TODO Auto-generated method stub

                String string2 = "纬度为:" + location.getLatitude() + "\n经度为:" + location.getLongitude();

                //Toast.makeText(getApplicationContext(), string2, Toast.LENGTH_LONG).show();

                tv.setText(string2);

            }

        });

    }

    @Override  //有返回值的调用

    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        //只用到了请求码

        if (requestCode == LOCATION_SETTING_REQUEST_CODE || requestCode == NETWORK_SETTING_REQUEST_CODE) {

            prepareLocatingService();

        }

    }

}

【Return Top】

(二)百度定位包的使用模块:example10_2

运行效果

预备:访问http://lbsyun.baidu.com,依次选择:开发文档->Android 地图SDK->产品下载->自定义下载,勾选百度定位包后下载、解压

在项目里,新建名为example10_2的模块

选择模块视图为Project,复制定位包BaiduLBS_Android.jar至模块example10 _2的libs文件夹里,然后右键jar文件,选择“Add As Library”

在main文件夹下新建名为jniLibs的文件夹,复制存放.so文件(share object)的多个文件夹至jniLibs文件夹

在模块的清单文件里,增加如下权限:

<!--百度定位所需要权限,前面2个是LOCATE权限组的2个危险权限-->

<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.INTERNET"/> <!--因为程序要与百度云服务交互-->

获取本机的Android指纹码——SHA(Secure Hash Algorithm,安全散列算法),其方法如下:

访问该网址 进入百度地图开发者页面、注册和登录(注册含于登录界面里)

使用百度帐号成功登录后,进入控制台,创建应用

提交后,生成应用的AK,查看应用Key并复制,以供清单文件配置应用Key用。

在清单文件里,在Activity组件注册的代码后,添加注册远程服务和配置应用Key的代码:

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>

<meta-data

    android:name="com.baidu.lbsapi.API_KEY"

    android:value="NDnYRd8LK85vGbLeRVaV23x9RccY5M3p"/><!--应用Key是在百度开发者页面里生成的,需要替换-->

布局activitymain.xml代码:添加一个id为tvpositionText的TextView控件

界面程序MainActivity.java代码如下:

/*

    百度定位信息,使用一个TextView控件显示

    一般需要打开定位服务,选择高精度定位模式,有网络连接

    需要在清单文件里使用百度云服务(参见清单文件service标签)

    需要创建应用(模块)的Key,并写入清单文件(参见清单文件meta标签)

*/

public class MainActivity extends AppCompatActivity {

    public LocationClient mLocationClient; //定位客户端

    TextView tv_positionText;  //显示定位信息控件

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        //如果没有定位权限,动态请求用户允许使用该权限

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

        }else {

            requestLocation();

        }

    }

    @Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {

            case 1:

                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {

                    Toast.makeText(this, "没有定位权限!", Toast.LENGTH_LONG).show();

                    finish();

                } else {

                    requestLocation();

                }

        }

    }

    private void requestLocation() {

        initLocation();  //初始化

        mLocationClient.start();  //开始定位

    }

    @Override

    protected void onDestroy() {

        super.onDestroy(); 

        mLocationClient.stop();

    }

    private void initLocation() { 

        setContentView(R.layout.activity_main);

        mLocationClient = new LocationClient(getApplicationContext());

        mLocationClient.registerLocationListener(new MyLocationListener());

        tv_positionText = findViewById(R.id.tv_positionText);

        //定位客户端操作

        LocationClientOption option = new LocationClientOption();

        //设置扫描时间间隔(单位:毫秒)

        option.setScanSpan(1000);

        //设置定位模式,三选一

        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);

        /*option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);

        option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);*/

        //设置需要地址信息

        option.setIsNeedAddress(true);

        //保存定位参数

        mLocationClient.setLocOption(option);

    }

    class MyLocationListener implements BDLocationListener {

        @Override

        public void onReceiveLocation(BDLocation bdLocation) {

            StringBuffer currentPosition = new StringBuffer();

            currentPosition.append("Longitude:").append(bdLocation.getLongitude()).append("\n");

            currentPosition.append("Latitude:").append(bdLocation.getLatitude()).append("\n");

            currentPosition.append("Country:").append(bdLocation.getCountry()).append("\n");

            currentPosition.append("Province:").append(bdLocation.getProvince()).append("\n");

            currentPosition.append("City:").append(bdLocation.getCity()).append("\n");

            currentPosition.append("District:").append(bdLocation.getDistrict()).append("\n");

            currentPosition.append("Street:").append(bdLocation.getStreet()).append("\n");

            currentPosition.append("Address:").append(bdLocation.getAddrStr());

            tv_positionText.setText(currentPosition);

        }

    }

}

【Return Top】

(三)百度地图包的使用模块:example10_3

运行效果

在项目里,新建名为example10_3的模块,并切换至Project视图

访问http://lbsyun.baidu.com,依次选择:开发文档->Android开发->Android地图SDK->产品下载,勾选百度定位包和百度地图后下载、解压,按照上一模块的做法,复制.jar文件到libs文件夹,新建jniLibs文件夹并复制包含.so文件的几个文件夹(需要进入jniLibs文件夹,使用Windows文件资源管理器复制,其容量应为18M左右!)

生成本应用的Key。

在清单文件里,在Activity组件注册的代码后,添加注册远程服务和配置应用Key的代码:

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>

<meta-data

    android:name="com.baidu.lbsapi.API_KEY"

    android:value="AXHLWlI2UtWhLk2YMGaLSdzva3WfhOyK"/><!--应用Key是在百度开发者页面里生成的,需要替换-->

界面布局使用帧布局,包含有重叠效果的地图和位置文本,activity_main.xml的完整代码如下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    <!--百度地图控件-->

    <com.baidu.mapapi.map.MapView

        android:id="@+id/bmapView"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:clickable="true" />

    <!--位置文本布局的背景色代码的前2位代码为透明度-->

    <LinearLayout

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:background="#e0000000"

        android:orientation="vertical" >

        <LinearLayout

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_marginLeft="12dp"

            android:layout_marginTop="20dp"

            android:orientation="horizontal" >

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="纬度:"

                android:textColor="#ffffff"

                android:textSize="15dp" />

            <TextView

                android:id="@+id/tv_Lat"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text=""

                android:textColor="#ffffff"

                android:textSize="15dp" />

        </LinearLayout>

        <LinearLayout

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_marginLeft="12dp"

            android:layout_marginTop="10dp"

            android:orientation="horizontal" >

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="经度:"

                android:textColor="#ffffff"

                android:textSize="15dp" />

            <TextView

                android:id="@+id/tv_Lon"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text=""

                android:textColor="#ffffff"

                android:textSize="15dp" />

        </LinearLayout>

        <LinearLayout

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_marginBottom="10dp"

            android:layout_marginLeft="12dp"

            android:layout_marginTop="10dp"

            android:orientation="horizontal" >

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="地址:"

                android:textColor="#ffffff"

                android:textSize="15dp" />

            <TextView

                android:id="@+id/tv_Add"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text=""

                android:textColor="#ffffff"

                android:textSize="15dp" />

        </LinearLayout>

    </LinearLayout>

</FrameLayout>

界面程序MainActivity.java代码如下:

/*

    百度地图应用,包含定位信息和地图显示

    一般需要打开定位服务,选择高精度定位模式,有网络连接

    需要在清单文件里使用百度云服务(参见清单文件service标签)

    需要创建应用(模块)的Key,并写入清单文件(参见清单文件meta标签)

*/

public class MainActivity extends AppCompatActivity {

    LocationClient mLocationClient;  //定位客户端

    MapView mapView;  //Android Widget地图控件

    BaiduMap baiduMap;

    boolean isFirstLocate = true;

    TextView tv_Lat;  //纬度

    TextView tv_Lon;  //经度

    TextView tv_Add;  //地址

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        //如果没有定位权限,动态请求用户允许使用该权限

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

        }else {

            requestLocation();

        }

    }

    @Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {

            case 1:

                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {

                    Toast.makeText(this, "没有定位权限!", Toast.LENGTH_LONG).show();

                    finish();

                } else {

                    requestLocation();

                }

        }

    }

    private void requestLocation() {

        initLocation();

        mLocationClient.start();

    }

    private void initLocation() {  //初始化

        mLocationClient = new LocationClient(getApplicationContext());

        mLocationClient.registerLocationListener(new MyLocationListener());

        SDKInitializer.initialize(getApplicationContext());

        setContentView(R.layout.activity_main);

        mapView = findViewById(R.id.bmapView);

        baiduMap = mapView.getMap();

        tv_Lat = findViewById(R.id.tv_Lat);

        tv_Lon = findViewById(R.id.tv_Lon);

        tv_Add = findViewById(R.id.tv_Add);

        LocationClientOption option = new LocationClientOption();

        //设置扫描时间间隔

        option.setScanSpan(1000);

        //设置定位模式,三选一

        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);

        /*option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);

        option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);*/

        //设置需要地址信息

        option.setIsNeedAddress(true);

        //保存定位参数

        mLocationClient.setLocOption(option);

    }

    //内部类,百度位置监听器

    private class MyLocationListener  implements BDLocationListener {

        @Override

        public void onReceiveLocation(BDLocation bdLocation) {

            tv_Lat.setText(bdLocation.getLatitude()+"");

            tv_Lon.setText(bdLocation.getLongitude()+"");

            tv_Add.setText(bdLocation.getAddrStr());

            if(bdLocation.getLocType()==BDLocation.TypeGpsLocation || bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){

                navigateTo(bdLocation);

            }

        }

    }

    private void navigateTo(BDLocation bdLocation) {

        if(isFirstLocate){

            LatLng ll = new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());

            MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);

            baiduMap.animateMapStatus(update);

            isFirstLocate = false;

        }

    }

    @Override

    protected void onResume() {

        super.onResume();

        mapView.onResume();

    }

    @Override

    protected void onPause() {

        super.onPause();

        mapView.onResume();

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        mLocationClient.stop();

        mapView.onDestroy();

    }

}

相关文章

  • 今天先不更

    补作业补作业补作业补作业补作业补作业补作业补作业补作业补作业补作业补作业补作业补作业补作业补作业补作业补作业补作业...

  • 作业作业作业

    出外听课两天,小必的学习没过问。 早晨,小必的数学作业没完成,很多没完成:优化设计,数学书,小灵通,都没完成。 中...

  • 作业作业作业

    头疼的厉害,太阳穴绷得紧紧的。躺了一个多小时了,也不见好转。每当这个时候,一场大觉就能让我彻底放松。可是心不静,怎...

  • 作业作业作业

    1,我的作业 写好了文章,倒也没发的欲望,这是我的作业,作业。 只是想着把一切都准备好,明天再发。听说发文很多O推...

  • 作业作业作业

    @所有人 各位家长:学生对待作业的态度就是对待学习的态度。态度决定一切!老师们在检查作业过程中发现有不写的、有偷工...

  • 11-17

    作业1: 作业2: 作业3: 作业4: 作业5: 作业6: 作业7: 作业8: 作业9: 作业10: 作业11: ...

  • 11月17

    作业1 作业2 作业3 作业4 作业五 作业6 作业7 作业8 作业9 作业10 作业11 思考

  • 11.17

    作业1 作业2 作业3 作业4 作业5 作业6 作业7 作业8 作业9 作业10 作业11 思考

  • 17-11-17

    作业一 作业二 作业三 作业四 作业五 作业六 作业七 作业八 作业九 作业十 作业十一 思考

  • 17-11-17

    作业1 作业2 作业3 作业4 作业5 作业6 作业7 作业8 作业9 作业10 作业11 思考题

网友评论

      本文标题:as作业

      本文链接:https://www.haomeiwen.com/subject/snzmahtx.html