65677


# 質問の記事が3万文字を超えてしまったので、こちらに記載します。

## 元の質問はこちら=><https://ja.stackoverflow.com/a/65665/34348>

# ・調査内容

# ※Jの調査内容は間違いです!!!!!!

### G.Ogawaさんの回答を受けた訂正

WeatherInfoActivity.javaのdoInBackgroundメソッド内を書き換えました。

[code]

            private final String TAG = "doInBackground";
    
            //        別スレッドで非同期処理が実行され、その時に行う処理内容
            @Override
            public String doInBackground(String... params) {
    //            MainAvtivityからgetIntentで取得した都道府県のidがparamsに格納されている。ここで、paramsは可変長変数であり、リストのような振る舞いをすることがわかっている。
                String id = params[0];
    //            ここで、APIを取得するためのURLをString型の変数に代入しておく。なお、ここでidが末尾につくことで、各都市に該当するURLにアクセス可能。
                String urlStr = "http://weather.livedoor.com/forecast/webservice/json/v1?city=" + id;
    
    //            ここで、HttpURLConnectionクラスのオブジェクトconを定義し、nullを代入する。
    //            同様に、InputStreamクラスのオブジェクトisを宣言し、nullを代入する。
    //            結果を代入するresultには、空文字を代入しておく。これに以下の処理ないで何かしらの文字列を代入することになる。
                HttpURLConnection con = null;
                InputStream is = null;
                String result = "";
    
                try {
    //                URLクラス＝World Wide Web上のリソースへのポインタを表すクラス。リソースはファイルやディレクトリのような単純なものよりも、データベースや検索エンジンに対するクエリーなど、複雑なオブジェクトへの参照であることもある。
    //                URLの種類や形式によっては、公式リファレンスの以下を参照(https://docs.oracle.com/javase/jp/6/api/java/net/URL.html)。ここでは、そのURLクラスのオブジェクトurlを宣言した。
                    URL url = new URL(urlStr);
    //                ここで、HTTPConnectionのオブジェクトconに、openConnectionメソッドを使用して取得した何かを代入する。
                    con = (HttpURLConnection) url.openConnection();
    //                ここで、HTTP通信のGETメソッドを指定している。
                    con.setRequestMethod("GET");
                    con.setDoInput(true);
                    con.setInstanceFollowRedirects(false);
                    con.setDoOutput(false);
    //                ここで、接続を開始する。
                    con.connect();
                    int responseCode = con.getResponseCode();
                    System.out.println("バグの内容を記載します");
                    System.out.println(responseCode);
                    Log.d(TAG, String.format("responseCode = %d", responseCode));
                    switch (responseCode) {
                        case HttpURLConnection.HTTP_OK:
                                //ここで、nullにしておいたisに、conに対してgetInputStreamメソッドを使用したものを代入する。ここが問題だと思われる。InputStreamが機能していない。
                            is = con.getInputStream();
                                //resultに、is2Stringメソッドに引数として、isを与えたものを代入する。この後に、以下の処理でそれぞれの接続等々を切断し、結果としてresultを返す。
                            result = is2String(is);
                            break;
                        default:
                            // responseCodeが200(HTTP OK)でない場合は何かのエラーでうまくいってません。
                            break;
                    }
    
    
    //                ここで、nullにしておいたisに、conに対してgetInputStreamメソッドを使用したものを代入する。
    //                is = con.getInputStream();
    ////                resultに、is2Stringメソッドに引数として、isを与えたものを代入する。この後に、以下の処理でそれぞれの接続等々を切断し、結果としてresultを返す。
    //                result = is2String(is);
    
                } catch (MalformedURLException ex) {
                } catch (IOException ex) {
                    System.out.println("情報取得に失敗しました");
                    System.out.println(con);
                    System.out.println(is);
                } finally {
                    if (con != null) {
                        con.disconnect();
                    }
    
                    if (is != null) {
                        try {
                            is.close();
                        } catch (IOException ex) {
                        }
                    }
                }
                return result;
            }
    
    
[/code]

### H.Kohei TAMURAさんの回答を受けて訂正。(調査終了、Iに移行)

参考記事=><https://itsakura.com/java_printstacktrace>

スタックで積まれているタスクを、スタックの処理方法に従って出力している。  
スタックについて知らなかったので追記しておきます。  
スタックはキューの逆で、最後に格納したデータから順に処理を行う、後入れ先出し方式のデータ構造のこと。実行されるタスクが順に先に入り、一番後に積まれたものから実行されるイメージ。

### I.「Cleartext HTTP traffic to weather.livedoor.com not
permitted」の内容についてググり、解決策を試す(調査終了)

