我在Nexus 7上使用Android 4.4.2.我有一个蓝牙低功耗外设,其服务在重新启动时会发生变化.Android应用程序调用BluetoothGatt.discoverServices().然而,Android只查询外围设备一次以发现服务,后续调用discoverServices()会导致第一次调用的缓存数据,甚至断开连接之间.如果我禁用/启用Android bt适配器,则discoverServices()通过查询外设来刷新缓存.有没有一种程序化的方法来强制Android刷新其'ble服务缓存而不禁用/启用适配器?
我试图以编程方式截取Android屏幕截图.我做了以下代码:
private void getsnap(){
try{
Process sh = Runtime.getRuntime().exec("su", null, null);
OutputStream os = sh.getOutputStream();
String filePath = this.getFilesDir().getPath().toString() + "/fileName1.jpeg";
os.write(("/system/bin/screencap -p " + filePath).getBytes("ASCII"));
os.flush();
os.close();
sh.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
java.io.IOException: write failed: EPIPE (Broken pipe)
请有人帮忙吗?我已经检查过其他帖子,但我找不到解决问题的方法.
编辑:
请注意,错误发生在行中os.write().
我在开发 WPF 应用程序时遇到了一个问题。该应用程序基于棱镜。应用程序使用棱镜引导程序启动,在加载任何窗口之前,应用程序在不同的线程 (STA) 上打开一个模态对话框,然后加载一堆东西(服务等)。该对话框在此期间打开并允许通知用户应用程序启动过程的进度(使用事件聚合器传递更新)。加载完成后,引导程序关闭对话框并打开主应用程序窗口。 到现在为止还挺好... 然后在关闭应用程序时,同样的事情正在发生。关闭主窗口,打开一个对话框(再次在新的 STA 线程上),以允许通知。但是现在,当点击 ShowDialog 调用(发生在新的 STA 线程内)时,会引发异常:“不能使用属于与其父 Freezable 不同的线程的 DependencyObject”。经过长时间的调试,我发现异常的原因是窗口的背景,它是从应用程序级别的合并字典中获取的画笔/图像(在 wpf UI 线程上实例化)。如果在没有 ResouceDictionary 的情况下加载图像 - 一切顺利。
总结: 只有在使用 resourceDictionary 并且仅在第二次调用新的 STA 线程时才会观察到异常,该线程又会加载一个 DialogBox 并在调用 ShowDialog 时准确地引发异常 如果您只有一个对话框(例如在开机时且仅在关机过程中对话),则不会发生异常。
我的问题是:这是什么原因?在这种情况下,这个异常究竟意味着什么?(我知道一般来说,其他线程会有某种 UI 线程更新,但是我不明白为什么这只发生在拨号+线程的第二个实例上)。
谢谢 :)