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

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

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

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

2839閲覧

【Android】モバイルデータ通信をオフ、またはインターネットなしのWifiの接続を保持したい

takk_014

総合スコア53

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/12/06 05:00

編集2021/12/06 05:12

閲覧いただきありがとうござます。
ラズパイのWiFiAndroidで接続し、Androidアプリからラズパイに接続したカメラの映像を閲覧できるようにしたいです。
モバイルデータ通信がオフの状態では問題ないです。
しかしモバイルデータ通信がオンの状態ではラズパイのWiFiがインターネットなしなのでモバイルデータ通信が優先されるようになってしまいラズパイのカメラの映像が受信できないです。
(この仕様はAndroid9.0から)

過去に全く同じことをしようとしている質問者を発見しました。
しかし結局問題の解決には至っていない様です。
https://teratail.com/questions/245073

そのためやむ終えずアプリ起動時にモバイルデータ通信をオフにしてしまおうと考えました。
しかしAndroid5.0以降はモバイルデータ通信のオンオフはroot権限がないとできない様です。
参考:https://stackoverflow.com/questions/52850101/how-can-i-turn-off-4g-data-programmatically
GooglePlay上にたくさんあったモバイルデータ通信をオンオフ操作するアプリたちも今は動作しないか設定画面を開くようになっていました。

それでも試しにプログラムからモバイルデータ通信をオフにしようとしてみました。
しかし下記を実行した瞬間にアプリが落ちます。

kotlin

1// アプリ起動時に実行 2var method: Method = connectivityManager.javaClass.getMethod("setMobileDataEnabled", Boolean.TYPE) 3method.setAccessible(true) 4method.invoke(connectivityManager, false)

落ちた時のログ

2021-12-06 14:06:12.487 25673-25673/------ E/AndroidRuntime: FATAL EXCEPTION: main Process: com.----------------, PID: 25673 java.lang.RuntimeException: Unable to start activity ComponentInfo{-------------.MainActivity}: java.lang.NoSuchMethodException: android.net.ConnectivityManager.setMobileDataEnabled [boolean] at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3835) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4011) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) Caused by: java.lang.NoSuchMethodException: android.net.ConnectivityManager.setMobileDataEnabled [boolean] at java.lang.Class.getMethod(Class.java:2072) at java.lang.Class.getMethod(Class.java:1693) at com.-------------r.MainActivity.onCreate(MainActivity.kt:76) at android.app.Activity.performCreate(Activity.java:8207) at android.app.Activity.performCreate(Activity.java:8191) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3808) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4011) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

スッタクオーバーフローに載っていた下記も試してみましたが何も起きず...

kotlin

1private fun disableMobileNetwork(context: Context) { 2 val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager 3 val request: NetworkRequest.Builder? 4 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 5 request = NetworkRequest.Builder() 6 request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) 7 connectivityManager.requestNetwork( 8 request.build(), 9 object : ConnectivityManager.NetworkCallback() { 10 override fun onAvailable(network: Network) { 11 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 12 ConnectivityManager.setProcessDefaultNetwork(network) 13 } 14 } 15 } 16 ) 17 } 18 }

モバイルデータ通信のオンオフも通信の優先順位もAndroidOSが制御してしまっているため開発者側で操作するのは今はもう無理なのでしょうか?
無理であるのならば無理であると教えていただければ諦めがつきます。
しかし何か回避策があれば教えていただきたいです。
よろしくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2021/12/06 05:04

>瞬間にアプリが落ちます 落ちた時のログはないのでしょうか。
takk_014

2021/12/06 05:09

すみません、只今ログを追記しました。 ご確認お願い致します。
guest

回答1

0

自己解決

なんとか自己解決しました。
https://qiita.com/wasnot/items/74dcd47fd5f33e226e05
上記のサイトを参考にして下記のように書き換えました。

kotlin

1// WiFiに接続後に記述 2// モバイルデータよりWiFi通信を優先する処理 3val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager 4val builder = NetworkRequest.Builder() 5builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) 6val networkRequest = builder.build() 7val mCallback: NetworkCallback = MyCallback() 8connectivityManager.requestNetwork(networkRequest, mCallback) 9Toast.makeText(this, "WiFiを優先", Toast.LENGTH_SHORT).show()

kotlin

1@RequiresApi(Build.VERSION_CODES.LOLLIPOP) 2internal class MyCallback : NetworkCallback() { 3 // Networkに接続されたときに呼ばれる 4 override fun onAvailable(network: Network) { 5 super.onAvailable(network) 6 /* 最終的にWifiを優先することを設定する処理 */ 7 ConnectivityManager.setProcessDefaultNetwork(network) 8 Log.d("prirityWiFi", "WiFiを優先") 9 } 10 // Networkを失った時、そもそも失敗した時に呼ばれる 11 override fun onLost(network: Network) { 12 super.onLost(network) 13 Log.d("prirityWiFi", "WiFiを優先失敗") 14 } 15}

Android11実機にて動作確認済みです。

投稿2021/12/07 08:11

takk_014

総合スコア53

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問