直訳は、「HTTP通信が、livedoor社のドメインに対して許可されてない。」

ドメイン名を省いてヒットした上位の記事が以下。  
・<https://qiita.com/b_a_a_d_o/items/afa0d83bbffdb5d4f6be>  
・<https://stackoverflow.com/questions/45940861/android-8-cleartext-http-
traffic-not-permitted>

どちらもAndroidManifestに何やら書き込まないといけないことが共通しているので、その記述内容を反映させ、アプリの挙動を再度確認する。  
選択した情報は新しい方が良いと判断し、Qiitaの記事を参照した。

### J.「no activity for token android.os.BinderProxy@726084b」について調査し、解決策を見つける。

直訳は、「tokenのためのアクティビティーが存在しない。」らしいが、何を言ってるのか全くわからない。  
とりあえず、＠以降を省いて調査中。

### K.Iで参考にしていないスタックオーバーフローの記事を参照し、差分を記述する。

Option3を追記する。  
AndroidManifest.xml

[code]

    android:usesCleartextTraffic="true"
    
[/code]

### L.Kの結果で得られた内容を調べる。

<https://stackoverflow.com/questions/56266801/java-net-socketexception-socket-
failed-eperm-operation-not-permitted>  
このサイトに書いてあるエミュレーターからアプリをアンインストールを試し、アプリを再び起動してみる。

# ・調査結果

### Gの結果

[code]

    Log.d(TAG, String.format("responceCode = %d", responceCode))
    
[/code]

を記述しているので、LogcatのDebug欄から、HTTP通信の結果がどの番号なのかを確認しようとしたが、それと思わしきLogが存在しない。  
「responceCode = ~~~」の~~~に該当する部分にHTTPレスポンスのステータスコードが表示されるはずだが、表示されていない。  
次に調べることは、LogがLogcatに出力されない、になります。順次、更新します。  
以下、Logcatの内容。

[code]

    2020-04-16 16:25:20.291 30760-30760/? I/ple.api_exampl: Not late-enabling -Xcheck:jni (already on)
    2020-04-16 16:25:20.570 30760-30760/? E/ple.api_exampl: Unknown bits set in runtime_flags: 0x8000
    2020-04-16 16:25:20.570 30760-30760/? W/ple.api_exampl: Unexpected CPU variant for X86 using defaults: x86
    2020-04-16 16:25:21.135 30760-30760/com.example.api_example W/ple.api_exampl: JIT profile information will not be recorded: profile file does not exits.
    2020-04-16 16:25:21.136 30760-30760/com.example.api_example I/chatty: uid=10138(com.example.api_example) identical 10 lines
    2020-04-16 16:25:21.136 30760-30760/com.example.api_example W/ple.api_exampl: JIT profile information will not be recorded: profile file does not exits.
    2020-04-16 16:25:21.192 30760-30760/com.example.api_example I/InstantRun: starting instant run server: is main process
    2020-04-16 16:25:21.450 30760-30809/com.example.api_example D/libEGL: Emulator has host GPU support, qemu.gles is set to 1.
    2020-04-16 16:25:21.451 30760-30809/com.example.api_example W/libc: Unable to set property "qemu.gles" to "1": connection failed; errno=13 (Permission denied)
    2020-04-16 16:25:21.506 30760-30809/com.example.api_example D/libEGL: loaded /vendor/lib/egl/libEGL_emulation.so
    2020-04-16 16:25:21.527 30760-30809/com.example.api_example D/libEGL: loaded /vendor/lib/egl/libGLESv1_CM_emulation.so
    2020-04-16 16:25:21.531 30760-30809/com.example.api_example D/libEGL: loaded /vendor/lib/egl/libGLESv2_emulation.so
    2020-04-16 16:25:21.441 30760-30760/com.example.api_example W/RenderThread: type=1400 audit(0.0:161): avc: denied { write } for name="property_service" dev="tmpfs" ino=7821 scontext=u:r:untrusted_app:s0:c138,c256,c512,c768 tcontext=u:object_r:property_socket:s0 tclass=sock_file permissive=0 app=com.example.api_example
    2020-04-16 16:25:21.759 30760-30760/com.example.api_example W/ple.api_exampl: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed)
    2020-04-16 16:25:21.760 30760-30760/com.example.api_example W/ple.api_exampl: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
    2020-04-16 16:25:22.071 30760-30807/com.example.api_example D/HostConnection: HostConnection::get() New Host Connection established 0xdb650190, tid 30807
    2020-04-16 16:25:22.072 30760-30807/com.example.api_example D/HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_YUV420_888_to_NV21 ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_gles_max_version_3_0 
    2020-04-16 16:25:22.082 30760-30807/com.example.api_example W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
    2020-04-16 16:25:22.089 30760-30807/com.example.api_example D/EGL_emulation: eglCreateContext: 0xdb61a180: maj 3 min 0 rcv 3
    2020-04-16 16:25:22.104 30760-30807/com.example.api_example D/EGL_emulation: eglMakeCurrent: 0xdb61a180: ver 3 0 (tinfo 0xdb60f6f0)
    2020-04-16 16:25:22.145 30760-30807/com.example.api_example W/Gralloc3: mapper 3.x is not supported
    2020-04-16 16:25:22.149 30760-30807/com.example.api_example D/HostConnection: createUnique: call
    2020-04-16 16:25:22.150 30760-30807/com.example.api_example D/HostConnection: HostConnection::get() New Host Connection established 0xdb6502d0, tid 30807
    2020-04-16 16:25:22.150 30760-30807/com.example.api_example D/HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_YUV420_888_to_NV21 ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_gles_max_version_3_0 
    2020-04-16 16:25:22.150 30760-30807/com.example.api_example D/eglCodecCommon: allocate: Ask for block of size 0x1000
    2020-04-16 16:25:22.150 30760-30807/com.example.api_example D/eglCodecCommon: allocate: ioctl allocate returned offset 0x3ffff0000 size 0x2000
    2020-04-16 16:25:22.165 30760-30807/com.example.api_example D/EGL_emulation: eglMakeCurrent: 0xdb61a180: ver 3 0 (tinfo 0xdb60f6f0)
    2020-04-16 16:55:22.443 30760-30760/com.example.api_example W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@7553d68
    2020-04-16 16:55:22.824 30760-30951/com.example.api_example D/NetworkSecurityConfig: No Network Security Config specified, using platform default
    2020-04-16 16:55:22.881 30760-30807/com.example.api_example D/EGL_emulation: eglMakeCurrent: 0xdb61a180: ver 3 0 (tinfo 0xdb60f6f0)
    2020-04-16 16:55:23.000 30760-30951/com.example.api_example I/System.out: 情報取得に失敗しました
    2020-04-16 16:55:23.000 30760-30951/com.example.api_example I/System.out: com.android.okhttp.internal.huc.HttpURLConnectionImpl:http://weather.livedoor.com/forecast/webservice/json/v1?city=280010
    2020-04-16 16:55:23.000 30760-30951/com.example.api_example I/System.out: null
    
