Android之蓝牙基本使用和用户定位基本使用

Android之蓝牙基本使用和用户定位基本使用

什么是蓝牙
  • Bluetooth是目前使用最广泛的无线通讯协议;
  • 主要针对短距离设备的通讯
  • 常用语 连接耳机】鼠标和移动通讯设备
与蓝牙相关的API

1、BluetoothAdapter:该类对象代表了本地的蓝牙适配器;

2、BluetoothDevice:代表了一个远程的Bluetooth设备;

扫描已配对的设备

  • 先添加权限:
 

1、获得BluetoothAdapter对象

2、判断当前设备中是否拥有蓝牙设备;

3、判断当前设备中的蓝牙是否已经打开;

4、得到所有已经配对的蓝牙设备对象

 /**
 * 扫描手机配对的蓝牙设备
 */
 private void scanBluetoothMethod() {
    BluetoothAdapter defaultAdapter = BluetoothAdapter.getDefaultAdapter();
    if (defaultAdapter!=null){
        Log.i(TAG,"---有蓝牙设备");
        if (!defaultAdapter.isEnabled()){
            Intent intent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivity(intent);
        }
        Set bondedDevices = defaultAdapter.getBondedDevices();
        Log.i(TAG,"---有蓝牙设备数量---"+bondedDevices.size());
        if (bondedDevices.size()>0){
            Log.i(TAG,"---有蓝牙设备数量---"+bondedDevices.size());
            for (Iterator iterator=bondedDevices.iterator();iterator.hasNext();){

                BluetoothDevice devices = (BluetoothDevice) iterator.next();
                String address = devices.getAddress();
                Log.i(TAG, "---scanBluetoothMethod: "+address);

            }
        }
    }else{
        Log.i(TAG,"---没有蓝牙设备");
    }


}
想对蓝牙设备进行管理

需要添加权限

  
设置蓝牙可见性
  /**
 * 该监听器用于修改蓝牙设备可见性
 */
  private class  DiscoverButtonListener implements View.OnClickListener{
    @Override
    public void onClick(View v) {
        //创建一个Intent对象,并将其action的值设置为BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE
        Intent discoverableIntent=new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        //将一个键值对存放到Intent对象当中,主要用于指定可见状态的是时间
        discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,500);
        startActivity(discoverableIntent);
    }
}

扫描周围的蓝牙设备,并获取设备地址

1、获取蓝牙适配器,扫描周围蓝牙设备
BluetoothAdapter defaultAdapter = BluetoothAdapter.getDefaultAdapter();

defaultAdapter.startDiscovery();//扫描到蓝牙设备就会发送一个广播
2、创建一个广播接收器
 private class BluetoothReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        String action =intent.getAction();
        Log.i(TAG, "-----onReceive: ");
        if (BluetoothDevice.ACTION_FOUND.equals(action)){
            //可以从收到的intent对象中,将代表远程蓝牙适配器的对象中取出
            BluetoothDevice devive=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            Log.i(TAG, "-----onReceive: "+devive.getAddress());
        }
    }
}
3、在主代码中注册广播接收器
   /**
     * 创建一个IntentFilter对象,将其action指定为Bluetooth
     *
     */
    IntentFilter filter=new IntentFilter(BluetoothDevice.ACTION_FOUND);
    receiver = new BluetoothReceiver();
    //注册广播接收者
    registerReceiver(receiver,filter);

用户定位 UserLocation的关键API

1、LocationManager:用于管理Android的用户定位服务;

2、LocationProviders:提供多种定位方式供开发者选择;

定位方式的分类

1、GPS定位

使用GPS卫星进行定位,需要在AndroidManifest.xml当中声明如下权限:


2、NETWORK定位:

使用信号接收塔和WI-Fi介入点进行定位,需要在AndroidManifest.xml当中声明如下权限:

 


获取用户的当前位置

1、在AndroidManifest.xml当中声明相应的权限;

  
  

2、获取LocationManager对象

 LocationManager locaionManager = (LocationManager) MainActivity.this.getSystemService(Context.LOCATION_SERVICE);

