2017-05-16 15:02:16 androidfszl 阅读数 5749
  • Android 高级专题

    本课程包含23章,共计95个小节课程,内容包括:Android多线程、网络编程、数据解析、数据存储、多媒体、Android 图形图像、Android 动画、GPS 定位、 Android 传感器编程、蓝牙、NDK、消息推送、二维码生成与扫描、分享和第三方登录、Bmob云服务、Afinal框架、 XUtils框架、版本控制、性能测试(听云)、App发布上线、Vitamio 跨平台播放器、EventBus、Android MVP 架构等。

    10604 人正在学习 去看看 郭宏志

1、需要申请如下权限

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

<uses-feature
    android:name="android.hardware.bluetooth_le"
    android:required="true" />



2、申请运行时权限

   /**
     * 检查蓝牙权限
     */
    public void checkBlePermission() {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                    1);
        } else {
            Log.i("tag","已申请权限");
        }
    }
2.1、重写onRequestPermissionsResult,判断用户是否同意

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1: {
                // 如果请求被取消,则结果数组为空。
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.i("tag","同意申请");
                } else {
                    Log.i("tag","拒绝申请");
                }
                return;
            }
        }
    }

3、判断蓝牙是否打开,如果没有打开则打开蓝牙

   /**
     * 判断是否支持蓝牙,并打开蓝牙
     * 获取到BluetoothAdapter之后,还需要判断是否支持蓝牙,以及蓝牙是否打开。
     * 如果没打开,需要让用户打开蓝牙:
     */
    private void checkBleDevice() {
        //首先获取BluetoothManager
        BluetoothManager bluetoothManager =
                (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        //获取BluetoothAdapter
        if (bluetoothManager != null) {
            BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();
            if (mBluetoothAdapter != null) {
                if (!mBluetoothAdapter.isEnabled()) {
                    //调用enable()方法直接打开蓝牙
                    if (!mBluetoothAdapter.enable()){
                        Log.i("tag","蓝牙打开失败");
                    }
                    else{
                        Log.i("tag","蓝牙已打开");
                    }
                    //该方法也可以打开蓝牙,但是会有一个很丑的弹窗,可以自行尝试一下
//                    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
//                    enableBtIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//                    startActivity(enableBtIntent);
                }
            } else {
                Log.i("tag","同意申请");
            }
        }
    }

以上三步基本上就能完成Android6.0之后蓝牙的打开了,需要注意一点的是需要API 18以上,如下

minSdkVersion 18
否则在获取adapter的时候会报错!!!!

如果需要兼容到API 18一下,又不会报错,应该怎么做呢,如果哪位大神看到了,留言指导一下,感谢!

2017-04-26 11:14:39 paul_zzq 阅读数 6656
  • Android 高级专题

    本课程包含23章,共计95个小节课程,内容包括:Android多线程、网络编程、数据解析、数据存储、多媒体、Android 图形图像、Android 动画、GPS 定位、 Android 传感器编程、蓝牙、NDK、消息推送、二维码生成与扫描、分享和第三方登录、Bmob云服务、Afinal框架、 XUtils框架、版本控制、性能测试(听云)、App发布上线、Vitamio 跨平台播放器、EventBus、Android MVP 架构等。

    10604 人正在学习 去看看 郭宏志

#Android6.0的蓝牙权限问题
在Adroid6.0以前,申请权限只需在manifest文件下申请相应的权限即可,但是Android6.0后,像一些危险权限,比如操作SD卡的写入,相机,录音等,是需要在java代码中去申请的。
本篇文章,主要是讲Android6.0系统中扫描蓝牙的权限的申请。
首先,我们需要检查当前手机的系统版本,检查系统版本的原因,显而易见,如果是系统6.0及以上的,需要采用新的授权方法。

if(Build.VERSION.SDK_INT>=23){
    //判断是否有权限
    if (ContextCompat.checkSelfPermission(DeviceListActivity.this,
Manifest.permission.ACCESS_COARSE_LOCATION)!=PackageManager.PERMISSION_GRANTED) {
    //请求权限
 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
REQUEST_ACCESS_COARSE_LOCATION);
//向用户解释,为什么要申请该权限
if(ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_CONTACTS)) {
Toast.makeText(DeviceListActivity.this,"shouldShowRequestPermissionRationale", Toast.LENGTH_SHORT).show();
      }
    }
}

回调方式如下;

@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) {
 // TODO Auto-generated method stub
   if (requestCode == REQUEST_ACCESS_COARSE_LOCATION) {
    if (permissions[0] .equals(Manifest.permission.ACCESS_COARSE_LOCATION)
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户同意使用该权限
        } else {
          // 用户不同意,向用户展示该权限作用
        if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
        Manifest.permission.ACCESS_COARSE_LOCATION)) {
        //showTipDialog("用来扫描附件蓝牙设备的权限,请手动开启!");
                return;
              }
            }
          } 
        }