[/code]

### Hの結果

出力されたログが以下に変わった。

[code]

    2020-04-16 17:48:50.326 31382-31413/com.example.api_example I/System.out: 情報取得に失敗しました
    2020-04-16 17:48:50.326 31382-31413/com.example.api_example W/System.err: java.io.IOException: Cleartext HTTP traffic to weather.livedoor.com not permitted
    2020-04-16 17:48:50.326 31382-31413/com.example.api_example W/System.err:     at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:124)
    2020-04-16 17:48:50.326 31382-31413/com.example.api_example W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:462)
    2020-04-16 17:48:50.326 31382-31413/com.example.api_example W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
    2020-04-16 17:48:50.326 31382-31413/com.example.api_example W/System.err:     at com.example.api_example.WeatherInfoActivity$WeatherInfoReceiver.doInBackground(WeatherInfoActivity.java:97)
    2020-04-16 17:48:50.327 31382-31413/com.example.api_example W/System.err:     at com.example.api_example.WeatherInfoActivity$WeatherInfoReceiver.doInBackground(WeatherInfoActivity.java:54)
    2020-04-16 17:48:50.327 31382-31413/com.example.api_example W/System.err:     at android.os.AsyncTask$3.call(AsyncTask.java:378)
    2020-04-16 17:48:50.327 31382-31413/com.example.api_example W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    2020-04-16 17:48:50.327 31382-31413/com.example.api_example W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
    2020-04-16 17:48:50.327 31382-31413/com.example.api_example W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    2020-04-16 17:48:50.327 31382-31413/com.example.api_example W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    2020-04-16 17:48:50.327 31382-31413/com.example.api_example W/System.err:     at java.lang.Thread.run(Thread.java:919)
    2020-04-16 17:48:50.328 31382-31413/com.example.api_example I/System.out: com.android.okhttp.internal.huc.HttpURLConnectionImpl:http://weather.livedoor.com/forecast/webservice/json/v1?city=270000
    2020-04-16 17:48:50.328 31382-31413/com.example.api_example I/System.out: null
    2020-04-16 17:48:50.370 31382-31403/com.example.api_example D/EGL_emulation: eglMakeCurrent: 0xe36f9940: ver 3 0 (tinfo 0xee9893f0)
    2020-04-16 17:48:50.406 31382-31403/com.example.api_example D/EGL_emulation: eglMakeCurrent: 0xe36f9940: ver 3 0 (tinfo 0xee9893f0)
    2020-04-16 17:48:50.635 31382-31403/com.example.api_example D/EGL_emulation: eglMakeCurrent: 0xe36f9940: ver 3 0 (tinfo 0xee9893f0)
    
