WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION 多次调用

问题描述

你好,我正在创建一个应用程序,当 wifi 开启或关闭时通过显示吐司通知用户我有两个问题:

1)。如果我直接从 android 系统而不是通过应用程序打开/关闭 wifi,它会显示奇怪的行为,比如当我打开“打开”wifi 时,它给我吐司“WIFI 关闭”2 次,然后“WIFI 开启”2 次代替只是敬酒“WIFI IS ON”1次。 当我关闭关闭”wifi 时,它会给我 3 次而不是 1 次吐司“WIFI 关闭”。

2).当热点打开时,广播接收器总是显示wifi“关闭”。

这是我遇到问题的 broadcastReceiver 类:

package com.test.beer_finder;

import android.Manifest;
import android.app.Activity;
import android.content.broadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.wifi.p2p.wifip2pDeviceList;
import android.net.wifi.p2p.wifip2pManager;
import android.net.wifi.p2p.wifip2pManager.Channel;
import android.util.Log;
import android.widget.Toast;

import androidx.core.app.ActivityCompat;

import static android.content.ContentValues.TAG;

//import java.nio.channels.Channel;

public class WifiDirectbroadcastReceiver extends broadcastReceiver {
    private wifip2pManager manager;
    private Channel channel;
    private MainActivity activity;

    public WifiDirectbroadcastReceiver(wifip2pManager manager,Channel channel,MainActivity activity) {
        this.manager = manager;
        this.channel = channel;
        this.activity = activity;
    }

    @Override
    public void onReceive(Context context,Intent intent) {
        String action = intent.getAction();
        if (wifip2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
            int state = intent.getIntExtra(wifip2pManager.EXTRA_WIFI_STATE,-1);
            if (state == wifip2pManager.WIFI_P2P_STATE_ENABLED) {
                //activity.toast(1);
                Toast.makeText(context,"WIFI IS ON",Toast.LENGTH_SHORT).show();
                Log.e(TAG,String.valueOf(state));
            } else if(state==wifip2pManager.WIFI_P2P_STATE_disABLED) {
                Toast.makeText(context,"WIFI IS OFF",String.valueOf(state));
               // activity.toast(0);
            }
        }
        else if (wifip2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
            if (manager != null) {
                if (ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    // Todo: Consider calling
                    //    ActivityCompat#requestPermissions
                    // here to request the missing permissions,and then overriding
                    //   public void onRequestPermissionsResult(int requestCode,String[] permissions,//                                          int[] grantResults)
                    // to handle the case where the user grants the permission. See the documentation
                    // for ActivityCompat#requestPermissions for more details.
                    return;
                }
                manager.requestPeers(channel,new wifip2pManager.PeerListListener() {

                    public void onPeersAvailable(wifip2pDeviceList peers) {

                       // activity.displayPeers(peers);

                    }
                });
            }

        } else if (wifip2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {

            // Connection state changed! We should probably do something about
            // that.

        } else if (wifip2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)){
//            DeviceListFragment fragment=(DeviceListFragment) activity.getFragmentManager().findFragmentById(R.id.frag_list);
//            fragment.updateThisDevice((wifip2pDevice) intent.getParcelableExtra(wifip2pManager.EXTRA_WIFI_P2P_DEVICE));
        }
    }


}

MainActivity.class

package com.test.beer_finder;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.broadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
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.net.wifi.p2p.wifip2pManager.PeerListListener;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.PersistableBundle;
import android.provider.Settings;
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;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {
    Button btnOnOff,btndiscover,btnSend;
    ListView listView;
    TextView read_msg_Box,ConnectionStatus;
    EditText writeMsg;
    WifiManager wifiManager;

    private final IntentFilter intentFilter = new IntentFilter();
    wifip2pManager.Channel channel;
    wifip2pManager manager;
    broadcastReceiver receiver;
    private List<wifip2pDevice> peers = new ArrayList<wifip2pDevice>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wifiManager= (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        //receiver = new WifiDirectbroadcastReceiver(manager,channel,this);
        intentFilter.addAction(wifip2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
        intentFilter.addAction(wifip2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
        intentFilter.addAction(wifip2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
        intentFilter.addAction(wifip2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
        manager = (wifip2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
        channel = manager.initialize(this,getMainLooper(),null);

       // wifiManager.setWifiEnabled(true);
        btnOnOff=(Button) findViewById(R.id.onOff);
        read_msg_Box=(TextView) findViewById(R.id.readMsg);
        //receiver = new WifiDirectbroadcastReceiver(manager,this);
        //exqListener();
    }

    public void wifiToggle(View view) {

        if(wifiManager.isWifiEnabled()){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                Intent panelIntent = new Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY);
                startActivityForResult(panelIntent,0);
            } else {
                wifiManager.setWifiEnabled(false);
            }
        }
        else{
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                Intent panelIntent = new Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY);
                startActivityForResult(panelIntent,0);
            } else {
                wifiManager.setWifiEnabled(true);
            }
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        receiver = new WifiDirectbroadcastReceiver(manager,this);
        registerReceiver(receiver,intentFilter);
    }

    @Override
    public void onPause() {
        super.onPause();
        unregisterReceiver(receiver);
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)