質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

解決済

WifiP2pManager の clearLocalServices()メソッド に渡したActionListenerリスナーが 、ある日を境に、onFailureコールバックを呼ぶようになった。

firstlast
firstlast

総合スコア116

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

1回答

0評価

0クリップ

308閲覧

投稿2022/01/16 10:12

編集2022/01/17 15:50

前提

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

firstlast

2022/01/17 00:21

じんべさま、いつもありがとうございます。 以前、clearLocalServicesを実装してなかったときに、違った問題が発生して後続の処理を実行出来なかった記憶がありますが、おっしゃることを今一度試してみたいと思います。 また、onSuccessに書いていた後続の処理すべてを、1つ外に出してclearLocalServicesと同じレベル、clearLocalServicesの呼び出しの直後に、書いて試してみます。
jimbe

2022/01/17 04:07

P2P や Wifi Direct に詳しい/慣れているわけではありませんで、単に『それらのドキュメントに clearLocalServices が見当たらなかったので。本当に clearLocalServices が「デバイス検出処理の初期化に相当する」のかが分からない』状態です。 ( clearLocalServices のドキュメントを見ても用語に "?" が付く程度にP2P/WifiDirect も分かっておりません ^^;) > clearLocalServicesを実装してなかったときに、違った問題が発生して後続の処理を実行出来なかった こちらのほうからもう一度見直される必要があるかもしれないということですね。
firstlast

2022/01/17 05:47

検証してみたところ、clearLocalServiceを呼び出さなくても、後続の処理は問題なく動作しました。 現象が発生してるデバイスだけでなく、他のデバイスでも試してみましたが同様でした。 一旦、clearLocalServiceの部分をコメントアウトすることにしました。 問題解決です。ありがとうございました。 因みに、ソースコードを変更していないのに、onSuccessが呼ばれずに、onFailureが呼ばれるようになったのは、pixelのアンドロイドOSが何かの都合で改変されたんだろうと思います。企業ごとにAPIの挙動が異なることもあると認識できてよかったです。各ベンダーの更新履歴のようなものがあれば教えて頂きたいところです。
firstlast

2022/01/17 05:52

jimbeさんの回答をベストアンサーにしたいと思いますので、よかったら回答の方にも何か投稿してください。
jimbe

2022/01/17 06:38

アプリとしては動作して解決かもしれませんが、結局「何故clearLocalService が BUSY を返したのか(もしくは何故今まで返さなかったのか)」等は分かっていないわけですが…(悩) 14:47 にお書きになったコメントの「一旦、clearLocalServiceの部分をコメントアウトすることにしました。」までの文を自己回答としてお書きになって BA とし、本当に動作が判明したときに回答を修正もしくは新たに追加して BA を選び直すする等は如何でしょうか。( BA 後もそれらが出来ます。 )
firstlast

2022/01/17 06:48

そうさせて頂きます。返信ありがとうございます。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。