3、选择LocationProvider;

 if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
 
  return;
 }

  //定义当前服务的方式,最小时间和最小距离
  locaionManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new TestLocationListener());

4、绑定LocationListener对象;

private class TestLocationListener implements LocationListener{

    @Override
    public void onLocationChanged(Location location) {

        double longitude = location.getLongitude();//经度
        double altitude = location.getLatitude();//维度
        Log.i(TAG, "---onLocationChanged: "+longitude+"---"+altitude);

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }

获取设备所有的providers

private class ProviderSButtonListener implements View.OnClickListener{

    @Override
    public void onClick(View v) {
        List providers=locaionManager.getAllProviders();
        for(Iterator iterator=providers.iterator();iterator.hasNext();){
            String provider= (String) iterator.next();
            Log.i(TAG, "----onClick: "+provider);
            
        }
    }
}

获取最佳的Location Provider

 private  class BestProviderButtonListener implements View.OnClickListener{

    @Override
    public void onClick(View v) {
        //生成一个Criteria对象
        Criteria criteria=new Criteria();
        //设置查询条件
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setPowerRequirement(criteria.POWER_LOW);
        criteria.setAltitudeRequired(false);
        criteria.setSpeedRequired(false);
        criteria.setCostAllowed(false);
        String bestProvider = locaionManager.getBestProvider(criteria, false);

        Log.i(TAG, "onClick: "+bestProvider);

    }
}

追踪用户的位置

什么是Geocoding?

Geocoding是Google所提供的一项服务,主要是以下两个方面的功能:

1、查询某地址的经纬度;

2、查询某经纬度的具体地址;

如何使用Geocoding

1、创建一个GeoCoder对象;

2、调用该对象的getFromLocation()或者是getFromLocationName()方法;

  /**
 * 根据经纬度查询地址
 */
private class ReverseGeocodeTask extends AsyncTask{
    @Override
    protected Integer doInBackground(Integer... params) {

        Geocoder geocoder=new Geocoder(MainActivity.this, Locale.US);
        try {
            List
location = geocoder.getFromLocation(40.714224, -73.961452, 1); for (Iterator iterator=location.iterator();iterator.hasNext();){ Address address = (Address) iterator.next(); Log.i(TAG, "---address: "+address); } } catch (IOException e) { e.printStackTrace(); } return null; } } /** * 根据地质查询经纬度 * */ private class GeocodingTask extends AsyncTask{ @Override protected Integer doInBackground(Integer... params) { Geocoder geocoder=new Geocoder(MainActivity.this); try { List
addresses = geocoder.getFromLocationName("SFO", 1); Log.i(TAG, "--doInBackground: "+addresses.size()); } catch (IOException e) { e.printStackTrace(); } return null; } }

Geocoder的替代品

常见的查询参数作用

1、address:需要查询的地址
latlng:需要查询的经纬度

2、bounds:设定查询的边界

3、region:设定查询的国家代码

4、language:设定查询结果的语言

5、sensor:标示该请求是否来源于一个设备的传感器

Geocoding的替博安排 可以直接使用Http获取数据

 /**
  * 根据地址查询经纬度:http://maps.googleapis.com/maps/api/geocode/json?address=SFO&sensor=false
 *
 * 根据经纬度查询地址:http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-71.961453&sensor=false
 *
 * 根据经纬度的区间来查询:
 *  http://maps.googleapis.com/maps/api/geocode/json?address=Winnetka&sensor=false
 *  http://maps.googleapis.com/maps/api/geocode/json?address=Winnetka&bounds=34.172684,-118.604794|34.236144,-118.500938&sensor=false
 *
 *  region的作用:根据国家中记录的区域代码来查询
 *  http://maps.googleapis.com/maps/api/geocode/json?address=Toledo&sensor=false
 *  http://maps.googleapis.com/maps/api/geocode/json?address=Toledo&sensor=false®ion=es
 *
 */

你可能感兴趣的:(Android之蓝牙基本使用和用户定位基本使用)