Невозможно соединить два устройства через Googles Nearby API - PullRequest
0 голосов
/ 20 апреля 2020

Я разрабатываю приложение, которое может передавать локальные файлы c на вашем телефоне на другие устройства. Для подключения нескольких устройств я использую Googles Nearby API. После запуска рекламы и обнаружения на двух устройствах onEndpointFound вызывает найденное устройство на обоих устройствах. Чтобы принять это соединение, приложение должно показать AlertDialog. Это происходит в методе onConnectionInitiated. Но по какой-то причине приложение не попадет в ту часть, где построен AlertDialog.

Кто-нибудь знает, как это исправить?

Это код:

package com.shuzo.musicshare;

import android.Manifest;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

import com.google.android.gms.nearby.Nearby;
import com.google.android.gms.nearby.connection.AdvertisingOptions;
import com.google.android.gms.nearby.connection.ConnectionInfo;
import com.google.android.gms.nearby.connection.ConnectionLifecycleCallback;
import com.google.android.gms.nearby.connection.ConnectionResolution;
import com.google.android.gms.nearby.connection.ConnectionsClient;
import com.google.android.gms.nearby.connection.ConnectionsStatusCodes;
import com.google.android.gms.nearby.connection.DiscoveredEndpointInfo;
import com.google.android.gms.nearby.connection.DiscoveryOptions;
import com.google.android.gms.nearby.connection.EndpointDiscoveryCallback;
import com.google.android.gms.nearby.connection.Payload;
import com.google.android.gms.nearby.connection.PayloadCallback;
import com.google.android.gms.nearby.connection.PayloadTransferUpdate;
import com.google.android.gms.nearby.connection.Strategy;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MusicShare";

    private static final String[] REQUIRED_PERMISSIONS =
            new String[] {
                    Manifest.permission.BLUETOOTH,
                    Manifest.permission.BLUETOOTH_ADMIN,
                    Manifest.permission.ACCESS_WIFI_STATE,
                    Manifest.permission.CHANGE_WIFI_STATE,
                    Manifest.permission.ACCESS_COARSE_LOCATION,
            };

    private static final int REQUEST_CODE_REQUIRED_PERMISSIONS = 1;

    private static final Strategy STRATEGY = Strategy.P2P_STAR;

    EditText usernameEdit;
    Button connectButton;

    private ConnectionsClient connectionsClient;

    // Callbacks for receiving payloads
    private final PayloadCallback payloadCallback =
            new PayloadCallback() {
                @Override
                public void onPayloadReceived(String endpointId, Payload payload) {

                }

                @Override
                public void onPayloadTransferUpdate(String endpointId, PayloadTransferUpdate update) {

                }
            };

    // Callbacks for connections to devices
    private final ConnectionLifecycleCallback connectionLifecycleCallback =
            new ConnectionLifecycleCallback() {
                @Override
                public void onConnectionInitiated(final String endpointId, ConnectionInfo connectionInfo) {
                    Log.i(TAG, "onConnectionInitiated: accepting connection");
                    AlertDialog.Builder alertDialog = new AlertDialog.Builder(getApplicationContext());
                    alertDialog
                            .setTitle(R.string.accept_connection_title + " " + connectionInfo.getEndpointName())
                            .setMessage(R.string.confirm_codes + " " + connectionInfo.getAuthenticationToken())
                            .setPositiveButton(
                                    R.string.accept_connection,
                                    (DialogInterface dialog, int which) ->
                                            connectionsClient.acceptConnection(endpointId, payloadCallback))
                            .setNegativeButton(
                                    android.R.string.cancel,
                                    (DialogInterface dialog, int which) ->
                                            connectionsClient.rejectConnection(endpointId))
                            .setIcon(android.R.drawable.ic_dialog_alert)
                            .show();
                }

                @Override
                public void onConnectionResult(String endpointId, ConnectionResolution result) {
                    switch (result.getStatus().getStatusCode()) {
                        case ConnectionsStatusCodes.STATUS_OK:
                            Log.i(TAG, "onConnectionResult: status ok");
                            Toast.makeText(getApplicationContext(), "Connected", Toast.LENGTH_SHORT).show();
                            break;
                        case ConnectionsStatusCodes.STATUS_CONNECTION_REJECTED:
                            Log.i(TAG, "onConnectionResult: connection rejected");
                            Toast.makeText(getApplicationContext(), "Connection rejected", Toast.LENGTH_SHORT).show();
                            break;
                        case ConnectionsStatusCodes.STATUS_ERROR:
                            Log.i(TAG, "onConnectionResult: error");
                            Toast.makeText(getApplicationContext(), "Connection error", Toast.LENGTH_SHORT).show();
                            break;
                        default:
                            // Unknown status code
                    }
                }

                @Override
                public void onDisconnected(String endpointId) {
                    Log.i(TAG, "Device disconnected");
                }
            };

    private final EndpointDiscoveryCallback endpointDiscoveryCallback =
            new EndpointDiscoveryCallback() {
                @Override
                public void onEndpointFound(String endpointId, DiscoveredEndpointInfo info) {
                    Log.i(TAG, "onEndpointFound: endpoint found, connecting");
                    connectionsClient
                            .requestConnection(getUserNickname(), endpointId, connectionLifecycleCallback)
                            .addOnSuccessListener(
                                    (Void unused) -> {
                                        Log.i(TAG, "onEndpointFound: successful");
                                    })
                            .addOnFailureListener(
                                    (Exception e) -> {
                                        Log.i(TAG, "onEndpointFound: failed");
                                    });
                }

                @Override
                public void onEndpointLost(String endpointId) {

                }
            };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        connectionsClient = Nearby.getConnectionsClient(this);

        connectButton = findViewById(R.id.connectButton);

        connectButton.setOnClickListener(view -> {
            startAdvertising();
            startDiscovery();
            connectButton.setEnabled(false);
        });
    }

    @Override
    protected void onStart() {
        super.onStart();

        if (!hasPermissions(this, REQUIRED_PERMISSIONS)) {
            requestPermissions(REQUIRED_PERMISSIONS, REQUEST_CODE_REQUIRED_PERMISSIONS);
        }
    }

    private static boolean hasPermissions(Context context, String... permissions) {
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(context, permission)
                    != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    private void startAdvertising() {
        AdvertisingOptions advertisingOptions =
                new AdvertisingOptions.Builder().setStrategy(STRATEGY).build();
        connectionsClient
                .startAdvertising(getUserNickname(), getPackageName(), connectionLifecycleCallback, advertisingOptions)
                .addOnSuccessListener(
                        (Void unused) -> {
                            Toast.makeText(getApplicationContext(), R.string.advertising_success, Toast.LENGTH_SHORT).show();
                        })
                .addOnFailureListener(
                        (Exception e) -> {
                            Toast.makeText(getApplicationContext(), R.string.advertising_fail, Toast.LENGTH_SHORT).show();
                        });
    }

    private void startDiscovery() {
        DiscoveryOptions discoveryOptions =
                new DiscoveryOptions.Builder().setStrategy(STRATEGY).build();
        connectionsClient
                .startDiscovery(getPackageName(), endpointDiscoveryCallback, discoveryOptions)
                .addOnSuccessListener(
                        (Void unused) -> {
                            Toast.makeText(getApplicationContext(), R.string.discovery_success, Toast.LENGTH_SHORT).show();
                        })
                .addOnFailureListener(
                        (Exception e) -> {
                            Toast.makeText(getApplicationContext(), R.string.discovery_failed, Toast.LENGTH_SHORT).show();
                        });
    }

    private String getUserNickname() {
        usernameEdit = findViewById(R.id.usernameEdit);
        return usernameEdit.getText().toString();
    }
}

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Использовал другой Android телефон, и он работал полностью!

0 голосов
/ 21 апреля 2020

Учитывая дополнительную информацию в комментариях, это, кажется, проблема Bluetooth Classi c. Я посмотрел в наших записях, и у нас есть оба зарегистрированных устройства, поэтому мы попытаемся воспроизвести на нашем конце.

Некоторые шаги, которые вы можете сделать: 1) Попробуйте перезагрузить устройства и посмотрите, если проблема воспроизводима. 2) Соберите журналы (adb logcat) или отчет об ошибках (adb bugreport) с обоих устройств и прикрепите их к этому сообщению или отправьте их мне по электронной почте прямо по адресу {my usercasts@google.com. Они содержат конфиденциальные данные, поэтому отправляйте их только при наличии тестовых учетных записей на обоих устройствах. Если у вас есть личная учетная запись, то сначала отфильтруйте журналы (adb logcat NearbyConnections: * NearbyMediums: * *: S)

Отказ от ответственности: я работаю над ближайшими подключениями

...