我正在开发一个通过蓝牙OPP获取命令的androd bluetooth telnet(?)服务器。我的计划是监控传入的Opp推送,检查是否来自某个用户,然后启动实际执行给定工作的工作服务。
所以我研究了接收蓝牙传入OPP的信息,我发现杀死BluetoothOppService 是这个SO thread的关键点。 所以我写了下面的代码来接受传入的OPP推送。
private void KillOriginalService()
{
java.lang.Process suProcess=null;
int pid;
try
{
String[] command = {
"/system/bin/sh",
"-c",
"ps|grep com.android.bl"
};
suProcess = Runtime.getRuntime().exec(command);
DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
DataInputStream osRes = new DataInputStream(suProcess.getInputStream());
if (null != os && null != osRes)
{
String line;
while (osRes.available() > 0)
{
line = osRes.readLine();
if (line.contains("1002"))
{
String[] words=line.split(" ");
//pid=Integer.parseInt(words[0]);
final String p=words[0];
new ExecuteAsRootBase(){
@Override
protected ArrayList<String> getCommandsToExecute()
{
// TODO: Implement this method
ArrayList<String> list=new ArrayList<String>();
list.add("system/bin/kill -9 " + p);
return list;
}
}.execute();
Log.v(TAG,"Success kill");
return;
}
}
}
}
catch (IOException e)
{
Log.e(TAG, "error occured trying to kill opp service ",e);
}
}
以下代码获取ServerSocket。
private void getServerSocket()
{
boolean fail = true;
while (fail)
{
try
{
serversocket = null;
Log.v(TAG, "trying to get serverSocket");
serversocket = mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("OPP Listener", UUID.fromString("00001105-0000-1000-8000-00805f9b34fb"));
if(serversocket!=null)
fail = false;
}
catch (IOException e)
{
fail = true;
Log.e(TAG, "Failed to get serversocket " , e);
}
if (fail)
{
KillOriginalService();
}
}
//return serversocket;
}
此代码有效,但有时不断忽略进行连接,直到我手动重启我的服务,导致原始服务接受连接,拒绝它(因为传入file的mime类型为null)。此外,原始服务获得完整的唤醒锁,显着消耗我的设备的电池。即使我的接受连接,在我接受连接而不是原始服务之前,我必须失败大约2次。
我读了logcat输出,发现原来的BtOppService在我杀了它后打印OnStartCommand
logcat。
我通过Administration screenoff api解决了电池消耗问题。但第一个问题没有解决。 如何才能使我的服务(而非原始服务)接收每个传入连接?
(我目前正在通过使用自动重启我的服务的监视程序线程解决此问题。)
P.S。我有一个root设备,su工作正常。
答案 0 :(得分:0)
我终于找到了一种以编程方式停止系统服务的方法:挂钩系统服务!
当我拥有根设备时,可以安装XPosed Framework和模块。我可以创建一个连接到目标服务的模块,然后不返回START_STICKY
可以阻止其重新启动。
但是,事实证明这是一个XY问题。最后,我改变了主意,不再杀死系统服务,而是继续使用它。
我创建了一个文件观察器,以检查系统是否已收到文件。收到文件后,它将启动相应的服务。
它与Auto-Accept产生协同效应,使手机能够接受每个蓝牙OPP文件传输请求 ,而无需询问用户(无提示!)。