眼下小弟正做一个蓝牙的程序 需要把设备一直置为可发现状态 但android最大只能维持300秒 每5分钟弹出一次确认dialog很烦人
 妄图直接用反射调用BluetoothAdapter::setScanMode 可是没有root权限 只能放弃  眼下就想从这个弹出的dialog下手 看了下源代码 发现此dialog是com.android.settings.bluetooth.RequestPermissionActivity生成的 也就是说蓝牙可发现状态的用户确认dialog实际上是个activity 
 于是当弹出确认dialog时 尝试取得屏幕上的top activity引用 并用反射调用它的RequestPermissionActivity::proceedAndFinish方法 让这个dialog以为被用户点击了OK按钮 从而可以让300秒的可发现状态持续下去
 
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
RunningTaskInfo info = am.getRunningTasks(1).get(0);
ComponentName cn = info.topActivity; 
用上面方法只拿到了ComponentName 却不知如何取得此activity的引用 望高人指教~~
另 关于android下蓝牙的可发现时间限制 大家有什么好办法绕过它么 让它可以一直处于可发现状态

解决方案 »

  1.   

    拿到root权限就可以解决你的问题么
      

  2.   


    说来惭愧 小弟属于不求甚解型的 呵呵  
    粗看了android的源代码 发现 android.bluetooth.BluetoothAdapter::setScanMode(int mode, int duration)是调用了android.server.BluetoothService::setScanMode(int mode, int duration)方法 此方法里一进去就检查android.Manifest.permission.WRITE_SECURE_SETTINGS这个权限 查了一下 这个权限普通的app是没法拿到的 我想应该是和settings一样这种内建的app一样的比较高级别的角色吧 不一定是root~~ 查了一下网上介绍的共享签名的方法 貌似不具有普适性啊 所以就想找在普通app能掌握的资源范围内的解决方法