出于安全考虑,Android 蓝牙在传输文件时对文件格式有限制,默认情况下,并不是所有文件都能够传输和共享,当电脑向Android手机传输文件的时候也是有这种限制的。
Bluetooth\src\com\android\bluetooth\opp\BluetoothOppObexServerSession.java
当电脑向手机发送蓝牙文件时会调用BluetoothOppObexServerSession的onPut方法,方法如下
@Override
public int onPut(Operation op) {
if (D) Log.d(TAG, "onPut " + op.toString());
HeaderSet request;
String name, mimeType;
Long length;
int obexResponse = ResponseCodes.OBEX_HTTP_OK;
/**
* For multiple objects, reject further objects after user deny the
* first one
*/
if (mAccepted == BluetoothShare.USER_CONFIRMATION_DENIED) {
return ResponseCodes.OBEX_HTTP_FORBIDDEN;
}
String destination;
if (mTransport instanceof BluetoothObexTransport) {
destination = ((BluetoothObexTransport)mTransport).getRemoteAddress();
} else {
destination = "FF:FF:FF:00:00:00";
}
boolean isWhitelisted = BluetoothOppManager.getInstance(mContext).
isWhitelisted(destination);
try {
boolean pre_reject = 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");
pre_reject = true;
obexResponse = ResponseCodes.OBEX_HTTP_LENGTH_REQUIRED;
}
if (name == null || name.equals("")) {
if (D) Log.w(TAG, "name is null or empty, reject the transfer");
pre_reject = true;
obexResponse = ResponseCodes.OBEX_HTTP_BAD_REQUEST;
}
if (!pre_reject) {
/* first we look for Mimetype in Android map */
String extension, type;
int dotIndex = name.lastIndexOf(".");
if (dotIndex < 0 && mimeType == null) {
if (D) Log.w(TAG, "There is no file extension or mime type," +
"reject the transfer");
pre_reject = true;
obexResponse = Re