有没有办法使用OBEX使用android bluetooth API发送文件?
我需要将文件发送到仅支持OBEX OPP的打印机.
我可以使用android意图ACTION_SEND将文件发送到打印机没有问题,但我需要以编程方式发送它..
我可以使用方法createRfcommSocketToServiceRecord()使用OBEX OPP UUID(1105)连接到蓝牙打印机,但是我应该遵循obex规范使用OBEX发送文件..它不像将字节写入输出套接字那么简单. .
但是如果意图ACTION_SEND可以处理这个问题,为什么开发人员没有任何API发送文件?
我还检查了一些像BlueCove这样的第三方库,但我仍然没有让它工作..(Nexus One和Galaxy Tab抛出异常,说本机库bluecove_armv71不可用..而且LG Optimus One说bluecove_armv61不是不可用..)
我被卡住了,有什么想法吗?
工作解决方案
对于任何试图将文件发送到蓝牙设备而没有运气的人,我使用内容提供商提供了一个有效的解决方案(感谢KPBird):
从这里抓取java类BluetoothShare
以下代码将SD卡上的文件发送到蓝牙设备:
BluetoothDevice device;
String filePath = Environment.getExternalStorageDirectory().toString() + "/file.jpg";
ContentValues values = new ContentValues();
values.put(BluetoothShare.URI, Uri.fromFile(new File(filePath)).toString());
values.put(BluetoothShare.DESTINATION, device.getAddress());
values.put(BluetoothShare.DIRECTION, BluetoothShare.DIRECTION_OUTBOUND);
Long ts = System.currentTimeMillis();
values.put(BluetoothShare.TIMESTAMP, ts);
Uri contentUri = getContentResolver().insert(BluetoothShare.CONTENT_URI, values);
Run Code Online (Sandbox Code Playgroud)
UPDATE
有些人遇到上述解决方案的问题,已经在以下设备上进行了测试:
适用于:
有问题:
通过蓝牙与手机配对后,是否可以访问SD卡内容(如音乐或图像)?
是否有任何教程或示例代码?
我看到一个名为"蓝牙文件传输"的应用程序,并希望制作另一个像我读到的关于蓝牙,蓝牙插座,但没有找到任何有用的如何执行该操作的东西我正在研究更多,如果我发现我会在这里发布解决方案,如果有人很快发现请在这里发布....谢谢
问候stackoverflow.
最近,我正在跟踪Android框架中的蓝牙操作机制.我注意到这个补丁在通过OPP接收文件时会产生一些文件类型限制.
在包中com.android.bluetooth.opp
,Constants.java中有一个固定的白名单
/**
* The MIME type(s) of we could accept from other device.
* This is in essence a "white list" of acceptable types.
* Today, restricted to images, audio, video and certain text types.
*/
public static final String[] ACCEPTABLE_SHARE_INBOUND_TYPES = new String[] {
/* ... some types such as images and music ... */
};
Run Code Online (Sandbox Code Playgroud)
这限制了BluetoothOppObexServerSession.java中可接受的文件类型
// Reject policy: anything outside the "white list" plus unspecified
// MIME Types.
if (!pre_reject
&& …
Run Code Online (Sandbox Code Playgroud) 我需要构建一个Android应用程序,通过蓝牙从远程设备放入/获取文件; 该应用程序还必须浏览远程文件系统.我已经阅读了一些关于OBEX的内容,但是除了市场上的一些很棒的应用程序之外,我还没有找到任何Android版本的例子.如何在应用程序中实现?
我看到了你通过蓝牙发送文件的答案.(回答于2011年6月13日5:01)
Intent i = new Intent(Intent.ACTION_SEND); i.setType("image/jpeg");
i.putExtra(Intent.EXTRA_STREAM, Uri.parse("/sdcard/file.jpg"));
startActivity(Intent.createChooser(i, "Send Image"));
Run Code Online (Sandbox Code Playgroud)
是! 有用.它将打开一个默认的蓝牙工具/窗口/对话框来发送文件.但是,请你教我如何发送更多文件?这是我的代码......
String xFile[3] = { "aa.txt", "bb.txt", "cc.txt" };
Intent i = new Intent(Intent.ACTION_SEND); i.setType("text/plain");
for (int i = 0; i < 3; i ++) {
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(xFile[i])));
startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)
它可以工作,但它将打开默认的蓝牙工具/窗口/对话3次!@@如果有10个文件,它将打开默认的蓝牙工具/窗口/对话框10次!
我可以知道如何打开默认的蓝牙工具/窗口/对话框一次,然后发送所有文件?
非常感谢你提前!
这几天我一直在寻找这个.
目标 - 我需要的是打开通过蓝牙与我的Android设备连接的设备的文件管理器.即从蓝牙连接设备探索文件结构并传输文件.
完成 - 设法通过蓝牙连接到任何设备,并配对它们.
屏障 - 经过几次谷歌搜索[:P]我发现有办法这样做.他们说在OBEX和OPP的帮助下你可以访问蓝牙连接设备的文件.所以我试图在Android上找到OBEX的暗示,不幸的是我无法管理得到帮助OBEX.
所以,现在我在一个问题中遇到很多问题.那是蓝牙连接设备的资源管理器文件的任何方式.我是对的,OBEX是唯一的方法吗?是否有任何有用的文档/教程,有助于在Android中实现OBEX?
我需要将文件发送到计算机而不是另一个Android应用程序.我看过蓝牙api,但它只允许连接作为客户端 - 服务器.在我的情况下,我不知道UUId将在计算机上.我需要看看obex吗?我之前没用过它.所以任何帮助都是有益的.
在这里我想执行一个命令,我必须在执行第一个命令后输入这个命令。
我想obex_test
为蓝牙模式执行命令,而不是在我必须为启动服务器提供像“s”这样的输入之后,我该如何提供这个东西。这是我的代码,我写了这个东西并得到了输出。执行obex_test
命令后我收到输入数据错误。
代码:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
void main() {
char *input = "obex_test -b";
FILE *fp = NULL;
char path[512];
fp = popen(input, "w");
if (fp == NULL)
{
printf("\nFailed command\n");
return;
}
else
{
printf("\nSuccesss command\n");
}
printf("starting while : %d", fp);
while (fgets(path, sizeof(path) - 1, fp) != NULL) {
printf("\nOutput ::: %s \n", path);
}
printf("\nEnd\n");
/* close */
pclose(fp);
}
Run Code Online (Sandbox Code Playgroud)
输出 :
Successs command
starting while : …
Run Code Online (Sandbox Code Playgroud) 蓝牙FTP规范说我需要使用ACTION操作,这是一个页面 http://i47.tinypic.com/2425t2v.png
但是ClentSession只提供GET和PUT操作,而javadocs中没有提到任何内容.
这是创建文件操作的外观,非常简单
public void create() throws IOException {
HeaderSet hs = cs.createHeaderSet();
hs.setHeader(HeaderSet.NAME, file);
op = cs.put(hs);
OutputStream os = op.openOutputStream();
os.close();
op.close();
}
Run Code Online (Sandbox Code Playgroud)
问题1:如何使用自定义标头实施ACTION操作以执行移动/重命名和设置权限?没有JSR82 OBEX API就应该可以.请帮我这样做.
问题2:我是否了解如何设置权限?根据OBEX_Errata Compiled For 1.3.pdf(感谢alanjmcf!)
1 http://i45.tinypic.com/2h84led.jpg
2 http://i49.tinypic.com/2wgysmx.png
因此,要设置只读,我应该执行以下操作:
int a = 0;
//byte 0 //zero
//byte 1 //user
//byte 2 //group
//byte 3 //other
//set read for user
a |= (1 << 7); //8th bit - byte 1, bit 0 -> set to 1
// a = 10000000 …
Run Code Online (Sandbox Code Playgroud) 我有使用OBEX Object Push Profile(OPP)通过蓝牙发送数据的设备.
使用adb logcat我看到我的android设备收到连接(但是中止了这个连接?)
08-22 11:14:37.939: I/BtOppRfcommListener(22586): Accepted connectoin from 00:07:CF:5F:52:A0
08-22 11:14:37.939: I/BtOpp Service(22586): Start Obex Server
08-22 11:14:38.109: D/Obex ServerSession(22586): java.io.IOException: Software caused connection abort
08-22 11:14:38.109: D/PowerManagerService(180): @PowerManagement: 'BtOppObexServer' releaseWakeLock when screen locked
08-22 11:14:39.219: D/BluetoothEventLoop(180): Device property changed: 00:07:CF:5F:52:A0 property: Connected value: false
Run Code Online (Sandbox Code Playgroud)
当我安装蓝牙文件传输(市场上的免费应用程序),然后我就能够接收文件.但我不想安装其他应用程序.