Bağlanacak cihazları discoverPeers() metodu ile keşfetmek istediğimiz zaman tetiklenir. Genellikle requestPeers() metodu ile eşleşen cihazları alma amaçlı kullanılır.
val PRC_ACCESS_FINE_LOCATION = 1
@RequiresApi(Build.VERSION_CODES.M)
private fun getWifiP2PPermissions() {
if (!hasWifiP2PPermission()) {
requestWifiP2PPermissions()
}
}
@RequiresApi(Build.VERSION_CODES.M)
private fun hasWifiP2PPermission(): Boolean {
return checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED
}
@RequiresApi(Build.VERSION_CODES.M)
private fun requestWifiP2PPermissions() {
requestPermissions(
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
PRC_ACCESS_FINE_LOCATION
)
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when(requestCode) {
PRC_ACCESS_FINE_LOCATION ->
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Konum izni gereklidir", Toast.LENGTH_SHORT).show()
finish()
}
}
}
/**
* Wi-Fi P2P için gerekli izinleri alma
*/
@RequiresApi(api = Build.VERSION_CODES.M)
private void getRequiredPermissions() {
if (!hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)) {
requestPermissions(
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
WiFiDirectActivity.PRC_ACCES_FINE_LOCATION
);
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
public boolean hasPermission(String permission) {
return checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
}
@Override
public void onRequestPermissionsResult(
int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults
) {
if (requestCode == PRC_ACCES_FINE_LOCATION) {
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
Log.w(TAG, "onRequestPermissionsResult:Fine location izni gereklidir");
Toast.makeText(this, "İzinler gereklidir 😥", Toast.LENGTH_SHORT)
.show();
}
}
}
📻 WiFi için Broadcast Receiver Tanımlama
📡 Broadcast Alıcısı Tanımlama
open class WifiP2PBroadcastReceiver(
var manager: WifiP2pManager,
var channel: WifiP2pManager.Channel,
var wifiP2pActivity: WifiP2pActivity
) : BroadcastReceiver() {
companion object {
val TAG = this::class.java.simpleName
}
@RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION)
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION -> onStateChanged(intent)
WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION -> onPeerChanged()
WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION ->
onConnectionChanged()
WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION ->
onThisDeviceChanged()
}
}
private fun onStateChanged(intent: Intent): Unit {
Log.d(TAG, "onStateChanged: Wifi P2P durumu değişti")
}
private fun onPeerChanged(): Unit {
Log.d(TAG, "onPeerChanged: WiFi eşleri değişti")
}
private fun onConnectionChanged(): Unit {
Log.d(TAG, "onConnectionChanged: WiFi P2P bağlantısı değişti")
}
private fun onThisDeviceChanged(): Unit {
Log.d(TAG, "onThisDeviceChanged: Cihazın WiFi P2P durumu değişti")
}
}
/**
* Önemli WiFi olaylarını yayınlayan sınıf
* https://developer.android.com/guide/topics/connectivity/wifip2p.html#create-br
*/
public class WiFiDirectBroadcastReciever extends BroadcastReceiver {
public static final String TAG = WiFiDirectBroadcastReciever
.class.getSimpleName();
public static final int reconnect = 1;
private static final String DEVICE_PATTERN = "HUAWEI P20 lite";
WifiP2pManager manager;
Channel channel;
WiFiDirectActivity wifiDirectActivity;
/**
* Eşleşilen cihazların bilgileri
*/
private List<WifiP2pDevice> peers = new ArrayList<>();
public WiFiDirectBroadcastReciever(
WifiP2pManager manager,
Channel channel,
WiFiDirectActivity wifiDirectActivity
) {
super();
this.manager = manager;
this.channel = channel;
this.wifiDirectActivity = wifiDirectActivity;
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// TODO
if (action != null) {
switch (action) {
// ...
}
}
}
}
🎫 Broadcast Alıcısını Kaydetme
▶️ Uygulama çalıştığında alıcının kayıt edilmesi
🧹 Durdurulduğunda kaydın silinmesi gerekir
🎳 Kayıt silinmezse gereksiz yere sistemi yorar ve alıcı kayıtları defalarca kaydedilebilir
class WifiP2pActivity : AppCompatActivity() {
// ...
/**
* WiFi alıcısı için filtreleme
*/
private val wifiFilter = IntentFilter().apply {
addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)
addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION)
addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)
addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION)
}
/**
* Wifi alıcısı
*/
private lateinit var wifiReceiver: WifiDirectBroadcastReceiver
// ...
private fun initWifiP2p(): Unit {
manager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager
channel = manager.initialize(this, mainLooper, null)
// Yeni kısım 👇
wifiReceiver = WifiDirectBroadcastReceiver(manager, channel, this)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getPermissions(Manifest.permission.ACCESS_FINE_LOCATION)
}
}
private fun registerWifiReceiver(): Unit {
registerReceiver(wifiReceiver, wifiFilter)
}
private fun unregisterWifiReceiver(): Unit {
unregisterReceiver(wifiReceiver)
}
override fun onResume() {
super.onResume()
registerWifiReceiver()
}
override fun onPause() {
super.onPause()
unregisterWifiReceiver()
}
}