Подтвердить что ты не робот

Как определить, совместимо ли устройство Android в паре с Android-функцией

Я создаю приложение для Android, которое расширяет push-уведомления. Мое приложение загружает примерно 10 изображений с сервера, когда приходит push-уведомление и отображает эти дополнительные изображения на часах. Эти изображения специфичны для приложения для Android and wear и не отображаются на карманном устройстве.

Как узнать, сопряжено ли карманное устройство с устройством износа android, чтобы я мог определить, нужно ли загружать дополнительные изображения, необходимые для приложения для изнашивания?

Спасибо!

4b9b3361

Ответ 1

Вам нужно использовать NodeApi, в частности NodeApi.getConnectedNodes().

Например (из фонового потока - в противном случае используйте setResultCallback(), а не await()):

List<Node> connectedNodes =
    Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await().getNodes();

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


Обновление: с выпуском Google Play Services 7.3 добавлена ​​поддержка нескольких устройств Android Wear, подключенных одновременно. Вы можете использовать CapabilityApi для запроса узлов с определенными возможностями.

Ответ 2

Здесь уже было 2 варианта. Они действительны в зависимости от вашего варианта использования. Мне нравится добавить третий вариант, однако неполный.

Вариант 1: найти подключенные узлы с помощью NodeApi

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

Недостатком этого подхода является то, что вы не получите никаких результатов, если bluetooth не включен или часы не подключены в данный момент.

Метод:

List<Node> connectedNodes =
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await().getNodes();

Более полный пример кода выглядит следующим образом:

private GoogleApiClient client;
private static final long CONNECTION_TIME_OUT_MS = 1000;

public void checkIfWearableConnected() {

    retrieveDeviceNode(new Callback() {
        @Override
        public void success(String nodeId) {
            Toast.makeText(this, "There was at least one wearable found", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void failed(String message) {
            Toast.makeText(this, "There are no wearables found", Toast.LENGTH_SHORT).show();
        }
    });

}

private GoogleApiClient getGoogleApiClient(Context context) {
        if (client == null)
            client = new GoogleApiClient.Builder(context)
                    .addApi(Wearable.API)
                    .build();
        return client;
    }

private interface Callback {
        public void success(final String nodeId);
        public void failed(final String message);
    }

private void retrieveDeviceNode(final Callback callback) {
        final GoogleApiClient client = getGoogleApiClient(this);
        new Thread(new Runnable() {

            @Override
            public void run() {
                client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);
                NodeApi.GetConnectedNodesResult result =
                        Wearable.NodeApi.getConnectedNodes(client).await();
                List<Node> nodes = result.getNodes();
                if (nodes.size() > 0) {
                    String nodeId = nodes.get(0).getId();
                    callback.success(nodeId);
                } else {
                    callback.failed("no wearables found");
                }
                client.disconnect();
            }
        }).start();
    }

Вариант 2: проверьте приложение Android Wear

И это преимущество второго варианта. Если вы получаете часы, первое, что вам нужно сделать, чтобы подключить его, - это установить приложение Android Wear на вашем КПК. Таким образом, вы можете использовать PackageManager, чтобы проверить, установлено ли это приложение Android Wear.

Недостатком здесь является то, что вы можете установить приложение для ношения без часов.

Пример кода:

try {
    getPackageManager().getPackageInfo("com.google.android.wearable.app", PackageManager.GET_META_DATA);

    Toast.makeText(this, "The Android Wear App is installed", Toast.LENGTH_SHORT).show();
} catch (PackageManager.NameNotFoundException e) {
    //android wear app is not installed
    Toast.makeText(this, "The Android Wear App is NOT installed", Toast.LENGTH_SHORT).show();
}

Вариант 3: проверьте наличие сопряженных устройств

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

Ниже приведен пример кода, однако это не включает проверку того, являются ли сопряженные устройства носимыми или нет. Это только отправная точка.

Пример кода из getbondeddevices() не возвращает спаренных устройств Bluetooth

BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();

Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
     Toast.makeText(this, "At least one paired bluetooth device found", Toast.LENGTH_SHORT).show();
    // TODO at this point you'd have to iterate these devices and check if any of them is a wearable (HOW?)
    for (BluetoothDevice device : pairedDevices) {
        Log.d("YOUR_TAG", "Paired device: "+ device.getName() + ", with address: " + device.getAddress());
    }
} else {
    Toast.makeText(this, "No paired bluetooth devices found", Toast.LENGTH_SHORT).show();
}

Обратите внимание, что для этого кода требуются разрешения Bluetooth в вашем манифесте.

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

Ответ 3

Прежде всего, ответы верны, если портативное устройство подключено только к Android Watch. Что, если карманное устройство подключено к нескольким устройствам (многожильным), таким как Android Watch, HealthBand, Beacon и т.д., Тогда выше ответы могут не работать.

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

Рекламировать возможности

