我正试图找到一种让平板电脑基本上自动接受/允许接受从笔记本电脑传输到我的Nexus Android设备的传入蓝牙共享文件的方法。由于Android蓝牙系统本身不支持此功能,我想知道是否可以使用支持通知的Android应用程序以编程方式完成此操作。
答案 0 :(得分:2)
更轻松的方式
如果您拥有root设备并使用XPosed Framework,那么您的目标就可以轻松实现。
你无需实施自己的蓝牙服务器,也无需杀死原来的BT服务,这非常麻烦!!!
试试这段代码。
import android.util.*;
import de.robv.android.xposed.*;
import de.robv.android.xposed.callbacks.XC_LoadPackage.*;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class Tutorial implements IXposedHookLoadPackage
{
private String TAG="TUTORIAL";
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.equals("com.android.bluetooth"))
{
Log.i(TAG,"Not: "+lpparam.packageName);
return;
}
Log.i(TAG,"Yes "+lpparam.packageName);
findAndHookMethod("com.android.bluetooth.opp.BluetoothOppManager", lpparam.classLoader, "isWhitelisted", String.class,new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
Log.v(TAG,"HOOK DONE");
param.setResult(true); /* you can compare the sender address(String) with your computer and determine if you return true or just allow the original method to be called after this returns.*/
}
});
}
}
我测试过,工作正常:)
<强>链接强>
Dropbox link of the auto accepting app
Dropbox link of the project files (zip)
Towelroot site to root your phone
背景(原始答案)
正如我在上面评论过的那样,你可以尝试使用此代码阻止(虽然没有收到)。
import android.util.*;
import de.robv.android.xposed.*;
import de.robv.android.xposed.callbacks.XC_LoadPackage.*;
import java.io.*;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class Tutorial implements IXposedHookLoadPackage
{
private String TAG="TUTORIAL";
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.equals("com.android.bluetooth"))
{
Log.i(TAG,"Not: "+lpparam.packageName);
return;
}
Log.i(TAG,"Yes "+lpparam.packageName);
findAndHookMethod("com.android.bluetooth.opp.BluetoothOppService", lpparam.classLoader, "startSocketListener", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
Log.v(TAG,"HOOK DONE");
param.setResult(null);
}
});
}
}
上面的代码挂钩了startListenerSocket()
的{{1}}方法,并阻止了行com.android.bluetooth.BluetoothOppService
请参阅here查看param.setResult(null);
的完整代码,您将了解操作。
您可以从中开始的代码如下所示。
com.android.bluetooth.BluetoothOppService.java
此代码挂钩了import android.util.*;
import de.robv.android.xposed.*;
import de.robv.android.xposed.callbacks.XC_LoadPackage.*;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class Tutorial implements IXposedHookLoadPackage
{
private String TAG="TUTORIAL";
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.equals("com.android.bluetooth"))
{
Log.i(TAG,"Not: "+lpparam.packageName);
return;
}
Log.i(TAG,"Yes "+lpparam.packageName);
findAndHookMethod("com.android.bluetooth.opp.BluetoothOppObexServerSession", lpparam.classLoader, "onPut", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
Log.v(TAG,"HOOK DONE");
Class c=param.thisObject.getClass();
}
});
}
}
链接here的onPut
方法。我要么是xposed框架的新手,但我希望我的答案有所帮助。
我遇到了您提出的相同问题,并通过实施我的自定义OBEX服务器并手动/以编程方式(使用com.android.bluetooth. BluetoothOppObexServerSession
和ps|grep
)杀死本机BluetoothOppService来解决问题。但我会尝试挂钩并直接执行我的代码。
为了帮助您自定义OBEX服务器会话,我在下面发布了我的实现。
su kill pid
我刚删除了原始代码中的一些拒绝代码。
另外,请查看我的完整代码,请参阅my git repository。
我也感谢android项目的贡献者!