小编Hoa*_*yen的帖子

BluetoothHeadset:为什么有必要使用计时器来调用startVoiceRecognition?

我写了一些用于检测蓝牙耳机连接并通过耳机启动音频的代码.对于API 11及更高版本,可以在连接耳机时调用startVoiceRecognition.所以有几个用例如下:

  1. 应用程序启动前耳机已打开应用
    程序应检查启动时连接的耳机并建立音频连接.

  2. 用户在应用程序
    生命周期内打开耳机应用程序应注册耳机连接状态的广播并在接收连接状态时启动音频连接.

第二个用例存在问题.当收到连接状态时,我调用startVoiceRecognition,但它总是返回false.所以我必须实现一个计时器,大约一秒后,调用将返回true.我想操作系统和耳机需要一段时间才能让一切准备就绪.有没有人知道如何在没有实现计时器的情况下获得耳机音频连接.如果不可能,应该是应该处理这种情况的操作系统(例如READY_FOR_AUDIO_CONNECTION广播)而不是应用程序吗?

以下是API 11或更高版本的完整工作代码.

清单权限

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
Run Code Online (Sandbox Code Playgroud)

public class MainActivity extends Activity
{

    protected TextView mInfoTextview;

    protected BluetoothAdapter mBluetoothAdapter;
    protected BluetoothHeadset mBluetoothHeadset;
    protected BluetoothDevice mConnectedHeadset;

    protected AudioManager mAudioManager;


    private static final String TAG = "Bluetooth Headset"; //$NON-NLS-1$

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        mInfoTextview = (TextView) findViewById(R.id.main_textview);

        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        if (mBluetoothAdapter != null)
        {
            mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
            if (mAudioManager.isBluetoothScoAvailableOffCall())
            {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) …
Run Code Online (Sandbox Code Playgroud)

android bluetooth bluetooth-sco

7
推荐指数
0
解决办法
3477
查看次数

这种创建Singleton线程的方法是否安全?

这不是关于Singleton是好还是坏的讨论.它是关于创建单身人士.我理解Singleton的方式是它是一个类,任何时候都应该存在一个对象的大多数.也就是说,如果几个类同时实例化一个单例,那么它们将共享该单例的单个实例.
单例的问题在于,一旦创建它,​​它将在应用程序的持续时间内存在.使用我的方法,您可以创建并在任何时候收集Singleton垃圾,如果它不再使用的话.好吧,我需要一个枚举(Singleton!)来创建所有其他Singleton.我认为我的方法是反射和序列化安全,但我不确定线程​​是否有任何问题.
我创建单例的方法如下:

首先,任何想要成为单身人士的类都必须扩展以下类

public abstract class Singleton {
    public Singleton(SingletonFactory.SingletonParam singletonParam) {
        if (singletonParam == null) {
            throw new NullPointerException("singletonParam cannot be null)");
        }
    }

    // For singleton to release resources.    
    public abstract void destroy(SingletonFactory.SingletonParam singletonParam);
}
Run Code Online (Sandbox Code Playgroud)

SingletonParam将是一个抽象类内部类,它不能拥有一个对象,它是多态性意义上的SingletonParam,在其容器类之外实例化.
这不是为了让子类在运行时扩展Singleton类.它是通过拥有静态实例的单例类.我的方法不需要单例类的任何静态实例.
容器是以下类

注意:在阅读了Stephen C的答案后,我进行了更改以从构造函数初始化HashMap,我不明白为什么它不是线程安全的.

public enum SingletonFactory {
    INSTANCE;

    enum SingletonList {
       A,
       B,
      ......
    }

   private final HashMap<String, SingletonInfo> mfSingletonInfoHashMap = new HashMap<>();

    // Added after @Stephen C answer
    SingletonFactory() {
        mfSingletonInfoHasmap.put(A, final new SingletonInfo());
     // put all the members …
Run Code Online (Sandbox Code Playgroud)

java singleton

4
推荐指数
1
解决办法
137
查看次数

标签 统计

android ×1

bluetooth ×1

bluetooth-sco ×1

java ×1

singleton ×1