美文网首页
LocationDemo(Android定位)

LocationDemo(Android定位)

作者: 冉桓彬 | 来源:发表于2017-08-18 13:30 被阅读10次

    代码:

    public class LocationUi extends BaseUi implements View.OnClickListener, LocationListener {
    
        private Button mBtnStartLocation;
        private Button mBtnStopLocation;
        private TextView mTvLocation;
        private LocationManager mLocationManager;
    
        @Override
        protected void initView() {
            setContentView(R.layout.ui_location);
            mBtnStartLocation = (Button) findViewById(R.id.location_btnStartLocation);
            mBtnStopLocation = (Button) findViewById(R.id.location_btnStopLocation);
            mTvLocation = (TextView) findViewById(R.id.location_tvLocation);
        }
    
        @Override
        protected void initData() {
        }
    
        @Override
        protected void initListener() {
            mBtnStartLocation.setOnClickListener(this);
            mBtnStopLocation.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.location_btnStartLocation:
                    openGPSSettings();
                    break;
                case R.id.location_btnStopLocation:
                    stopGPS();
                    break;
            }
    
        }
    
        private void openGPSSettings() {
            mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            if (mLocationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
                Toast.makeText(this, "GPS模块正常", Toast.LENGTH_SHORT).show();
                doWork();
            } else {
                Toast.makeText(this, "请开启GPS!", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
                startActivityForResult(intent, 0);  // 此为设置完成后返回到获取界面
            }
        }
    
        private void doWork() {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                mTvLocation.setText("权限异常1");
                return;
            }
            Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 8, this);
            updata(location);
        }
    
        private void updata(Location location) {
            if (location != null) {
                String latitude = formatWGS84ToDegree(location.getLatitude());
                String longitude = formatWGS84ToDegree(location.getLongitude());
                StringBuilder sb = new StringBuilder();
                sb.append("实时的位置信息:\n");
                sb.append("经度:");
                sb.append(longitude);
                sb.append("\n纬度:");
                sb.append(latitude);
                sb.append("\b高度:");
                sb.append(location.getAltitude());
                sb.append("\n速度:");
                sb.append(location.getSpeed());
                sb.append("\n方向:");
                sb.append(location.getBearing());
                mTvLocation.setText(sb.toString());
            }
        }
    
        @Override
        public void onLocationChanged(Location location) {
            // 当GPS定位信息发生改变时,更新位置
            updata(location);
        }
    
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
    
        }
    
        @Override
        public void onProviderEnabled(String provider) {
            // 当GPS Location Provider可用时,更新位置
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                    && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                mTvLocation.setText("权限异常2");
                return;
            }
            updata(mLocationManager.getLastKnownLocation(provider));
        }
    
        @Override
        public void onProviderDisabled(String provider) {
    
        }
    
        private void stopGPS() {
            if (mLocationManager != null && mLocationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
                mLocationManager.removeUpdates(this);
            }
        }
    
        /**
         * 将WGS84坐标由十进制转换为度分秒格式
         *
         * @param value
         * @return 格式为114°12′20.12″
         */
        public String formatWGS84ToDegree(double value) {
            String result = "";
            int degree, minute;
            double second;
            degree = (int) value;
            minute = (int) ((value - degree) * 60);
            second = ((value - degree) * 60 - minute) * 60;
            // “秒”部分小数位数为三位
            result = String.format(Locale.CHINA, "%s°%s′%.3f″", degree, minute, second);
            return result;
        }
    }
    
    

    xml:

    <?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">
    
        <Button
            android:id="@+id/location_btnStartLocation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="开启定位"
            android:textAllCaps="false"/>
        <Button
            android:id="@+id/location_btnStopLocation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="关闭定位"
            android:textAllCaps="false"/>
        <TextView
            android:id="@+id/location_tvLocation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:textColor="#000000"
            android:textSize="20sp"/>
    </LinearLayout>
    

    权限:

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    

    相关文章

      网友评论

          本文标题:LocationDemo(Android定位)

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