JSONException начиная с Android Api 28 (String result = "") - PullRequest
0 голосов
/ 11 июля 2019

Обновлен до Android Api 28. Теперь я получаю любопытство JSONException.На самом деле не ясно, как я могу решить проблему.Я знаю, почему это происходит, но я не знаю, как это исправить в это время.

Эта часть должна вызвать ошибку "String result =" ";"и в строке 74 этой части "JSONObject json = new JSONObject (result);"Сбой JSON

GetJsonResults

import java.io.InputStreamReader;

public class GetJsonResults extends AsyncTask<String, Void, String> {
    private final static String LOG_TAG = GetJsonResults.class.getSimpleName();

    private static String GET(String url) {
        InputStream inputStream;
        String result = "";
        try {

            // create HttpClient
            HttpClient httpclient = new DefaultHttpClient();

            // make GET request to the given URL
            HttpResponse httpResponse = httpclient.execute(new HttpGet(url));

            // receive response as inputStream
            inputStream = httpResponse.getEntity().getContent();

            // convert inputstream to string
            if (inputStream != null)
                result = convertInputStreamToString(inputStream);
            else
                result = "Did not work!";

        } catch (Exception e) {
            Log.d("InputStream", e.getLocalizedMessage());
        }

        return result;
    }

    private static String convertInputStreamToString(InputStream inputStream) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        String result = "";
        while ((line = bufferedReader.readLine()) != null)
            result += line;

        inputStream.close();
        return result;

    }

    @Override
    protected String doInBackground(String... urls) {

        return GET(urls[0]);
    }

    // onPostExecute displays the results of the AsyncTask.
    @Override
    protected void onPostExecute(String result) {
        //Toast.makeText(getBaseContext(), "Daten erfolgreich empfangen!", Toast.LENGTH_LONG).show();
        try {
            JSONObject json = new JSONObject(result);
2019-07-11 16:59:02.919 10072-10072/com.radio.xxxxxxSRAPPID D/SplashActivity: Get JSON Results
2019-07-11 16:59:04.312 10072-10072/com.radio.xxxxxxSRAPPID D/GetJsonResults: There was an JSONException
2019-07-11 16:59:04.312 10072-10072/com.radio.xxxxxxSRAPPID W/System.err: org.json.JSONException: Value http of type java.lang.String cannot be converted to JSONObject
2019-07-11 16:59:04.312 10072-10072/com.radio.xxxxxxSRAPPID W/System.err:     at org.json.JSON.typeMismatch(JSON.java:112)
2019-07-11 16:59:04.312 10072-10072/com.radio.xxxxxxSRAPPID W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:163)
2019-07-11 16:59:04.312 10072-10072/com.radio.xxxxxxSRAPPID W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:176)
2019-07-11 16:59:04.312 10072-10072/com.radio.xxxxxxSRAPPID W/System.err:     at com.radio.xxxxxx.task.GetJsonResults.onPostExecute(GetJsonResults.java:74)
2019-07-11 16:59:04.312 10072-10072/com.radio.xxxxxxSRAPPID W/System.err:     at com.radio.xxxxxx.task.GetJsonResults.onPostExecute(GetJsonResults.java:21)

1 Ответ

0 голосов
/ 11 июля 2019

Это происходит потому, что вызовы http по умолчанию отключены в API 28, вы можете использовать приведенный ниже обходной прием, чтобы включить вызовы http в API 28,

В вашем AndroidManifest.xml положите

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config">




    </application>
</manifest>

Создайте network_security_config.xml файл в каталоге ресурсов и вставьте в него источник ниже,

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

ИЛИ использовать только android:usesCleartextTraffic="true" в классе приложения

Это разрешит http-вызовы в вашем приложении, для получения дополнительной информации, пожалуйста, проверьте, https://stackoverflow.com/a/51902630/4360419

также документация здесь,

https://developer.android.com/about/versions/pie/android-9.0-changes-28

...