• android中通过代码来设置蓝牙永久可见性


    废话不多说,直接阐述:

      前段时间在搞一个android项目,其中有一个功能要求需要蓝牙可见性永久打开,但是开发过android蓝牙的程序员应该都知道,goole提供的api中没有设置蓝牙永久可见性的接口,但是在实际的项目中的确需要用到这个功能,所以这就难为到楼主了,楼主开始百度各种资料,查阅api,然后找到下边一种可以设置蓝牙可见性时间的函数:

    Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    discoveryIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);
    startActivity(discoveryIntent);

    这个可以在android api中查询到,里边是这样描述这个接口的:

    意思大约则是这个常量作用是可以打开蓝牙,并且设置可见模式,默认的为了保护隐私,设置为不可见的,但是可以在intent中传入字段EXTRA_DISCOVERABLE_DURATION来请求可发现的持续时间。目前,默认持续时间为120秒,每个请求的最长持续时间为300秒。因此,这个方法最多一次只能显示300秒,如果想要永久打开可见性,可以开一个线程,然后每300秒后执行下上述的代码,但是执行这块代码的同时,会在app中向用户显示打开蓝牙可见性,这样的话用户体验则较差,那有没有其他的办法呢?在后台默默的打开,然后永久可见。答案当然是有的,这时候我们就要去看下BluetoothAdapter的源代码了。

       在源代码中,我们可以看到有这样一个函数:

      这个函数的功能就是设置蓝牙可见性持续的时间。    

      但是这个函数会发现在api文档中找不到,原因是goole将其隐藏掉了,但是这个函数仍然是可以调用的,调用的方式可能和普通的不一样,不能够直接调用,需要使用java的反射机制,二话不说上代码:

                //声明一个class类
           Class serviceManager = null; try {
             //得到这个class的类 serviceManager
    = Class.forName("android.bluetooth.BluetoothAdapter"); } catch (ClassNotFoundException e) { e.printStackTrace(); }        //声明一个方法 Method method = null; try {
             //得到指定的类中的方法 method
    = serviceManager.getMethod("setDiscoverableTimeout", String.class); } catch (NoSuchMethodException e) { e.printStackTrace(); } try {
             //调用这个方法 method.invoke(serviceManager.newInstance(),
    30);//根据测试,发现这一函数的参数无论传递什么值,都是永久可见的 } catch (Exception e) { e.printStackTrace(); }
  • 相关阅读:
    03-字典
    02-列表
    01-字符串操作
    Django中的跨域问题
    Codeforces Round #617 (Div. 3) A
    Codeforces Round #717 (Div. 2) A
    如何在Vuespa中使用less
    excle导出
    ajaxFileUpload上传文件
    图片插入word
  • 原文地址:https://www.cnblogs.com/cmai/p/7259165.html
Copyright © 2020-2023  润新知