web-dev-qa-db-ja.com

Android)でXamarinからペアリングされたBluetoothデバイスに接続します

アプリケーションがA2DPまたはハンズフリープロファイルを介して起動したときに、ペアリングされたBluetoothデバイスに自動的に接続できるようにアプリケーションが必要です。

Androidプラットフォーム用のXamarin(monodroid)で作業しています。

私はこのstackoverflowの質問を見つけました: プログラムでペアリングされたBluetoothデバイスに接続します

しかし、それはこれを達成するためのネイティブな方法に関連しています(kcoppockによる回答を参照)。 Xamarinを介してこれを実現する方法があるかどうかを知りたいです。 SPPエンドポイントはRFCOMMベースの接続であるため接続できますが、それとオーディオ接続が必要であるため、A2DPに接続する方法を探しています。

更新1:

次のようなCreateInsecureRfcommSocketToServiceRecordメソッドを使用して接続しようとしました。

mmSocket = device.CreateInsecureRfcommSocketToServiceRecord(0000110A-0000-1000-8000-00805F9B34FB); mmSocket.Connect();

Connectを呼び出すと、次のエラーが発生します。

_read failed, socket might closed or timeout, read ret: -1_

スタックトレースは次で始まります。

Java.IO.IOException at Android.Runtime.JNIEnv.CallVoidMethod (IntPtr jobject, IntPtr jmethod) [0x00062] in /Users/buil…

更新2:

ちなみに、ネイティブJava test app using kcoppockによるアプローチ を使用して接続しようとすると、デバイスはエラーなしで機能しているように見えますが、 A2DPヘッドセットとして接続されていません。

それを実行できることがわかっている唯一のプログラミング方法このGoogle Playアプリ であり、それが可能であることを証明しています。

19
Maxim V. Pavlov

XamarinはネイティブAPIにバインドするので、何かが「ネイティブの方法に関連している」ことを心配しないでください;)参照した回答に基づいて、以下のコードを作成してテストしました。お役に立てば幸いです。

class btListener : Java.Lang.Object, IBluetoothProfileServiceListener
{
    public void OnServiceConnected([GeneratedEnum] ProfileType profile, IBluetoothProfile proxy)
    {
        String deviceName = "JABRA WAVE+";

        BluetoothDevice result = null;

        var devices = BluetoothAdapter.DefaultAdapter.BondedDevices;
        if (devices != null)
        {
            foreach (BluetoothDevice device in devices)
            {
                if (deviceName == device.Name)
                {
                    result = device;
                    break;
                }
            }
        }
        var connect = Java.Lang.Class.FromType(typeof(BluetoothA2dp)).GetDeclaredMethod("connect", Java.Lang.Class.FromType(typeof(BluetoothDevice)));
        connect.Invoke((Java.Lang.Object)proxy, result);
    }

    public void OnServiceDisconnected([GeneratedEnum] ProfileType profile)
    {
    }
}

たとえば、次のコードOnCreate関数:

btListener btReceiver = new btListener();
BluetoothAdapter.DefaultAdapter.GetProfileProxy(this, btReceiver, ProfileType.A2dp);

日付を見ただけですが、とにかく答えを投稿しています-多分それはまだ誰かを助けるつもりです

1
flota113

これをチェックしてください ブログ投稿 。このリンクのadapter.BondedDevicesプロパティは、ペアリングされたデバイスのリストを返します。

0
Sreeraj