微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android Studio-由于“指定网络安全配置,使用平台默认值”错误日志,因此无法调用API

如何解决Android Studio-由于“指定网络安全配置,使用平台默认值”错误日志,因此无法调用API

我正在尝试构建一个可以转换货币的应用程序。我使用公共API来访问货币兑换功能。调试代码时,由于此网络安全错误,我无法查看JSON接收的对象。我在此处检查了其他帖子,并尝试通过在其中包含 android:usesCleartextTraffic =“ true” uses-permission android:name =“ android.permission.ACCESS_NETWORK_STATE” 解决此问题AndriodManifest.xml文件。这是调试输出的图像:image

这是我的代码文件

AndriodManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.currencyconversion">

    <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/Theme.CurrencyConversion"
        android:usesCleartextTraffic="true"
        >
        <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>

MainActivity.java:

package com.example.currencyconversion;

import androidx.appcompat.app.AppCompatActivity;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

import com.example.currencyconversion.Retrofit.RetrofitBuilder;
import com.example.currencyconversion.Retrofit.RetrofitInterface;
import com.google.gson.JsonObject;

public class MainActivity extends AppCompatActivity {

    Button button;
    EditText currencyToBeConverted;
    EditText currencyConverted;
    Spinner convertToDropdown;
    Spinner convertFromDropdown;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Initialization
        currencyConverted =(EditText) findViewById(R.id.currency_converted);
        currencyToBeConverted =(EditText) findViewById(R.id.currency_to_be_converted);
        convertToDropdown = (Spinner) findViewById(R.id.convert_to);
        convertFromDropdown = (Spinner) findViewById(R.id.convert_from);
        button = (Button) findViewById(R.id.button);

       // Adding Functionality
        String[] downDownList = {"USD","AED","EUR","GBP"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,downDownList);
        convertToDropdown.setAdapter(adapter);
        convertFromDropdown.setAdapter(adapter);


        button.setonClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                //API Call
                RetrofitInterface retrofitInterface = RetrofitBuilder.getRetrofitInstance().create(RetrofitInterface.class);
                //Call<JsonObject> call = retrofitInterface.getExchangeCurrency(convertFromDropdown.getSelectedItem().toString());
                Call<JsonObject> call = retrofitInterface.getExchangeCurrency("AED");
                call.enqueue(new Callback<JsonObject>() {
                    @Override
                    public void onResponse(Call<JsonObject> call,Response<JsonObject> response) {
                        Log.d("response",String.valueOf(response.body())); //HERE IS WHERE I DEBUG


                        /*JsonObject res = response.body();
                        JsonObject rates = res.getAsJsonObject("conversion_rates");
                        double currency = Double.valueOf(currencyToBeConverted.getText().toString());
                        double multiplier = Double.valueOf(rates.get(convertToDropdown.getSelectedItem().toString()).toString());
                        double result = currency * multiplier;
                        currencyConverted.setText(String.valueOf(result));*/

                    }

                    @Override
                    public void onFailure(Call<JsonObject> call,Throwable t) {

                    }
                });
            }
        });


    }

RetrofitBuilder.java:

package com.example.currencyconversion.Retrofit;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitBuilder {
    public static Retrofit retrofit;
    public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl("https://v6.exchangerate-api.com/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }

        return retrofit;
    }
}

RetrofitInterface.java:

package com.example.currencyconversion.Retrofit;

import com.google.gson.JsonObject;

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;

public interface RetrofitInterface {
    @GET("v6/4API-KEY/latest/{currency}")
    Call<JsonObject> getExchangeCurrency(@Path("currency") String currency);
}

解决方法

  1. 使用 clearTextTraffic 属性仅会影响httprotocol。因此,如果您使用的API的基本URL不在安全的HTTP协议上。 ( https )您使用该属性
  2. 您是否已在Android清单文件中声明了使用权限互联网?
  3. 您可以创建network_config.xml文件来设置某些Internet配置

您是否查看了正在调用的GET请求的JSON响应主体?层次结构是什么样的,您必须遵循层次结构

它是一个对象数组,一个键,值对在其中的对象吗?

您还可以发布jsonObject类吗?您是否已确定该类中的变量具有与api中的键完全相同的命名约定。

例如;

如果响应中包含带有此键的对象,则为值对

名称:“ Eimanalw”

在jsonObject类中,您已将变量命名为 Name ,而不是 name

最后,如果您确实更改了字符并将其命名为名称,是否使用了

@Serializable(“name”)  //annotation
String Name;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。