问题描述
你好,我正在创建一个应用程序,当 wifi 开启或关闭时通过显示吐司通知用户。我有两个问题:
1)。如果我直接从 android 系统而不是通过应用程序打开/关闭 wifi,它会显示奇怪的行为,比如当我打开“打开”wifi 时,它给我吐司“WIFI 关闭”2 次,然后“WIFI 开启”2 次代替只是敬酒“WIFI IS ON”1次。 当我关闭“关闭”wifi 时,它会给我 3 次而不是 1 次吐司“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 (将#修改为@)