以编程方式自动接受传入的蓝牙文件 [英] Programmatically Auto Accept Incoming Bluetooth Files

查看:152
本文介绍了以编程方式自动接受传入的蓝牙文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

解决方案

更轻松的方式

如果您拥有植根设备并使用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链接

项目文件的Dropbox链接(zip)

Xposed APK网站

用于创建手机根目录的Towelroot网站

背景(原始答案)

正如我在上面评论的那样,您希望能够,并且我尝试并成功地阻止了该代码(尽管没有收到).

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);
                }

            });

    }
}

上面的代码钩住com.android.bluetooth.BluetoothOppService的方法startListenerSocket()并防止原始方法被行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();
                }

            });

    }
}

此代码挂钩com.android.bluetooth. BluetoothOppObexServerSession链接的com.android.bluetooth. BluetoothOppObexServerSessiononPut方法

我刚刚从原始代码中删除了一些拒绝代码.

还要查看我的完整代码,请参考 解决方案

MUCH EASIER WAY

If you have a rooted device and use XPosed Framework, your goal can be achieved much easier.

You Need not implement your own bluetooth server nor kill the original BT service, which are very bothering!!!

xposed tutorial link.

Try this code.

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.*/

                }
            });

    }
}

I tested and it works fine:)

Links

Dropbox link of the auto accepting app

Dropbox link of the project files (zip)

Xposed apk site

Towelroot site to root your phone

Background(Original answer)

As I commented above, you bay be able to, and I tried and succeeded in blocking (though not receiving) with this code.

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);
                }

            });

    }
}

The code above hooks the method startListenerSocket() of com.android.bluetooth.BluetoothOppService and prevents the original method from being called by the line param.setResult(null);

Refer to here to see the full code of com.android.bluetooth.BluetoothOppService.java and you will understand the operation.

And the code you can start from is shown below.

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();
                }

            });

    }
}

This code hooks the onPut method of com.android.bluetooth. BluetoothOppObexServerSession linked here. I either am newbie to xposed framework but I hope my answer helped.

I had the same issues you asked and partially solved the problem by implementing my custom OBEX server and manually / programmatically(with ps|grep and su kill pid) killing the native BluetoothOppService. But I will either try the idea of hooking and directly executing my code.

And to help you customize OBEX server session I post my implementation below.

    @Override
    public int onPut(Operation op)
    {
        if (D)
        {
            Log.d(TAG, "onPut " + op.toString());
        }
        HeaderSet request;
        String name, mimeType;
        Long length;
        String extension=null;// type;
        int obexResponse = ResponseCodes.OBEX_HTTP_OK;

        String destination;
        if (mTransport instanceof BluetoothObexTransport)
        {
            destination = ((BluetoothObexTransport) mTransport).getRemoteAddress();
        }
        else
        {
            destination = "FF:FF:FF:00:00:00";
        }
        boolean isWhitelisted =IsWhitelisted(destination);

        try
        {
            boolean preReject = false;

            request = op.getReceivedHeader();
            if (V)
            {
                // Constants.logHeader(request);
            }
            name = (String) request.getHeader(HeaderSet.NAME);
            length = (Long) request.getHeader(HeaderSet.LENGTH);
            mimeType = (String) request.getHeader(HeaderSet.TYPE);

            if (length == 0)
            {
                if (D)
                {
                    Log.w(TAG, "length is 0, reject the transfer");
                }
                preReject = true;
                obexResponse = ResponseCodes.OBEX_HTTP_LENGTH_REQUIRED;
            }

            if (name == null || name.isEmpty())
            {
                if (D)
                {
                    Log.w(TAG, "name is null or empty, reject the transfer");
                }
                preReject = true;
                obexResponse = ResponseCodes.OBEX_HTTP_BAD_REQUEST;
            }

            int dotIndex = name.lastIndexOf(".");
            if (dotIndex > 0)
            {
                extension = name.substring(dotIndex + 1).toLowerCase();
            }


            // Reject policy: anything outside the "white list" plus unspecified
            // MIME Types. Also reject everything in the "black list".
//            if (!preReject && (mimeType == null || (!isWhitelisted && !Constants.mimeTypeMatches(
//                    mimeType, Constants.ACCEPTABLE_SHARE_INBOUND_TYPES))
//                    || Constants.mimeTypeMatches(mimeType,
//                    Constants.UNACCEPTABLE_SHARE_INBOUND_TYPES))) {
//                if (D) {
//                    Log.w(TAG, "mimeType is null or in unacceptable list, reject the transfer");
//                }
//                preReject = true;
//                obexResponse = ResponseCodes.OBEX_HTTP_UNSUPPORTED_TYPE;
//            }

            if (preReject && obexResponse != ResponseCodes.OBEX_HTTP_OK)
            {
                // some bad implemented client won't send disconnect
                return obexResponse;
            }

        }
        catch (IOException e)
        {
            Log.e(TAG, "get getReceivedHeaders error " + e);
            return ResponseCodes.OBEX_HTTP_BAD_REQUEST;
        }         
        int status = receiveFile(destination, name, extension, length, op);
        /*
         * TODO map status to obex response code
         */
        if (status != BluetoothShare.STATUS_SUCCESS)
        {
            obexResponse = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
        }
        Log.d(TAG, "MIME TYPE)" + mimeType);
        return obexResponse;
    }

I just removed some rejecting codes from the original one.

Also to look at my full code please refer to my git repository.

I also thank the contributors to the android project!

这篇关于以编程方式自动接受传入的蓝牙文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