还有当前activity需要实现OnRequestPermissionsResultCallback接口;
当然也需要在manifest中加上相应的权限申明:

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

Android6.0其他的一些危险权限申请和上面的方式类似。
更多安卓相关信息,请扫码关注微信公众号:lifeAndroid
这里写图片描述

2017-06-24 17:30:56 lhb_11 阅读数 2547
  • Android 高级专题

    本课程包含23章,共计95个小节课程,内容包括:Android多线程、网络编程、数据解析、数据存储、多媒体、Android 图形图像、Android 动画、GPS 定位、 Android 传感器编程、蓝牙、NDK、消息推送、二维码生成与扫描、分享和第三方登录、Bmob云服务、Afinal框架、 XUtils框架、版本控制、性能测试(听云)、App发布上线、Vitamio 跨平台播放器、EventBus、Android MVP 架构等。

    10604 人正在学习 去看看 郭宏志

7种形式的Android Dialog使用举例

Android 6.0 动态权限申请注意事项

Android中蓝牙的基本使用—-BluetoothAdapter类简介

Android:Bluetooth 的打开和关闭

通过查找资料发现原来是在android 6.0之后要用蓝牙还需要添加一个模糊定位的权限android.permission.ACCESS_COARSE_LOCATION(GPS是精确定位);废话不说正文开始:
1、分析问题:

在android 6.0(targetSdkVersion小于23)之前,安装新的app时系统会提示应用将要获取某某权限,如果同意安装,系统会默认为应用授予所申请的所有权限,而不同意的话,就不能安装应用;所以如果你以前的APP设置的targetSdkVersion低于23,在运行时是不会崩溃的。而在android 6.0(targetSdkVersion>=23)之后,我们会直接安装,不过当app需要获取不恰当权限的时候我们再决定是确定还是拒绝。
我是一个习惯更新的人,我的targetSdkVersion现在已升至24,而在android 6.0之后用到蓝牙搜索的时候是需要开启模糊定位权限的,模糊定位是一个危险权限,故需要用到谷歌官方推荐的方法来解决;

2、android 6.0权限分类

android 6.0采用新的权限机制来保护用户的隐私,将权限分为Normal Permissions和Dangerous Permission;

Normal Permissions

Normal Permissions一般不涉及用户隐私,是不需要用户授权的,具体如下:

ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
Dangerous Permissions

Dangerous Permissions涉及到用户隐私,在使用时需要用户实时授权才行;

group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS
3、模仿android官方demo处理蓝牙问题

在manifest文件中添加权限:

在代码中添加首次进入判断:
/*
校验蓝牙权限
*/
private void checkBluetoothPermission() {
if (Build.VERSION.SDK_INT >= 23) {
//校验是否已具有模糊定位权限
if (ContextCompat.checkSelfPermission(TYMposActivity.this,
Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(TYMposActivity.this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
} else {
//具有权限
connectBluetooth();
}
} else {
//系统不高于6.0直接执行
connectBluetooth();
}
}
对返回值进行处理,类似于startActivityForResult方法:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
doNext(requestCode, grantResults);
}
private void doNext(int requestCode, int[] grantResults) {
if (requestCode == MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//同意权限
connectBluetooth();
} else {
// 权限拒绝
// 下面的方法最好写一个跳转,可以直接跳转到权限设置页面,方便用户
denyPermission();
}
}
}
4、机型问题

一般都会在最新升级到6.0的系统出现这些问题,其中MIUI8中的问题还是很多的,有时候请求授权会莫名其妙点击不了授权框;所以每次就只能再去到权限管理页面手动更改;

5、封装推荐

在查找资料时发现其实很早以前都有很多大神处理过类似问题,并且都写有博客和github的公开项目,此处本菜鸟写出也只是简单的笔记和参考;
写的不是很明白,如还有疑问可参考鸿洋大神博客; 。其中包含有鸿洋大神自己的封装还是很方便使用的。

2018-09-04 11:35:30 m0_37796683 阅读数 1180
  • Android 高级专题

    本课程包含23章,共计95个小节课程,内容包括:Android多线程、网络编程、数据解析、数据存储、多媒体、Android 图形图像、Android 动画、GPS 定位、 Android 传感器编程、蓝牙、NDK、消息推送、二维码生成与扫描、分享和第三方登录、Bmob云服务、Afinal框架、 XUtils框架、版本控制、性能测试(听云)、App发布上线、Vitamio 跨平台播放器、EventBus、Android MVP 架构等。

    10604 人正在学习 去看看 郭宏志