[/code]

この部分に問題があるのでググっている。

[code]

    2020-04-16 17:48:50.326 31382-31413/com.example.api_example W/System.err: java.io.IOException:Cleartext HTTP traffic to weather.livedoor.com not permitted
    
[/code]

### Iの結果(調査中)

手順  
1.res/の下にxmlディレクトリを作成し、net_work_security_config.xmlを記述した。  
(<https://developer.android.com/guide/topics/resources/providing-
resources?hl=ja> を参照。xmlディレクトリについて何も知らなかったので。)  
net_work_security_config.xml

[code]

    <?xml version="1.0" encoding="utf-8"?>
    
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">weather.livedoor.com</domain>
        </domain-config>
    </network-security-config>
    
[/code]

2.AndroidManifest.xmlのapplicationタグの中に、android:networkSecurityConfigを追加。  
AndroidManifest.xml

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.api_example">
    
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    
    
    
    
        <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/AppTheme"
    //      ココ↓
            android:networkSecurityConfig="@xml/net_work_security_config">
            <activity android:name=".WeatherInfoActivity"></activity>
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    
[/code]

これでビルドし、特に問題なかったので、エミュレータで起動。  
上手くいかない。  
Logcatを再び確認すると、別のエラー？メッセージが表示されている。↓

[code]

    2020-04-16 18:31:59.077 31798-31798/com.example.api_example W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@726084b
    2020-04-16 18:31:59.318 31798-31827/com.example.api_example I/System.out: 情報取得に失敗しました
    
[/code]

次の調査で、「handleWindowVisibility: no activity for token
android.os.BinderProxy@726084b」について調べる。

### Jの結果

見ているログにミスがある。このログはスタックトレースと関係ない。

### Kの結果

追記して起動した。  
エラーが下記に変化。

[code]

    I/System.out: 情報取得に失敗しました
    java.net.SocketException: socket failed: EPERM (Operation not permitted)
    
[/code]

この内容を調べる。

### Lの結果

無事にアプリが起動し、想定どおりの挙動をした。  
ここで開発終了。


CC BY-SA 4.0
2020-04-16T07:57:57.307
65675
2020-04-16T10:53:51.637
2020-04-16T10:53:51.637
34348
34348
question
java android android-studio android-asynctask
Weather Hacks API を用いたJsonデータの取得に失敗するversion2

[code]

    2020-04-16 16:55:23.000 30760-30951/com.example.api_example I/System.out: 情報取得に失敗しました
    
[/code]

と出力されていますね。したがって、

[code]

    Log.d(TAG, String.format("responseCode = %d", responseCode));
    
[/code]

の以前に、`IOException`がスローされていると考えられます。なので、原因を調べるために`System.out.println(is);`の次あたりに、

[code]

    ex.printStackTrace();
    
[/code]

を追加してみてはどうですか？


CC BY-SA 4.0
2020-04-16T08:22:30.007
65677
2020-04-16T08:22:30.007
21092
65675
answer


"情報取得に失敗しました"は出てるみたいなので、あとは例外の中身ですね。  
printStackTrace()を実行するか、

[code]

    } catch (IOException ex) {
      System.out.println("情報取得に失敗しました");
      System.out.println(con);
      System.out.println(is);
      // スタックトレースを出力
      ex.printStackTrace();
    }
    
    
[/code]

出力されない場合は、一旦スタックトレースの文字列を作成してprintlnするという方法があります。

[code]

    } catch (IOException ex) {
      System.out.println("情報取得に失敗しました");
      System.out.println(con);
      System.out.println(is);
      // スタックトレースを文字列にして出力
      StringWriter stringWriter = new StringWriter();
      ex.printStackTrace(new PrintWriter(stringWriter));
      String stackTrace = stringWriter.toString();
      System.out.println(stackTrace);
    }
    
[/code]


CC BY-SA 4.0
2020-04-16T09:03:21.420
65678
2020-04-16T09:03:21.420
39657
65675
answer