Bluetooth サービスを閉じようとしていますが、Bluecove には Connection close メソッド ( https://code.google.com/p/bluecove/issues/detail?id=90 ) にバグがあり、再起動するための回避策を実行しようとしています。サービス。Bluetoothスタックを再起動すると問題が解決すると思います。プログラムでそれを行うことはできますか?私はマイクロソフトのBluetoothスタックを使用しています。
1 に答える
5
この方法で問題が解決しました。
アプリケーションを再起動しますが、最初に bluecove を手動でシャットダウンします。
BlueCoveImpl.shutdown();
アプリケーションを再起動するだけでは、bluecove はシャットダウンしますが、起動時に Bluetooth スタックを初期化できません。再起動方法は次のとおりです。
public static void restartApplication(Runnable runBeforeRestart)
throws IOException
{
try
{
// java binary
String java = System.getProperty("java.home") + "/bin/java";
// vm arguments
List<String> vmArguments = ManagementFactory.getRuntimeMXBean()
.getInputArguments();
StringBuffer vmArgsOneLine = new StringBuffer();
for (String arg : vmArguments)
{
// if it's the agent argument : we ignore it otherwise the
// address of the old application and the new one will be in
// conflict
if (!arg.contains("-agentlib"))
{
vmArgsOneLine.append(arg);
vmArgsOneLine.append(" ");
}
}
// init the command to execute, add the vm args
final StringBuffer cmd = new StringBuffer("\"" + java + "\" "
+ vmArgsOneLine);
// program main and program arguments
String[] mainCommand = System.getProperty(SUN_JAVA_COMMAND).split(
" ");
// program main is a jar
if (mainCommand[0].endsWith(".jar"))
{
// if it's a jar, add -jar mainJar
cmd.append("-jar " + new File(mainCommand[0]).getPath());
}
else
{
// else it's a .class, add the classpath and mainClass
cmd.append("-cp \"" + System.getProperty("java.class.path")
+ "\" " + mainCommand[0]);
}
// finally add program arguments
for (int i = 1; i < mainCommand.length; i++)
{
cmd.append(" ");
cmd.append(mainCommand[i]);
}
// execute the command in a shutdown hook, to be sure that all the
// resources have been disposed before restarting the application
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run()
{
try
{
Runtime.getRuntime().exec(cmd.toString());
}
catch (IOException e)
{
e.printStackTrace();
}
}
});
// execute some custom code before restarting
if (runBeforeRestart != null)
{
runBeforeRestart.run();
}
// at first shut down BlueCove manually
BlueCoveImpl.shutdown();
System.exit(0);
}
catch (Exception e)
{
// something went wrong
throw new IOException(
"Error while trying to restart the application", e);
}
}
于 2013-05-05T13:15:12.177 に答える