在Android 6.0,原来的蓝牙功能,发现扫描蓝牙设备时,无法获取到蓝牙设备;因为在6.0后,蓝牙这块增加一个动态权限;需要在程序中动态申请。

 1.在AndroidManifest里面加上了权限

      1)   在6.0版本前,使用蓝牙功能,只需要配置下面的权限即可:

    <!-- 蓝牙相关 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    

     2)   在6.0及后续版本,使用蓝牙扫描,添加如下的权限,且该权限还需要在使用时动态申请:

    <!-- Android6.0及以上版本 蓝牙扫描才需要-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

2.动态获取权限 

可参考:https://blog.csdn.net/m0_37796683/article/details/83310209

       2.1)声明你要申请的权限

 private String[] permission = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION};

       2.2)判断是否有权限

 List<String> denyPermissions = new ArrayList<>();
       for (String value : permission) {
            if (ContextCompat.checkSelfPermission(this, value) !=PackageManager.PERMISSION_GRANTED) {//判断权限是否已授权
                  //没有权限 就添加
                  denyPermissions.add(value);
          }
      }

      2.3)请求权限

      if (denyPermissions != null && !denyPermissions.isEmpty()) {
          //申请权限授权
          ActivityCompat.requestPermissions(this, denyPermissions.toArray(new String[denyPermissions.size()]), 100);
      } else {
         //已全部授权
         //do something
    }

    2.4)权限申请结果回调

   @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //申请权限成功
                //do something
            } else {
                //权限被拒绝

            }
        }
    }

3.开启位置权限

       安卓从6.0开始,连接BLE设备不仅需要位置权限,还需要打开位置服务,需要把系统位置(Location)打开。

如果没有允许位置权限,需要到设置(应用管理)指定的App手动打开权限。

出于对用户体验性的考虑,可加入检测GPS开关是否打开,以及未打开时提示用户并打开相关页面的操作

 // gps是否可用  
       public static final boolean isGpsEnable(final Context context) {  
           LocationManager locationManager  
                   = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);  
           boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);  
           boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);  
           if (gps || network) {  
               return true;  
           }  
           return false;  
       }  
    //跳转到gps设置页
    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);  
    activity.startActivityForResult(intent,requestCode);  

 

注意:部分机型打开GPS开关才可以搜索到蓝牙设备,如oppo手机。

 

另:目前安卓系统7.1.1版本连接蓝牙尚有问题,基本上连接不上

至此,本文结束!

2017-10-25 00:35:44 Calvin_zhou 阅读数 1465
  • Android 高级专题

    本课程包含23章,共计95个小节课程,内容包括:Android多线程、网络编程、数据解析、数据存储、多媒体、Android 图形图像、Android 动画、GPS 定位、 Android 传感器编程、蓝牙、NDK、消息推送、二维码生成与扫描、分享和第三方登录、Bmob云服务、Afinal框架、 XUtils框架、版本控制、性能测试(听云)、App发布上线、Vitamio 跨平台播放器、EventBus、Android MVP 架构等。

    10604 人正在学习 去看看 郭宏志

上篇介绍了传统蓝牙和低功耗蓝牙及几个常见类

这篇博客简单介绍一个蓝牙开发小实例:打开关闭蓝牙

第一步:声明所需要的权限:

 


 

<uses-permission android:name="android.permission.BLUETOOTH"/> //使用蓝牙所需要的权限 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>// 使用扫描和设置蓝牙的权限(申明这一个权限必须申明上面一个权限)

<uses-feature android:name="android.hardware.location.gps" android:required="true"/>//Android 5.0 之后,需要在manifest 中申明GPS硬件模块功能的使用

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>/在 Android 6.0 及以上,还需要打开位置权限。

第二步:蓝牙初始化

获取BluetoothAdapter对象

这里提供两种方式,第二种用在API18以上,需要更改minSdkVersion

2.1:BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

2.2:

BluetoothManager bluetoothManager= (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);   BluetoothAdapter bluetoothAdapter= bluetoothManager.getAdapter();

第三步:实现开启关闭蓝牙功能

3.1:布局文件很简单,两个垂直的按钮,分别为打开和关闭,点击打开和关闭蓝牙

3.2:点击按钮,实现对应事件

关闭蓝牙事件比较简单,bluetoothAdapter.disable();即可实现

打开蓝牙分为弹出对话框和不弹出对话框

4.结果测试:比较简单,就不上图了,见源码

 

蓝牙Android

阅读数 288

Android蓝牙开发

阅读数 144

没有更多推荐了,返回首页