以编程方式自动接受传入的蓝牙文件

时间:2018-03-20 08:20:05

标签: android bluetooth permissions

我正试图找到一种让平板电脑基本上自动接受/允许接受从笔记本电脑传输到我的Nexus Android设备的传入蓝牙共享文件的方法。由于Android蓝牙系统本身不支持此功能,我想知道是否可以使用支持通知的Android应用程序以编程方式完成此操作。

1 个答案:

答案 0 :(得分:2)

更轻松的方式

如果您拥有root设备并使用XPosed Framework,那么您的目标就可以轻松实现

无需实施自己的蓝牙服务器,也无需杀死原来的BT服务,这非常麻烦!!!

xposed tutorial link

试试这段代码。

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)

Xposed apk site

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(); } }); } } 链接hereonPut方法。我要么是xposed框架的新手,但我希望我的答案有所帮助。

我遇到了您提出的相同问题,并通过实施我的自定义OBEX服务器并手动/以编程方式(使用com.android.bluetooth. BluetoothOppObexServerSessionps|grep)杀死本机BluetoothOppService来解决问题。但我会尝试挂钩并直接执行我的代码。

为了帮助您自定义OBEX服务器会话,我在下面发布了我的实现。

su kill pid

我刚删除了原始代码中的一些拒绝代码。

另外,请查看我的完整代码,请参阅my git repository

我也感谢android项目的贡献者!