Samsung 10 plus не разрешит открытие Wi-Fi P2P - PullRequest
0 голосов
/ 04 марта 2020

Я написал приложение Android, позволяющее устройству обнаруживать близлежащие устройства с помощью обнаружения Wi-Fi P2P. Я слежу за этим делом c.

Приложение прекрасно работает на моем планшете Samsung Tab E - я могу сканировать и находить другие устройства, когда приложение работает на планшете , Но я не могу даже активировать процесс обнаружения пиров при запуске приложения на моем Samsung Galaxy S10 Plus. Мой Samsung s10 Plus даже не появится в списке доступных пиров моего планшета, если я не вручную go войду в настройки Galaxy S10 Plus и не включу Wi-Fi Discovery Mode. В этот момент мой планшет Tab E может «видеть» мой Galaxy S10 Plus, но как только я выхожу из экрана настроек на Galaxy s10 Plus, обнаружение Wi-Fi отключается, и я больше не могу видеть его как потенциальный одноранговый узел p2p.

Есть ли способ разрешить обнаружение пиров на Samsung s10 Plus? Я не могу протестировать свое приложение без него, и, скорее всего, мне не придется приобретать другую вкладку E для проверки соединения p2p.

Ниже приведен код, который запускает мое приложение для справки:

import androidx.appcompat.app.AppCompatActivity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.net.wifi.WifiManager;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pManager;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    Button btnOnOff, btnDiscover, btnSend;
    ListView listView;
    TextView read_msg_box, connectionStatus;
    EditText writeMsg;

    //For programmatically turning wifi on and off:
    WifiManager wifiManager;
    WifiP2pManager mManager;
    WifiP2pManager.Channel mChannel;

    BroadcastReceiver mReceiver;
    IntentFilter mIntentFilter = new IntentFilter();

    //For keeping track of available clients to connect to
    List<WifiP2pDevice> peers = new ArrayList<WifiP2pDevice>();
    String[] deviceNameArray;
    WifiP2pDevice[] deviceArray;


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

        //initialWork();
        //initializeButtonOnClickListeners();

        mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
        mChannel = mManager.initialize(this, getMainLooper(), null);
        mReceiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this);

        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

        btnDiscover = (Button)findViewById(R.id.discover);
        connectionStatus = (TextView) findViewById(R.id.connectionStatus);

//        btnSend = (Button)findViewById(R.id.sendButton);
        listView = (ListView)findViewById(R.id.peerListView);
//        read_msg_box = (TextView) findViewById(R.id.readMsg);
//        writeMsg = (EditText)findViewById(R.id.writeMsg);

        wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        initializeOnClickListeners();
    }


    private void initializeOnClickListeners() {

        //Set up functionality for when the discover button is clicked.
        btnDiscover.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "looking for a new peer", Toast.LENGTH_SHORT).show();
                mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
                    @Override
                    public void onSuccess() {
                        connectionStatus.setText("Discovery Started");
                    }

                    @Override
                    public void onFailure(int reason) {
                        connectionStatus.setText("Discovery Failed to start");
                    }
                });
            }
        });
    }

    //Define the logic for when a new peer is discovered
    WifiP2pManager.PeerListListener peerListListener = new WifiP2pManager.PeerListListener() {
        @Override
        public void onPeersAvailable(WifiP2pDeviceList peerList) {
            if(!peerList.getDeviceList().equals(peers)) {
                //clear the peers
                peers.clear();

                //store device list
                peers.addAll(peerList.getDeviceList());

                deviceNameArray = new String[peerList.getDeviceList().size()];
                deviceArray = new WifiP2pDevice[peerList.getDeviceList().size()];
                int index = 0;

                for(WifiP2pDevice device : peerList.getDeviceList()) {
                    deviceNameArray[index] = device.deviceName;
                    deviceArray[index] = device;
                    index++;
                }

                ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(),
                        android.R.layout.simple_list_item_1,
                        deviceNameArray);

                listView.setAdapter(adapter);
            }

            if(peers.size() == 0) {
                Toast.makeText(getApplicationContext(), "No Devices Found :(", Toast.LENGTH_SHORT).show();
            }

        }
    };



    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(mReceiver, mIntentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mReceiver);
    }
}

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.p2p.WifiP2pManager;
import android.widget.Toast;

public class WiFiDirectBroadcastReceiver extends BroadcastReceiver {
    private WifiP2pManager mManager;
    private WifiP2pManager.Channel mChannel;
    private MainActivity mActivity;

    WifiP2pManager.PeerListListener myPeerListListener;

    public WiFiDirectBroadcastReceiver(WifiP2pManager mManager, WifiP2pManager.Channel mChannel, MainActivity mActivity) {
        this.mManager = mManager;
        this.mChannel = mChannel;
        this.mActivity = mActivity;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        System.out.println("The following action was received: " + action);

        if(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)){
            int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);

            //if wifi is enabled
            if(state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
                Toast.makeText(context, "Wifi is ON", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(context, "Wifi is OFF", Toast.LENGTH_LONG).show();
            }
        } else if(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
            Toast.makeText(context, "INSIDE THE P2P_PEERS_CHANGED_ACTION", Toast.LENGTH_LONG).show();
            if(mManager != null) {
                mManager.requestPeers(mChannel, mActivity.peerListListener);
                Toast.makeText(context, "A new peer has been found!!!", Toast.LENGTH_LONG).show();
            }
        } else if(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
            //do something
        } else if(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
            //do something
        }
    }
}

1 Ответ

0 голосов
/ 04 марта 2020

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

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

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.nsdchat"
    ...
    <uses-permission
        android:required="true"
        android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission
        android:required="true"
        android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission
        android:required="true"
        android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission
        android:required="true"
        android:name="android.permission.INTERNET"/>

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

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.CHANGE_WIFI_STATE)
        != PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted
}
...

Во-вторых, посмотрите на версия библиотеки кода. Поскольку s10 + является довольно новым, Android фактически улучшил конфиденциальность и безопасность, начиная с Android 8.0. Код, который вы написали, может быть устаревшим из-за версии библиотеки, а некоторые API могут быть устаревшими.

...