- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在使用 Android 蓝牙 API 和我的 Galaxy Tab 检测零级蓝牙设备时遇到问题。尽管我可以用我的手机或电脑检测到它们,但它根本看不到某些设备。有人遇到过这个问题吗?我正在编写一个依赖于通过蓝牙与设备配对的应用程序,非常感谢这方面的一些帮助。
最佳答案
注意:由于需要访问设备日志,此解决方案仅适用于旧版 Android 操作系统。
是的!我在三星 Galaxy S 和 LG Optimus One 上遇到了完全相同的问题。我写了一个你可以重用的类来解决这个问题,不知道它是否适用于 Galaxy Tab,但你可以尝试:
package com.yourpackagename;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.app.Activity;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.AsyncTask;
// This class exists due to a bug in the Broadcomm bluetooth stack, which is
// used by many Android smart-phone manufacturers (LG, Samsung HTC etc.). That
// bug prevents discovery of ALL bluetooth devices that report their Class of Device (CoD)
// code as 0x00, which prevent many SPP (Serial Port Profile) devices from working.
//
// See: http://www.google.com/codesearch/p?hl=en#4hzE-Xyu5Wo/vendor/brcm/adaptation/dtun/dtunc_bz4/dtun_hcid.c&q=%22Device%20[%25s]%20class%20is%200x00%20-%20skip%20it.%22&sa=N&cd=1&ct=rc
// And: http://stackoverflow.com/questions/4215398/bluetooth-device-not-discoverable
// And: http://www.reddit.com/r/Android/comments/hao6p/my_experience_with_htc_support_eu_anyone_has/
//
// How to use (from your Activity class):
//
// (new BluetoothClassZeroDiscoveryTask(this, new BluetoothDiscoveryCallback())).execute();
//
// Where BluetoothDiscoveryCallback is a class defined e.g. in your Activity. The call method
// will be called after the discovery task completes, and is passed the complete list
// of paired bluetooth devices, including those that are undiscoverable due to the above bug.
//
// private class BluetoothDiscoveryCallback implements Action<ArrayList<BluetoothDevice>>
// {
// public void call(ArrayList<BluetoothDevice> devices)
// {
// // Now you have the list of ALL available devices,
// // including those that report class 0x00.
// }
// }
//
// // Java equivalent of the built-in Action from C#.
// public interface Action<T>
// {
// void call(T target);
// }
//
public class BluetoothClassZeroDiscoveryTask extends AsyncTask<Void, Void, Void>
{
// This is the well-known ID for bluetooth serial port profile (SPP) devices.
public static final UUID BluetoothSerialUuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private Activity _parent;
private boolean _discoveryComplete = false;
private Action<ArrayList<BluetoothDevice>> _callback;
private ArrayList<BluetoothDevice> _devices = new ArrayList<BluetoothDevice>();
private Calendar _discoveryStartTime;
private SimpleDateFormat _logDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
private BluetoothAdapter _adapter;
private ProgressDialog _progressDialog;
public BluetoothClassZeroDiscoveryTask(Activity parent, Action<ArrayList<BluetoothDevice>> callback)
{
_callback = callback;
_parent = parent;
_adapter = BluetoothAdapter.getDefaultAdapter();
IntentFilter foundFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
_parent.registerReceiver(mReceiver, foundFilter);
IntentFilter finishedFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
_parent.registerReceiver(mReceiver, finishedFilter);
// This task performs a scan for bluetooth devices, which
// takes ~ 12 seconds, so show an indeterminate progress bar.
_progressDialog = ProgressDialog.show(_parent, "", "Discovering bluetooth devices...", true);
}
// Kicks off bluetooth discovery.
@Override
protected Void doInBackground(Void... params)
{
_discoveryStartTime = Calendar.getInstance();
_adapter.startDiscovery();
while (!_discoveryComplete)
{
try
{
Thread.sleep(500);
}
catch (InterruptedException e) { }
}
_adapter.cancelDiscovery();
return null;
}
// Provide notification of results to client.
@Override
protected void onPostExecute(Void result)
{
_progressDialog.dismiss();
_parent.unregisterReceiver(mReceiver);
_callback.call(_devices);
}
// Handler for bluetooth discovery events.
private final BroadcastReceiver mReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action))
{
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// If it's already paired, skip it, (we'll add it after the scan completes).
if (device.getBondState() != BluetoothDevice.BOND_BONDED)
{
_devices.add(device);
}
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action))
{
// Add all already-paired devices to the list.
for (BluetoothDevice device : _adapter.getBondedDevices())
{
_devices.add(device);
}
// Trawl through the logs to find any devices that were skipped >:(
try
{
Process process = Runtime.getRuntime().exec("logcat -d -v time *:E");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
Pattern pattern = Pattern.compile("(.{18}).*\\[(.+)\\] class is 0x00 - skip it.");
while ((line = bufferedReader.readLine()) != null)
{
Matcher matcher = pattern.matcher(line);
if (matcher.find())
{
// Found a blocked device, check if it was newly discovered.
// Android log timestamps don't contain the year!?
String logTimeStamp = Integer.toString(_discoveryStartTime.get(Calendar.YEAR)) + "-" + matcher.group(1);
Date logTime = null;
try
{
logTime = _logDateFormat.parse(logTimeStamp);
}
catch (ParseException e) { }
if (logTime != null)
{
if (logTime.after(_discoveryStartTime.getTime()))
{
// Device was discovered during this scan,
// now we want to get the name of the device.
String deviceAddress = matcher.group(2);
BluetoothDevice device = _adapter.getRemoteDevice(deviceAddress);
// In order to get the name, we must attempt to connect to the device.
// This will attempt to pair with the device, and will ask the user
// for a PIN code if one is required.
try
{
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(BluetoothSerialUuid);
socket.connect();
socket.close();
_devices.add(device);
}
catch (IOException e) { }
}
}
}
}
}
catch (IOException e) {}
_discoveryComplete = true;
}
}
};
}
另见: http://zornsoftware.codenature.info/blog/pairing-spp-bluetooth-devices-with-android-phones.html
关于android - 使用 Android 蓝牙 API 的 Samsung Galaxy Tab 中的蓝牙检测问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6016928/
我在看 Tabs UI 的选项。默认行为是它们水平堆叠。有没有办法改变它? 我想堆叠Tabs垂直。它将节省大量的 UI“不动产”,尤其是在移动应用程序 UI 中。 最佳答案 尝试这个: Tabs ta
问题:在 Zsh 中使用 TAB 向后导航,类似于在 Firefox 中 Shift-TAB Shift-TAB 应该执行的操作示例 我在终端中运行以下代码 ls 我明白了 A B C D E F
有很多人想知道如何完成制表符。这不是这些问题之一。问题是如何将 tab 键分配给 tab 补全? alt-tab/esc-tab 很痛苦。在面板禁用模式选项卡完成工作,这让我暂时...但我仍然希望面板
所以我有一个带有 3 个屏幕的 TabNavigator。 import React from 'react'; import {TabNavigator,createBottomTabNavigat
我想触发一个事件,例如当我在文本框中按 Tab 键时显示警报消息。 $("input").blur(function (e) { if (e.which == 9) alert(
我将这段代码设置为创建一个选项卡式菜单,它显示为一个选项卡式菜单,但当我加载网站时,选项卡在单击时不会改变。在“检查元素”中它说 $( "#tabs").tabs();不是函数。我不知道下一步要解决这
表单中有多个输入字段的示例,因为有一些字段在此之前会自动填充,如果我按 Tab 键,那么它应该跳过该自动填充的输入字段并应转到空白输入字段 我尝试过,但是当我开始在空白输入中写入时会发生什么,它也会自
我想写一个小的 chrome 扩展程序,它应该从网页 A(当前网页)获取信息,将选项卡更新到网页 B,然后将代码注入(inject)网页 B。不幸的是,以下代码正在将网页更新到 B 但注入(injec
如果当前事件选项卡中的表单很脏,我试图阻止 mat-tab 的选项卡更改。 但是我找不到拦截选项卡更改事件的方法。 // Tab 0 Content // Tab
我已从 MacOS Mojave 上的默认终端切换到 iterm2 .我有一个关于从当前选项卡打开新选项卡的问题。 确实,我希望与上一个当前选项卡处于同一路径。 为此,我执行了经典程序,即转到 ite
我在我的网站的两页上有此代码,但在一页上该功能不起作用。 Firebug 向我显示“$(...).tabs 不是函数”。我不明白为什么,谁能告诉我什么是错的? 这是有效的: http://www.in
我需要可靠的方法来为 Windows 和 XP 创建 %tab% (包含一个制表符)。 SET TAB=" " 应该适用于 Windows 7(未测试)但不适用于 Win XP(已测试)。 这个 fo
我正在尝试使用 RMarkdown 制作静态网页。我想定义一个 UI,它有第一层选项卡,然后是第一层下面的选项卡。我已经在 RMarkdown: Tabbed and Untabbed heading
我正在尝试使用 RMarkdown 制作静态网页。我想定义一个 UI,它有第一层选项卡,然后是第一层下面的选项卡。我已经在 RMarkdown: Tabbed and Untabbed heading
我在使用 chrome.tabs.create 方法打开多个选项卡时遇到问题。我正在尝试使用 chrome.tabs.create 循环打开大约 9 个选项卡,但打开的选项卡数量仅限于 4 个。看起来
我正在使用 Material ui 的标签,并且能够对标签的指示器进行更改。但是,我正在尝试使用样式将每个选项卡的指示器宽度减小到某个固定宽度。但似乎指标以一些计算值定位在左侧,并且给它一个宽度不会使
我在 OS X 终端中使用 emacs 24.3,并且遇到了一些奇怪的事情。 在 markdown-mode.el 中,tab 键通过 (define-key map (kbd "") 'markdo
在 Chrome 开发者工具上 Uncaught (in promise) Error: There is no clipping info for given tab at E._handleRes
在vim中,我想将:tabnew缩短为:tn,将:tabp缩短为:th,将:tabn缩短为:tl在我的.vimrc中。知道我将如何重新映射这样的命令吗? 最佳答案 使用cabbrev: ca tn t
我读过几个主题,讨论 IE 中的地址栏在使用 TAB 时基本上是第一个获得焦点的主题(MSDN 自己的文档讨论了这一点)。 然而,我也见过一些情况,但情况并不总是如此...... 我有一个母版页,内容
我是一名优秀的程序员,十分优秀!