Чтобы запустить мероприятие на переносном устройстве с переносимого устройства, используйте класс MessageApi для отправки запроса. Поскольку к портативному устройству можно подключить несколько носителей, загрузочное приложение должно определить, что подключенный node способен запускать эту операцию. В своем портативном приложении сообщите, что node, на котором он выполняется, предоставляет определенные возможности.

Чтобы рекламировать возможности вашего карманного приложения:

  • Создайте файл конфигурации XML в каталоге res/values ​​/вашего проекта и назовите его wear.xml.
  • Добавьте ресурс с именем android_wear_capabilities в wear.xml.
  • Определите возможности, которые предоставляет устройство.

<resources>
    <string-array name="android_wear_capabilities">
        <item>android_wear</item>
    </string-array> 
</resources>

Получить узлы с требуемыми возможностями

Изначально вы можете обнаружить способные узлы, вызвав метод CapabilityApi.getCapability(). В следующем примере показано, как вручную получить результаты достижимых узлов с возможностью android_wear. Используйте следующий код в модуле Wear:

public abstract class BaseActivity extends Activity implements MessageApi.MessageListener, NodeApi.NodeListener,
    DataApi.DataListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

private static final String
        SMART_WEAR_CAPABILITY_NAME = "android_wear";

protected GoogleApiClient mGoogleApiClient;
protected ArrayList<String> results;
private String TAG = "BaseActivity::Wear";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
}

private Collection<String> getNodes() {
    results = new ArrayList<>();
    NodeApi.GetConnectedNodesResult nodes =
            Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();

    for (Node node : nodes.getNodes()) {
        Log.d(TAG, node.getId());
        results.add(node.getId());
    }

    return results;
}

@Override
protected void onResume() {
    super.onResume();
    mGoogleApiClient.connect();
}

@Override
protected void onPause() {
    super.onPause();
    Wearable.MessageApi.removeListener(mGoogleApiClient, this);
    Wearable.NodeApi.removeListener(mGoogleApiClient, this);
    Wearable.DataApi.removeListener(mGoogleApiClient, this);
    mGoogleApiClient.disconnect();
}

@Override
public void onConnected(Bundle bundle) {
    Log.d(TAG, "onConnected(): Successfully connected to Google API client");
    Wearable.MessageApi.addListener(mGoogleApiClient, this);
    Wearable.DataApi.addListener(mGoogleApiClient, this);
    Wearable.NodeApi.addListener(mGoogleApiClient, this);
    results = new ArrayList<>();

    getNodeIdOfHandheldDevice();
}

@Override
public void onConnectionSuspended(int i) {
    Log.d(TAG, "onConnectionSuspended(): Connection to Google API client was suspended");
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.e(TAG, "onConnectionFailed(): Failed to connect, with result: " + connectionResult);
}

@Override
public void onPeerConnected(Node node) {
    Log.e(TAG, "onPeerConnected():");
}

@Override
public void onPeerDisconnected(Node node) {
    Log.e(TAG, "onPeerDisconnected():");
}

private void getNodeIdOfHandheldDevice() {
    Wearable.CapabilityApi.getCapability(
            mGoogleApiClient, SMART_WEAR_CAPABILITY_NAME,
            CapabilityApi.FILTER_REACHABLE).setResultCallback(
            new ResultCallback<CapabilityApi.GetCapabilityResult>() {
                @Override
                public void onResult(CapabilityApi.GetCapabilityResult result) {
                    if (result.getStatus().isSuccess()) {
                        updateFindMeCapability(result.getCapability());
                    } else {
                        Log.e(TAG,
                                "setOrUpdateNotification() Failed to get capabilities, "
                                        + "status: "
                                        + result.getStatus().getStatusMessage());
                    }
                }
            });
}

private void updateFindMeCapability(CapabilityInfo capabilityInfo) {
    Set<Node> connectedNodes = capabilityInfo.getNodes();
    if (connectedNodes.isEmpty()) {
        results.clear();
    } else {
        for (Node node : connectedNodes) {
            // we are only considering those nodes that are directly connected
            if (node.isNearby()) {
                results.add(node.getId());
            }
        }
    }
}

}

Подробнее см. Android Dev

Ответ 4

Я использую гораздо более простой метод, подходящий для моего использования, проверьте, установлено ли приложение для Android android:

    try {
        getPackageManager().getPackageInfo("com.google.android.wearable.app", PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException e) {
        //android wear app is not installed
    }

Ответ 5

Проверка парных устройств

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

BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();

Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
    for (BluetoothDevice device : pairedDevices) {
        if(device.getDeviceClass()==BluetoothClass.Device.WEARABLE_WRIST_WATCH){
            Log.d("Found", "Paired wearable: "+ device.getName() + ", with address: " + device.getAddress());
        {
    {
} else {
    Toast.makeText(this, "No paired wearables found", Toast.LENGTH_SHORT).show();
}

Обратите внимание, что для этого кода требуются разрешения Bluetooth в вашем манифесте.

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>