Вопрос по android, uuid, bluetooth – Поиск UUID в Android 2.0

1

Я пишу программу, которая должна быть запущена в Android 2.0. В настоящее время я пытаюсь подключить устройство Android к встроенному чипу Bluetooth. Мне дали информацию о том, как использовать fetchuidsWithSDP () или getUuids (), но на странице, которую я прочитал, объяснялось, что эти методы скрыты в 2.0 SDK и должны вызываться с использованием отражения. Я понятия не имею, что это значит, и нет никаких объяснений. Приведен пример кода, но за ним очень мало объяснений. Я надеялся, что кто-нибудь поможет мне понять, что на самом деле здесь происходит, так как я очень новичок в разработке для Android.

String action = "android.bleutooth.device.action.UUID";
IntentFilter filter = new IntentFilter( action );
registerReceiver( mReceiver, filter );

На странице, которую я прочитал, также написано, что в первой строке Bluetooth пишется как «bleutooth». нарочно. Если кто-то может это объяснить, я был бы признателен за это, так как для меня это не имеет смысла, если разработчики не сделали опечатку.

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive( Context context, Intent intent ) {
    BluetoothDevice deviceExtra = intent.getParcelableExtra("android.bluetooth.device.extra.Device");
    Parcelable[] uuidExtra = intent.getParcelableArrayExtra("android.bluetooth.device.extra.UUID");
}

};

У меня возникают проблемы с пониманием того, как именно я нахожу правильный UUID для моего встроенного чипа Bluetooth. Если бы кто-то мог помочь, я был бы очень признателен.

РЕДАКТИРОВАТЬ: Я собираюсь добавить остальную часть моего метода onCreate (), чтобы вы могли видеть, с чем я работаю.

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set up window View
    setContentView(R.layout.main);

    // Initialize the button to scan for other devices.
    btnScanDevice = (Button) findViewById( R.id.scandevice );

    // Initialize the TextView which displays the current state of the bluetooth
    stateBluetooth = (TextView) findViewById( R.id.bluetoothstate );
    startBluetooth();

    // Initialize the ListView of the nearby bluetooth devices which are found.
    listDevicesFound = (ListView) findViewById( R.id.devicesfound );
    btArrayAdapter = new ArrayAdapter<String>( AndroidBluetooth.this,
            android.R.layout.simple_list_item_1 );
    listDevicesFound.setAdapter( btArrayAdapter );

    CheckBlueToothState();

    // Add an OnClickListener to the scan button.
    btnScanDevice.setOnClickListener( btnScanDeviceOnClickListener );

    // Register an ActionFound Receiver to the bluetooth device for ACTION_FOUND
    registerReceiver( ActionFoundReceiver, new IntentFilter( BluetoothDevice.ACTION_FOUND ) );

    // Add an item click listener to the ListView
    listDevicesFound.setOnItemClickListener( new OnItemClickListener()
    {
      public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) 
      {
          // Save the device the user chose.
          myBtDevice = btDevicesFound.get( arg2 );

          // Open a socket to connect to the device chosen.
          try {
              btSocket = myBtDevice.createRfcommSocketToServiceRecord( MY_UUID );
          } catch ( IOException e ) {
              Log.e( "Bluetooth Socket", "Bluetooth not available, or insufficient permissions" );
          } catch ( NullPointerException e ) {
              Log.e( "Bluetooth Socket", "Null Pointer One" );
          }

          // Cancel the discovery process to save battery.
          myBtAdapter.cancelDiscovery();

          // Update the current state of the Bluetooth.
          CheckBlueToothState();

          // Attempt to connect the socket to the bluetooth device.
          try {
              btSocket.connect();                 
              // Open I/O streams so the device can send/receive data.
              iStream = btSocket.getInputStream();
              oStream = btSocket.getOutputStream();
          } catch ( IOException e ) {
              Log.e( "Bluetooth Socket", "IO Exception" );
          } catch ( NullPointerException e ) {
              Log.e( "Bluetooth Socket", "Null Pointer Two" );
          }
      } 
  });
}
Можете ли вы дать ссылку на эту страницу? Timo Ohr
Да, это прямо здесьwiresareobsolete.com/wordpress/2010/11/android-bluetooth-rfcomm JuiCe

Ваш Ответ

2   ответа
-1

