当前位置: 首页 > 知识库问答 >
问题:

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

沃威
2023-03-14
<?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>
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) {

                    }
                });
            }
        });


    }

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;
    }
}
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个答案

周瀚
2023-03-14
  1. 使用clearTextTraffic属性只影响Httprotocol。因此,如果您使用的api的基本url不是通过安全的http协议。(https)您使用该属性
  2. 您是否在android清单文件中声明了uses权限internet?
  3. 您可以创建network_config.xml文件来设置某些internet配置

您查看了您正在调用的GET请求的JSON响应体吗?层级是什么样子的,你要按照层级去做

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

名称:“Eimanalw”

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

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

@Serializable(“name”)  //annotation
String Name;
 类似资料:
  • 我正在使用下载管理器从互联网下载文件。在Android6,8.1中下载成功,但在Android9.0中下载失败

  • 问题内容: 我对android 7.0.0有一些问题。 我为我的应用程序使用了volley库,除了Android 7.0以外,它都运行良好 这是我的代码的一部分; 如果我在Android 7.0上测试我的应用程序,则控制台的输出为: D / NetworkSecurityConfig:未使用平台默认I / Choreographer指定网络安全配置:跳过127帧!该应用程序可能在其主线程上做过多的

  • 我试图配置logback-classic来处理以下情况:所有来自My.class的、级别为debug或更高的消息都应该发送到stdout appender。 和所有级别为warn或更高的错误消息,也应该转到altout appender中,无论它们来自哪里。但我似乎无法让它起作用。

  • 我喜欢将oracle数据库脚本设置为在出现任何数据库或操作系统问题时失败。 我一直在考虑迁移到SQLCL,但我用于检测和触发非数据库问题回滚的SQL*Plus方法在SQLCL中失败了,我想知道是否有人有其他解决方案(或好的解决方法)。 我一直在使用将任何SP-错误定向到SPERRORLOG,在那里我可以在提交之前检测到它们并决定回滚/分支/继续/警报等。 我抓取了最新的sqlcl(2016年6月s

  • 安全性错误配置在安全性设置被定义,实现和维护为默认设置时出现。良好的安全性要求为应用程序,Web服务器,数据库服务器和平台定义和部署安全配置。使软件保持最新同样重要。 威胁代理 - 匿名外部攻击者以及拥有自己帐户的用户可能会试图破坏系统。 攻击者的方法 - 访问默认帐户,未使用的页面,未修补的漏洞,未受保护的文件和目录以获得未经授权的访问。 安全弱点 - 可以发生在任何级别 - 平台,Web服务器