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
*
*/