и вот как я решил ее для Android 2.3.3. Я думаю, что то же решение будет работать для Android 2.2 также.

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @SuppressLint("NewApi")
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        // When discovery finds a device
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            Toast.makeText(getApplicationContext(),"Device: "+device.getName(),Toast.LENGTH_SHORT).show();
            devices.add(device.getName() + "\n" + device.getAddress());
            list.add(device);

        }
        else if(BluetoothDevice.ACTION_UUID.equals(action)){
            Toast.makeText(getApplicationContext(),"I am Here",Toast.LENGTH_SHORT).show();
        }
        else {
            if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                Toast.makeText(getApplicationContext(),"Done Scanning..",Toast.LENGTH_SHORT).show();
                Iterator<BluetoothDevice> itr = list.iterator();
                while(itr.hasNext())
                {
                    BluetoothDevice dev=itr.next();
                    if(dev.fetchUuidsWithSdp())
                    {
                        Parcelable a[]=dev.getUuids();
                        Toast.makeText(getApplicationContext(),dev.getName()+":"+a[0],Toast.LENGTH_SHORT).show();
                    }
                }
            }
        }       
    }
};
5

вам лучше использовать синхронную версию, поэтому вам не нужно разбираться со всеми движущимися частями настройкиBroadcastReceiver, Поскольку вы всегда делаете это по пятам открытия, кэшированные данные всегда будут свежими.

Здесь функциональность получения данных UUID, инкапсулированных в метод. Этот код был в одном из комментариев поста в блоге, на который вы ссылались:

//In SDK15 (4.0.3) this method is now public as
//Bluetooth.fetchUuisWithSdp() and BluetoothDevice.getUuids()
public ParcelUuid[] servicesFromDevice(BluetoothDevice device) {
    try {
        Class cl = Class.forName("android.bluetooth.BluetoothDevice");
        Class[] par = {};
        Method method = cl.getMethod("getUuids", par);
        Object[] args = {};
        ParcelUuid[] retval = (ParcelUuid[]) method.invoke(device, args);
        return retval;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

Затем вы можете вызвать этот метод в любом месте вашего кода, передав емуBluetoothDevice и возвращают массив UUID для служб этого устройства (обычно для небольших встроенных стеков массив составляет только 1 элемент); что-то вроде:

  // Save the device the user chose.
  myBtDevice = btDevicesFound.get( arg2 );
  //Query the device's services
  ParcelUuid[] uuids = servicesFromDevice(myBtDevice);

  // Open a socket to connect to the device chosen.
  try {
      btSocket = myBtDevice.createRfcommSocketToServiceRecord(uuids[0].getUuid());
  } catch ( IOException e ) {
      Log.e( "Bluetooth Socket", "Bluetooth not available, or insufficient permissions" );
  } catch ( NullPointerException e ) {
      Log.e( "Bluetooth Socket", "Null Pointer One" );
  }

в блоке вы разместили выше.

Как примечание, вызов всего этого кода таким образом, как вы это сделаете ваше приложение позже. Блок вызова кодаconnect() и получение потоков должно выполняться в фоновом потоке, потому что этот метод будет блокироваться на период времени, и вызов этого кода в основном потоке временно заморозит ваш пользовательский интерфейс. Вы должны переместить этот код вAsyncTask илиThread как образец BluetoothChat в SDK.

НТН

@nick Этот метод работает, только если вы недавно выполнили операцию обнаружения, поскольку он извлекает данные из кэша. Если вам нужны свежие данные с устройства, вам нужно будет посмотреть наfetchUuidsWithSdp() вместо. Оба эти метода теперь также доступны в Android 4.0.3, поэтому вы можете попробовать протестировать устройство с более новой версией, чтобы убедиться, что проблема не в другом месте кода.
Вы босс, большое спасибо, очень ценю это JuiCe
Если вам случится взглянуть на это, сегодня я снова вернулся к этому коду и понял, что он все еще не работает для меня. Я разместил новый вопрос, если у вас есть возможность помочь.stackoverflow.com/questions/11105891/… JuiCe
@Devunwired Я просмотрел ваш сайт. На самом деле, требование клиента только на Android 2.2. Вот почему я работаю над этим. Я просто хочу UUid моего устройства и после обнаружения, UUID другого устройства, которое я подключаю к моему устройству. У меня есть просмотр в сети. Занимался поиском, но не смог найти никакого решения.
@Devunwired Привет, я получаю ParvalUuid [] Retval как ноль, когда я предпочитаю код выше. Вы можете помочь в этом ??

Похожие вопросы