zoukankan      html  css  js  c++  java
  • 2.12Android5

    一、今日学习内容

       今天学习了关于在安卓开发中引用百度定位的方法

       相关教程:https://www.bilibili.com/video/BV1ca411c7uK?p=1

       

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.example.tiwen">
    
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 这个权限用于进行网络定位 -->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 -->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
        <uses-permission android:name="android.permission.CHANGE_WIFI_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.READ_LOGS" /> <!-- 允许访问振动设备 -->
        <uses-permission android:name="android.permission.VIBRATE" /> <!-- 允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失 -->
        <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 允许程序读取或写入系统设置 -->
        <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- android 9.0上使用前台服务,需要添加权限 -->
        <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- 用于读取手机当前的状态 -->
        <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 读取缓存数据 -->
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 获取模拟定位信息 -->
        <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
        <uses-permission
            android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
            tools:ignore="ProtectedPermissions" />
    复制代码

           需加入相关权限

    复制代码
    package com.example.tiwen;
    
    
    import android.app.Service;
    import android.os.Vibrator;
    
    import com.baidu.mapapi.CoordType;
    import com.baidu.mapapi.SDKInitializer;
    
    import org.litepal.LitePalApplication;
    
    /**
     * 主Application,所有百度定位SDK的接口说明请参考线上文档:http://developer.baidu.com/map/loc_refer/index.html
     *
     * 百度定位SDK官方网站:http://developer.baidu.com/map/index.php?title=android-locsdk
     * 
     * 直接拷贝com.baidu.location.service包到自己的工程下,简单配置即可获取定位结果,也可以根据demo内容自行封装
     */
    public class LocationApplication extends LitePalApplication {
        public LocationService locationService;
        public Vibrator mVibrator;
        @Override
        public void onCreate() {
            super.onCreate();
            /***
             * 初始化定位sdk,建议在Application中创建
             */
            locationService = new LocationService(getApplicationContext());
            mVibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);
            SDKInitializer.initialize(getApplicationContext());
            SDKInitializer.setCoordType(CoordType.BD09LL);
        }
    }
    复制代码
    复制代码
    package com.example.tiwen;
    
    import android.content.Context;
    import android.webkit.WebView;
    
    import com.baidu.location.BDAbstractLocationListener;
    import com.baidu.location.LocationClient;
    import com.baidu.location.LocationClientOption;
    import com.baidu.location.LocationClientOption.LocationMode;
    
    /**
     * 定位服务LocationClient 相关
     *
     * @author baidu
     */
    public class LocationService {
        private static LocationClient client = null;
        private static LocationClientOption mOption;
        private static LocationClientOption DIYoption;
        private Object objLock;
    
        /***
         * 初始化 LocationClient
         *
         * @param locationContext
         */
        public LocationService(Context locationContext) {
            objLock = new Object();
            synchronized (objLock) {
                if (client == null) {
                    client = new LocationClient(locationContext);
                    client.setLocOption(getDefaultLocationClientOption());
                }
            }
        }
    
        /***
         * 注册定位监听
         *
         * @param listener
         * @return
         */
    
        public boolean registerListener(BDAbstractLocationListener listener) {
            boolean isSuccess = false;
            if (listener != null) {
                client.registerLocationListener(listener);
                isSuccess = true;
            }
            return isSuccess;
        }
    
        public void unregisterListener(BDAbstractLocationListener listener) {
            if (listener != null) {
                client.unRegisterLocationListener(listener);
            }
        }
    
        /**
         * @return 获取sdk版本
         */
        public String getSDKVersion() {
            if (client != null) {
                String version = client.getVersion();
                return version;
            }
            return null;
        }
    
        /***
         * 设置定位参数
         *
         * @param option
         * @return isSuccessSetOption
         */
        public static boolean setLocationOption(LocationClientOption option) {
            boolean isSuccess = false;
            if (option != null) {
                if (client.isStarted()) {
                    client.stop();
                }
                DIYoption = option;
                client.setLocOption(option);
            }
            return isSuccess;
        }
    
        /**
         * 开发者应用如果有H5页面使用了百度JS接口,该接口可以辅助百度JS更好的进行定位
         *
         * @param webView 传入webView控件
         */
        public void enableAssistanLocation(WebView webView) {
            if (client != null) {
                client.enableAssistantLocation(webView);
            }
        }
    
        /**
         * 停止H5辅助定位
         */
        public void disableAssistantLocation() {
            if (client != null) {
                client.disableAssistantLocation();
            }
        }
    
        /***
         *
         * @return DefaultLocationClientOption  默认O设置
         */
        public LocationClientOption getDefaultLocationClientOption() {
            if (mOption == null) {
                mOption = new LocationClientOption();
    
                mOption.setAddrType("all");
                mOption.setLocationMode(LocationMode.Hight_Accuracy); // 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
                mOption.setCoorType( "bd09ll" ); // 可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
                mOption.setScanSpan(3000); // 可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
                mOption.setIsNeedAddress(true); // 可选,设置是否需要地址信息,默认不需要
                mOption.setIsNeedLocationDescribe(true); // 可选,设置是否需要地址描述
                mOption.setNeedDeviceDirect(true); // 可选,设置是否需要设备方向结果
                mOption.setLocationNotify(true); // 可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
                mOption.setIgnoreKillProcess(true); // 可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop
                mOption.setIsNeedLocationDescribe(true); // 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation
                mOption.setIsNeedLocationPoiList(true); // 可选,默认false,设置是否需要POI结果,可以在BDLocation
                mOption.SetIgnoreCacheException(true); // 可选,默认false,设置是否收集CRASH信息,默认收集
                mOption.setOpenGps(true); // 可选,默认false,设置是否开启Gps定位
                mOption.setIsNeedAltitude(true); // 可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用
            }
            return mOption;
        }
    
    
        /**
         * @return DIYOption 自定义Option设置
         */
        public LocationClientOption getOption() {
            if (DIYoption == null) {
                DIYoption = new LocationClientOption();
            }
            return DIYoption;
        }
    
        public void start() {
            synchronized (objLock) {
                if (client != null && !client.isStarted()) {
                    client.start();
                }
            }
        }
    
        public void requestLocation() {
            if (client != null) {
                client.requestLocation();
            }
        }
    
        public void stop() {
            synchronized (objLock) {
                if (client != null && client.isStarted()) {
                    client.stop();
                }
            }
        }
    
        public boolean isStart() {
            return client.isStarted();
        }
    
        public boolean requestHotSpotState() {
            return client.requestHotSpotState();
        }
    }
    复制代码
    复制代码
    package com.example.tiwen;
    
    import android.Manifest;
    import android.annotation.TargetApi;
    import android.content.pm.PackageManager;
    import android.os.Build;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import com.baidu.location.BDAbstractLocationListener;
    import com.baidu.location.BDLocation;
    import com.baidu.location.Poi;
    
    import org.litepal.LitePal;
    
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    
    public class FirstActivity extends AppCompatActivity {
    
        private final int SDK_PERMISSION_REQUEST = 127;
        private String permissionInfo;
        private LocationService locationService;
        private TextView address_text;
        private CheckBox cb1,cb2,cb3,cb4;
        private EditText etName,etDate,etId,etTiwen,etClass1,etCb2;
        String Address,name,date,tiwen,ID1,class1,cbb1,cbb2,cbb3,cbb4,s1,ot2,date1;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.first_layout);
            etName = (EditText) findViewById(R.id.name_edit_text);
            etDate = (EditText) findViewById(R.id.date_edit_text);
            etDate.setText(getDate());
            etId = (EditText) findViewById(R.id.ID_edit_text);
            etClass1=(EditText) findViewById(R.id.class1_edit_text);
            etTiwen = (EditText) findViewById(R.id.tiwen_edit_text);
            LitePal.getDatabase();
            List<Judge> judge= LitePal.findAll(Judge.class);
            for(Judge j:judge){
                name=j.getName();
                ID1=j.getID1();
                class1=j.getClass1();
            }
            etName.setText(name);
            etId.setText(ID1);
            etClass1.setText(class1);
            address_text=(TextView) findViewById(R.id.address_text);
            //startLocation = (Button) findViewById(R.id.button_2);
            cb1 = (CheckBox)findViewById(R.id.ot1);
            cb2 = (CheckBox)findViewById(R.id.ot2);
            cb3 = (CheckBox)findViewById(R.id.ot3);
            cb4 = (CheckBox)findViewById(R.id.ot4);
    
            getPersimmions();
    
    
            Button button1=(Button)findViewById(R.id.button_1);
            button1.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    cbb1=cb1.getText().toString().trim();
                    cbb2=cb2.getText().toString().trim();
                    cbb3=cb3.getText().toString().trim();
                    cbb4=cb4.getText().toString().trim();
                    StringBuffer sb1 = new StringBuffer(256);
                    if(cb1.isChecked()){
                        cb2.setChecked(false);
                        cb3.setChecked(false);
                        cb4.setChecked(false);
                        sb1.append(cbb1);
                    }
                    if(cb2.isChecked()){
                        sb1.append(cbb2);
                        etCb2=(EditText) findViewById(R.id.ot2_1);
                        ot2=etCb2.getText().toString().trim();
                        sb1.append("    备注:"+ot2);
                    }
                    if(cb3.isChecked()){
                        sb1.append(cbb3);
                    }
                    if(cb4.isChecked()){
                        sb1.append(cbb4);
                    }
                        s1 = sb1.toString().trim();
                        name = etName.getText().toString().trim();
                        ID1 = etId.getText().toString().trim();
                        class1 = etClass1.getText().toString().trim();
                        date = etDate.getText().toString().trim();
                        date1 = date.substring(0, 10);
                        tiwen = etTiwen.getText().toString().trim();
                        List<TiWen> tiwen1 = (List<TiWen>) LitePal.where("ID1 = ? and date1 = ?", ID1, date1).find(TiWen.class);
                        if (null != tiwen1 && tiwen1.size() != 0) {
                            Toast.makeText(FirstActivity.this, "已提交", Toast.LENGTH_SHORT).show();
                        } else {
                            TiWen t = new TiWen();
                            t.setName(name);
                            t.setID1(ID1);
                            t.setClass1(class1);
                            t.setDate(date);
                            t.setAddress(Address);
                            t.setTiwen(tiwen);
                            t.setS(s1);
                            t.setDate1(date1);
                            t.save();
    
                            if (t.save()) {
                                Toast.makeText(FirstActivity.this, "提交成功", Toast.LENGTH_SHORT).show();
                            } else {
                                Toast.makeText(FirstActivity.this, "提交失败", Toast.LENGTH_SHORT).show();
                            }
                        }
    
                    }
    
            });
        }
        @TargetApi(23)
        private void getPersimmions() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                ArrayList<String> permissions = new ArrayList<String>();
                /***
                 * 定位权限为必须权限,用户如果禁止,则每次进入都会申请
                 */
                // 定位精确位置
                if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
                }
                if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
                }
                /*
                 * 读写权限和电话状态权限非必要权限(建议授予)只会申请一次,用户同意或者禁止,只会弹一次
                 */
                // 读写权限
                if (addPermission(permissions, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    permissionInfo += "Manifest.permission.WRITE_EXTERNAL_STORAGE Deny 
    ";
                }
                if (permissions.size() > 0) {
                    requestPermissions(permissions.toArray(new String[permissions.size()]), SDK_PERMISSION_REQUEST);
                }
            }
        }
    
        @TargetApi(23)
        private boolean addPermission(ArrayList<String> permissionsList, String permission) {
            // 如果应用没有获得对应权限,则添加到列表中,准备批量申请
            if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                if (shouldShowRequestPermissionRationale(permission)) {
                    return true;
                } else {
                    permissionsList.add(permission);
                    return false;
                }
            } else {
                return true;
            }
        }
    
        @TargetApi(23)
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            // TODO Auto-generated method stub
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    
    
            /***
             * Stop location service
             */
            @Override
            protected void onStop() {
                // TODO Auto-generated method stub
                locationService.unregisterListener(mListener); //注销掉监听
                locationService.stop(); //停止定位服务
                super.onStop();
            }
    
            @Override
            protected void onStart() {
                // TODO Auto-generated method stub
                super.onStart();
                // -----------location config ------------
                locationService = ((LocationApplication) getApplication()).locationService;
                //获取locationservice实例,建议应用中只初始化1个location实例,然后使用,可以参考其他示例的activity,都是通过此种方式获取locationservice实例的
                locationService.registerListener(mListener);
                //注册监听
                int type = getIntent().getIntExtra("from", 0);
                if (type == 0) {
                    locationService.setLocationOption(locationService.getDefaultLocationClientOption());
                } else if (type == 1) {
                    locationService.start();
                }
                //startLocation.setOnClickListener(new View.OnClickListener() {
    
                   // @Override
                    //public void onClick(View v) {
                        //if (startLocation.getText().toString().equals("获取定位")) {
                    locationService.start();// 定位SDK
    
                            // start之后会默认发起一次定位请求,开发者无须判断isstart并主动调用request
                            //startLocation.setText("停止定位");
                        //} else {
                    locationService.stop();
                        //   startLocation.setText("获取定位");
                       // }
                    //}
                //});
            }
    
        private BDAbstractLocationListener mListener = new BDAbstractLocationListener() {
    
            /**
             * 定位请求回调函数
             *
             * @param location 定位结果
             */
            @Override
            public void onReceiveLocation(BDLocation location) {
    
                // TODO Auto-generated method stub
                if (null != location && location.getLocType() != BDLocation.TypeServerError) {
    
                    StringBuffer sb = new StringBuffer(256);
    
                    sb.append(location.getAddrStr());
                    sb.append(location.getStreetNumber());
                    if (location.getPoiList() != null && !location.getPoiList().isEmpty()) {
                           Poi poi = (Poi) location.getPoiList().get(0);
                            sb.append(poi.getName());
                    }
                    Address=sb.toString().trim();
                    address_text.setText(Address);
                    //Address=location.getAddrStr();
    
                    if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
                        Toast.makeText(FirstActivity.this, "GPS定位成功", Toast.LENGTH_SHORT).show();
                        locationService.stop();
                    } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
                        // 运营商信息
                        Toast.makeText(FirstActivity.this, "网络定位成功", Toast.LENGTH_SHORT).show();
                        locationService.stop();
                    } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
                        Toast.makeText(FirstActivity.this, "离线定位成功,离线定位结果也是有效的", Toast.LENGTH_SHORT).show();
                        locationService.stop();
                    } else if (location.getLocType() == BDLocation.TypeServerError) {
                        Toast.makeText(FirstActivity.this, "服务端网络定位失败", Toast.LENGTH_SHORT).show();
                        //sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
                    } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
                        Toast.makeText(FirstActivity.this, "网络不通导致定位失败,请检查网络是否通畅", Toast.LENGTH_SHORT).show();
                    } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
                        Toast.makeText(FirstActivity.this, "无法获取有效定位依据导致定位失败,可以重启手机", Toast.LENGTH_SHORT).show();
                        //sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
                    }
                }
            }
        };
    
            private String getDate() {
                SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");
                return date_format.format(new Date());
             }
            private String getDate1() {
                SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd");
                return date_format.format(new Date());
             }
    
            //private String getTime() {
               // SimpleDateFormat time_format = new SimpleDateFormat("HH:mm:ss");
                //return time_format.format(new Date());
           // }
    }
    复制代码

    此外,连接数据库用到的方法是LitePal

    二、遇到的问题

        在进行百度定位的时候,开始一直定位失败,显示null,null,在经过网上查阅相关资料,是因为少了关于申请权限的相关代码

    三、明日计划

        明天对体温上报软件进行总结汇总

    一、今日学习内容

       今天学习了关于在安卓开发中引用百度定位的方法

       相关教程:https://www.bilibili.com/video/BV1ca411c7uK?p=1

       

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.example.tiwen">
    
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 这个权限用于进行网络定位 -->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 -->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
        <uses-permission android:name="android.permission.CHANGE_WIFI_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.READ_LOGS" /> <!-- 允许访问振动设备 -->
        <uses-permission android:name="android.permission.VIBRATE" /> <!-- 允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失 -->
        <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 允许程序读取或写入系统设置 -->
        <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- android 9.0上使用前台服务,需要添加权限 -->
        <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- 用于读取手机当前的状态 -->
        <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 读取缓存数据 -->
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 获取模拟定位信息 -->
        <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
        <uses-permission
            android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
            tools:ignore="ProtectedPermissions" />
    复制代码

           需加入相关权限

    复制代码
    package com.example.tiwen;
    
    
    import android.app.Service;
    import android.os.Vibrator;
    
    import com.baidu.mapapi.CoordType;
    import com.baidu.mapapi.SDKInitializer;
    
    import org.litepal.LitePalApplication;
    
    /**
     * 主Application,所有百度定位SDK的接口说明请参考线上文档:http://developer.baidu.com/map/loc_refer/index.html
     *
     * 百度定位SDK官方网站:http://developer.baidu.com/map/index.php?title=android-locsdk
     * 
     * 直接拷贝com.baidu.location.service包到自己的工程下,简单配置即可获取定位结果,也可以根据demo内容自行封装
     */
    public class LocationApplication extends LitePalApplication {
        public LocationService locationService;
        public Vibrator mVibrator;
        @Override
        public void onCreate() {
            super.onCreate();
            /***
             * 初始化定位sdk,建议在Application中创建
             */
            locationService = new LocationService(getApplicationContext());
            mVibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);
            SDKInitializer.initialize(getApplicationContext());
            SDKInitializer.setCoordType(CoordType.BD09LL);
        }
    }
    复制代码
    复制代码
    package com.example.tiwen;
    
    import android.content.Context;
    import android.webkit.WebView;
    
    import com.baidu.location.BDAbstractLocationListener;
    import com.baidu.location.LocationClient;
    import com.baidu.location.LocationClientOption;
    import com.baidu.location.LocationClientOption.LocationMode;
    
    /**
     * 定位服务LocationClient 相关
     *
     * @author baidu
     */
    public class LocationService {
        private static LocationClient client = null;
        private static LocationClientOption mOption;
        private static LocationClientOption DIYoption;
        private Object objLock;
    
        /***
         * 初始化 LocationClient
         *
         * @param locationContext
         */
        public LocationService(Context locationContext) {
            objLock = new Object();
            synchronized (objLock) {
                if (client == null) {
                    client = new LocationClient(locationContext);
                    client.setLocOption(getDefaultLocationClientOption());
                }
            }
        }
    
        /***
         * 注册定位监听
         *
         * @param listener
         * @return
         */
    
        public boolean registerListener(BDAbstractLocationListener listener) {
            boolean isSuccess = false;
            if (listener != null) {
                client.registerLocationListener(listener);
                isSuccess = true;
            }
            return isSuccess;
        }
    
        public void unregisterListener(BDAbstractLocationListener listener) {
            if (listener != null) {
                client.unRegisterLocationListener(listener);
            }
        }
    
        /**
         * @return 获取sdk版本
         */
        public String getSDKVersion() {
            if (client != null) {
                String version = client.getVersion();
                return version;
            }
            return null;
        }
    
        /***
         * 设置定位参数
         *
         * @param option
         * @return isSuccessSetOption
         */
        public static boolean setLocationOption(LocationClientOption option) {
            boolean isSuccess = false;
            if (option != null) {
                if (client.isStarted()) {
                    client.stop();
                }
                DIYoption = option;
                client.setLocOption(option);
            }
            return isSuccess;
        }
    
        /**
         * 开发者应用如果有H5页面使用了百度JS接口,该接口可以辅助百度JS更好的进行定位
         *
         * @param webView 传入webView控件
         */
        public void enableAssistanLocation(WebView webView) {
            if (client != null) {
                client.enableAssistantLocation(webView);
            }
        }
    
        /**
         * 停止H5辅助定位
         */
        public void disableAssistantLocation() {
            if (client != null) {
                client.disableAssistantLocation();
            }
        }
    
        /***
         *
         * @return DefaultLocationClientOption  默认O设置
         */
        public LocationClientOption getDefaultLocationClientOption() {
            if (mOption == null) {
                mOption = new LocationClientOption();
    
                mOption.setAddrType("all");
                mOption.setLocationMode(LocationMode.Hight_Accuracy); // 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
                mOption.setCoorType( "bd09ll" ); // 可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
                mOption.setScanSpan(3000); // 可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
                mOption.setIsNeedAddress(true); // 可选,设置是否需要地址信息,默认不需要
                mOption.setIsNeedLocationDescribe(true); // 可选,设置是否需要地址描述
                mOption.setNeedDeviceDirect(true); // 可选,设置是否需要设备方向结果
                mOption.setLocationNotify(true); // 可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
                mOption.setIgnoreKillProcess(true); // 可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop
                mOption.setIsNeedLocationDescribe(true); // 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation
                mOption.setIsNeedLocationPoiList(true); // 可选,默认false,设置是否需要POI结果,可以在BDLocation
                mOption.SetIgnoreCacheException(true); // 可选,默认false,设置是否收集CRASH信息,默认收集
                mOption.setOpenGps(true); // 可选,默认false,设置是否开启Gps定位
                mOption.setIsNeedAltitude(true); // 可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用
            }
            return mOption;
        }
    
    
        /**
         * @return DIYOption 自定义Option设置
         */
        public LocationClientOption getOption() {
            if (DIYoption == null) {
                DIYoption = new LocationClientOption();
            }
            return DIYoption;
        }
    
        public void start() {
            synchronized (objLock) {
                if (client != null && !client.isStarted()) {
                    client.start();
                }
            }
        }
    
        public void requestLocation() {
            if (client != null) {
                client.requestLocation();
            }
        }
    
        public void stop() {
            synchronized (objLock) {
                if (client != null && client.isStarted()) {
                    client.stop();
                }
            }
        }
    
        public boolean isStart() {
            return client.isStarted();
        }
    
        public boolean requestHotSpotState() {
            return client.requestHotSpotState();
        }
    }
    复制代码
    复制代码
    package com.example.tiwen;
    
    import android.Manifest;
    import android.annotation.TargetApi;
    import android.content.pm.PackageManager;
    import android.os.Build;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import com.baidu.location.BDAbstractLocationListener;
    import com.baidu.location.BDLocation;
    import com.baidu.location.Poi;
    
    import org.litepal.LitePal;
    
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    
    public class FirstActivity extends AppCompatActivity {
    
        private final int SDK_PERMISSION_REQUEST = 127;
        private String permissionInfo;
        private LocationService locationService;
        private TextView address_text;
        private CheckBox cb1,cb2,cb3,cb4;
        private EditText etName,etDate,etId,etTiwen,etClass1,etCb2;
        String Address,name,date,tiwen,ID1,class1,cbb1,cbb2,cbb3,cbb4,s1,ot2,date1;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.first_layout);
            etName = (EditText) findViewById(R.id.name_edit_text);
            etDate = (EditText) findViewById(R.id.date_edit_text);
            etDate.setText(getDate());
            etId = (EditText) findViewById(R.id.ID_edit_text);
            etClass1=(EditText) findViewById(R.id.class1_edit_text);
            etTiwen = (EditText) findViewById(R.id.tiwen_edit_text);
            LitePal.getDatabase();
            List<Judge> judge= LitePal.findAll(Judge.class);
            for(Judge j:judge){
                name=j.getName();
                ID1=j.getID1();
                class1=j.getClass1();
            }
            etName.setText(name);
            etId.setText(ID1);
            etClass1.setText(class1);
            address_text=(TextView) findViewById(R.id.address_text);
            //startLocation = (Button) findViewById(R.id.button_2);
            cb1 = (CheckBox)findViewById(R.id.ot1);
            cb2 = (CheckBox)findViewById(R.id.ot2);
            cb3 = (CheckBox)findViewById(R.id.ot3);
            cb4 = (CheckBox)findViewById(R.id.ot4);
    
            getPersimmions();
    
    
            Button button1=(Button)findViewById(R.id.button_1);
            button1.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    cbb1=cb1.getText().toString().trim();
                    cbb2=cb2.getText().toString().trim();
                    cbb3=cb3.getText().toString().trim();
                    cbb4=cb4.getText().toString().trim();
                    StringBuffer sb1 = new StringBuffer(256);
                    if(cb1.isChecked()){
                        cb2.setChecked(false);
                        cb3.setChecked(false);
                        cb4.setChecked(false);
                        sb1.append(cbb1);
                    }
                    if(cb2.isChecked()){
                        sb1.append(cbb2);
                        etCb2=(EditText) findViewById(R.id.ot2_1);
                        ot2=etCb2.getText().toString().trim();
                        sb1.append("    备注:"+ot2);
                    }
                    if(cb3.isChecked()){
                        sb1.append(cbb3);
                    }
                    if(cb4.isChecked()){
                        sb1.append(cbb4);
                    }
                        s1 = sb1.toString().trim();
                        name = etName.getText().toString().trim();
                        ID1 = etId.getText().toString().trim();
                        class1 = etClass1.getText().toString().trim();
                        date = etDate.getText().toString().trim();
                        date1 = date.substring(0, 10);
                        tiwen = etTiwen.getText().toString().trim();
                        List<TiWen> tiwen1 = (List<TiWen>) LitePal.where("ID1 = ? and date1 = ?", ID1, date1).find(TiWen.class);
                        if (null != tiwen1 && tiwen1.size() != 0) {
                            Toast.makeText(FirstActivity.this, "已提交", Toast.LENGTH_SHORT).show();
                        } else {
                            TiWen t = new TiWen();
                            t.setName(name);
                            t.setID1(ID1);
                            t.setClass1(class1);
                            t.setDate(date);
                            t.setAddress(Address);
                            t.setTiwen(tiwen);
                            t.setS(s1);
                            t.setDate1(date1);
                            t.save();
    
                            if (t.save()) {
                                Toast.makeText(FirstActivity.this, "提交成功", Toast.LENGTH_SHORT).show();
                            } else {
                                Toast.makeText(FirstActivity.this, "提交失败", Toast.LENGTH_SHORT).show();
                            }
                        }
    
                    }
    
            });
        }
        @TargetApi(23)
        private void getPersimmions() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                ArrayList<String> permissions = new ArrayList<String>();
                /***
                 * 定位权限为必须权限,用户如果禁止,则每次进入都会申请
                 */
                // 定位精确位置
                if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
                }
                if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
                }
                /*
                 * 读写权限和电话状态权限非必要权限(建议授予)只会申请一次,用户同意或者禁止,只会弹一次
                 */
                // 读写权限
                if (addPermission(permissions, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    permissionInfo += "Manifest.permission.WRITE_EXTERNAL_STORAGE Deny 
    ";
                }
                if (permissions.size() > 0) {
                    requestPermissions(permissions.toArray(new String[permissions.size()]), SDK_PERMISSION_REQUEST);
                }
            }
        }
    
        @TargetApi(23)
        private boolean addPermission(ArrayList<String> permissionsList, String permission) {
            // 如果应用没有获得对应权限,则添加到列表中,准备批量申请
            if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                if (shouldShowRequestPermissionRationale(permission)) {
                    return true;
                } else {
                    permissionsList.add(permission);
                    return false;
                }
            } else {
                return true;
            }
        }
    
        @TargetApi(23)
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            // TODO Auto-generated method stub
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    
    
            /***
             * Stop location service
             */
            @Override
            protected void onStop() {
                // TODO Auto-generated method stub
                locationService.unregisterListener(mListener); //注销掉监听
                locationService.stop(); //停止定位服务
                super.onStop();
            }
    
            @Override
            protected void onStart() {
                // TODO Auto-generated method stub
                super.onStart();
                // -----------location config ------------
                locationService = ((LocationApplication) getApplication()).locationService;
                //获取locationservice实例,建议应用中只初始化1个location实例,然后使用,可以参考其他示例的activity,都是通过此种方式获取locationservice实例的
                locationService.registerListener(mListener);
                //注册监听
                int type = getIntent().getIntExtra("from", 0);
                if (type == 0) {
                    locationService.setLocationOption(locationService.getDefaultLocationClientOption());
                } else if (type == 1) {
                    locationService.start();
                }
                //startLocation.setOnClickListener(new View.OnClickListener() {
    
                   // @Override
                    //public void onClick(View v) {
                        //if (startLocation.getText().toString().equals("获取定位")) {
                    locationService.start();// 定位SDK
    
                            // start之后会默认发起一次定位请求,开发者无须判断isstart并主动调用request
                            //startLocation.setText("停止定位");
                        //} else {
                    locationService.stop();
                        //   startLocation.setText("获取定位");
                       // }
                    //}
                //});
            }
    
        private BDAbstractLocationListener mListener = new BDAbstractLocationListener() {
    
            /**
             * 定位请求回调函数
             *
             * @param location 定位结果
             */
            @Override
            public void onReceiveLocation(BDLocation location) {
    
                // TODO Auto-generated method stub
                if (null != location && location.getLocType() != BDLocation.TypeServerError) {
    
                    StringBuffer sb = new StringBuffer(256);
    
                    sb.append(location.getAddrStr());
                    sb.append(location.getStreetNumber());
                    if (location.getPoiList() != null && !location.getPoiList().isEmpty()) {
                           Poi poi = (Poi) location.getPoiList().get(0);
                            sb.append(poi.getName());
                    }
                    Address=sb.toString().trim();
                    address_text.setText(Address);
                    //Address=location.getAddrStr();
    
                    if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
                        Toast.makeText(FirstActivity.this, "GPS定位成功", Toast.LENGTH_SHORT).show();
                        locationService.stop();
                    } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
                        // 运营商信息
                        Toast.makeText(FirstActivity.this, "网络定位成功", Toast.LENGTH_SHORT).show();
                        locationService.stop();
                    } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
                        Toast.makeText(FirstActivity.this, "离线定位成功,离线定位结果也是有效的", Toast.LENGTH_SHORT).show();
                        locationService.stop();
                    } else if (location.getLocType() == BDLocation.TypeServerError) {
                        Toast.makeText(FirstActivity.this, "服务端网络定位失败", Toast.LENGTH_SHORT).show();
                        //sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
                    } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
                        Toast.makeText(FirstActivity.this, "网络不通导致定位失败,请检查网络是否通畅", Toast.LENGTH_SHORT).show();
                    } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
                        Toast.makeText(FirstActivity.this, "无法获取有效定位依据导致定位失败,可以重启手机", Toast.LENGTH_SHORT).show();
                        //sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
                    }
                }
            }
        };
    
            private String getDate() {
                SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");
                return date_format.format(new Date());
             }
            private String getDate1() {
                SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd");
                return date_format.format(new Date());
             }
    
            //private String getTime() {
               // SimpleDateFormat time_format = new SimpleDateFormat("HH:mm:ss");
                //return time_format.format(new Date());
           // }
    }
    复制代码

    此外,连接数据库用到的方法是LitePal

    二、遇到的问题

        在进行百度定位的时候,开始一直定位失败,显示null,null,在经过网上查阅相关资料,是因为少了关于申请权限的相关代码

    三、明日计划

        明天对体温上报软件进行总结汇总

  • 相关阅读:
    HDU2438:Turn the corner(三分)
    XTU1267:Highway(LCA+树的直径)
    HDU6024:Building Shops(DP)
    “玲珑杯”ACM比赛 Round #13 B -- 我也不是B(二分排序)
    XTU1266:Parentheses(贪心+优先队列)
    Educational Codeforces Round 21 D
    Educational Codeforces Round 21E selling souvenirs (dp)
    EOJ3247:铁路修复计划
    关于工厂模式的 个人理解
    设计模式之 工厂方法
  • 原文地址:https://www.cnblogs.com/zyljal/p/14902797.html
Copyright © 2011-2022 走看看