前提
Wi-Fi Direct通信を行うアプリをAndroid Sutudioを使ってコーディング/デバッグしています。
複数のデバイス間で滞りなく通信が行えることを確認するために、以下の3台のデバイスの実機をUSB接続でつなげて、デバッグしていたのですが、ある日を境にGoogle Pixel 4aだけ、違った動きをするようになりました。
具体的に言うと、デバイス検出処理の初期化に相当すると思われるclearLocalServicesメソッドで、それまで呼ばれていたonSuccessコールバックが呼ばれずに、onFailureコールバックが呼ばれるようになりました。
- Google Pixel 4a
- Sony XQ-AU52(Xperia)
- Sharp SH-M19(AQUOS sense6)
※デバイス検出処理は、p2pネットワークを構成するために、接続する相手を選ぶための手順の一部だと理解しています。
実現したいこと
- 発生している現象の原因究明
- その対策
ご教授、ご指導の程、宜しくお願い致します。
ソースコードの該当箇所
"WifiP2pManager" の "clearLocalServices" に渡したActionListenerの "onFailure" コールバック関数が呼ばれてしまいます。
Kotlin
manager.clearLocalServices(channel, object : WifiP2pManager.ActionListener{ override fun onSuccess() { Log.d(tag, "---onCreate---onSuccess") } override fun onFailure(p0: Int) { Log.d(tag, String.format("---onCreate---onFailure---p0:[%d]", p0)) return } })
ソースコード
検証用に簡略化したAndroid Studioプロジェクトのソースコードを下に載せます。
不具合の内容
コールバック関数のcodeという名前のパラメーターに、2が帰ってきます。
Android for Developersのドキュメントには、2: Busy と書かれています。
開発環境(Android Studioのバージョン)
Android Studio Arctic Fox | 2020.3.1 Patch 4
Build #AI-203.7717.56.2031.7935034, built on November 21, 2021
Runtime version: 11.0.10+0-b96-7249189 amd64
VM: OpenJDK 64-Bit Server VM by Oracle Corporation
Windows 10 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 1280M
Cores: 12
Registry: documentation.show.toolbar=true, external.system.auto.import.disabled=true
Non-Bundled Plugins: com.intellij.marketplace, com.thoughtworks.gauge, org.jetbrains.kotlin, org.intellij.plugins.markdown
ソースコード
AndroidManifest.xml
xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="firstlast20180521.errorsample"> <!-- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />--> <!-- <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>--> <!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />--> <!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- <uses-permission android:name="android.permission.INTERNET" />--> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.ErrorSample"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
MainActivity.kt
Kotlin
package firstlast20180521.errorsample import android.content.Context import android.net.wifi.p2p.WifiP2pManager import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log class MainActivity : AppCompatActivity() { private lateinit var manager: WifiP2pManager private lateinit var channel: WifiP2pManager.Channel companion object{ const val tag: String = "MainActivity" } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) Log.d(tag, "---onCreate---") manager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager channel = manager.initialize(this, mainLooper, null) manager.clearLocalServices(channel, object : WifiP2pManager.ActionListener{ override fun onSuccess() { Log.d(tag, "---onCreate---onSuccess") } override fun onFailure(p0: Int) { Log.d(tag, String.format("---onCreate---onFailure---p0:[%d]", p0)) return } }) } }
app/build.gradle
Kotlin
plugins { id 'com.android.application' id 'kotlin-android' } android { compileSdk 31 defaultConfig { applicationId "firstlast20180521.errorsample" minSdk 28 targetSdk 31 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } } dependencies { implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.4.0' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.2' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' }
関連URL
WifiP2pManager.clearLocalServices
WifiP2pManager.ActionListener
まだ回答がついていません
会員登録して回答してみよう