0

我正在尝试构建一个转换货币的应用程序。我使用公共 API 来访问货币兑换功能。当我调试我的代码时,由于这个网络安全错误,我无法查看收到的 JSON 对象。我在这里查看了其他帖子,并尝试通过在 AndriodManifest.xml 文件中包含android:usesCleartextTraffic="true"uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"来修复它。这是调试输出的图像: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);
}
4

1 回答 1

0
  1. 使用clearTextTraffic属性只会影响 httprotocol。因此,如果您使用的 api 的基本 url 不是通过安全的 http,协议。( https ) 你使用那个属性
  2. 您是否在您的 android 清单文件中声明了使用权限 internet?
  3. 您可以创建一个 network_config.xml 文件来设置某些 Internet 配置

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

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

您能否也发布您的 jsonObject 类。您是否确保该类中的变量具有与 api.xml 中的键完全相同的命名约定。

例如;

如果响应有一个带有这个键值对的对象

名称:“Eimanalw”</p>

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

最后,如果您确实更改了角色并将其命名为Name,您是否使用

@Serializable(“name”)  //annotation
String Name;
于 2020-11-01T20:21:42.437 回答