Android studio java.lang.NoSuchMethodError: No static method encodeBase64URLSafeString([B)Ljava/lang/String;

Android studio java.lang.NoSuchMethodError: No static method encodeBase64URLSafeString([B)Ljava/lang/String;

我正在尝试使用 Upbit API 调用我的钱包信息。

示例代码来自https://docs.upbit.com/reference#%EC%9E%90%EC%82%B0-%EC%A1%B0%ED%9A%8C

这是我的代码。

(删除了我的 API 访问密钥和秘密密钥)


package gachon.mpclass.apitest2;

import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.util.UUID;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;


import android.util.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;


import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        NetworkThread thread = new NetworkThread();
        thread.start();
    }


    class NetworkThread extends Thread {

        public void run() {


            try {

                String accessKey = ("api key value");
                String secretKey = ("api key value");
                String serverUrl = ("https://api.upbit.com");


                Algorithm algorithm = Algorithm.HMAC256(secretKey);
                String jwtToken = JWT.create()
                        .withClaim("access_key", accessKey)
                        .withClaim("nonce", UUID.randomUUID().toString())
                        .sign(algorithm);

                String authenticationToken = "Bearer " + jwtToken;
                HttpClient client = HttpClientBuilder.create().build();
                HttpGet request = new HttpGet(serverUrl + "/v1/accounts");
                request.setHeader("Content-Type", "application/json");
                request.addHeader("Authorization", authenticationToken);

                HttpResponse response = client.execute(request);
                HttpEntity entity = response.getEntity();


                System.out.println(EntityUtils.toString(entity, "UTF-8"));

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }


}

SDK 版本为 30 依赖项是

dependencies {

    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation fileTree(dir: 'C:\Users\admin\AndroidStudioProjects\APITest2\app\libs', include: ['*.aar', '*.jar'], exclude: [])
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    compileOnly 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
    implementation group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.3.2'
    implementation group: 'commons-codec', name: 'commons-codec', version: '1.10'
    implementation 'com.auth0.android:jwtdecode:2.0.0'
    api 'io.jsonwebtoken:jjwt-api:0.11.2'
    runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2'
    runtimeOnly('io.jsonwebtoken:jjwt-orgjson:0.11.2') { exclude group: 'org.json', module: 'json'}
    runtimeOnly 'org.bouncycastle:bcprov-jdk15on:1.60'
    implementation 'com.android.support:multidex:1.0.3'

}

错误是

E/AndroidRuntime: FATAL EXCEPTION: Thread-2
    Process: gachon.mpclass.apitest2, PID: 21107
    java.lang.NoSuchMethodError: No static method encodeBase64URLSafeString([B)Ljava/lang/String; in class Lorg/apache/commons/codec/binary/Base64; or its super classes (declaration of 'org.apache.commons.codec.binary.Base64' appears in /system/framework/org.apache.http.legacy.jar)
        at com.auth0.jwt.JWTCreator.sign(JWTCreator.java:283)
        at com.auth0.jwt.JWTCreator.access0(JWTCreator.java:23)
        at com.auth0.jwt.JWTCreator$Builder.sign(JWTCreator.java:264)
        at gachon.mpclass.apitest2.MainActivity$NetworkThread.run(MainActivity.java:48)

我尝试了很多库和依赖项,但仍然出现相同的错误。 我应该更改整个代码还是有任何工作依赖项?

此错误通常发生在 class 路径上错误版本的 jar 时,在这种情况下,可能是应用程序正在寻找后续 jar 中的 Base64 class /system/framework/org.apache.http.legacy.jar。看看这个提交 https://github.com/auth0/java-jwt/commit/7dea6ac54d5b5b8822a9f3ee41cc4666e250cc27#diff-66fdd511fc2a34e115ac3e635c97eb82b89c8b64e26ea09247712b9efa5e62f7

查看 auth0.jwt 项目,您可以看到在 JWTCreator.sign() 方法内部调用 Base64.encodeBase64URLSafeString(byte []) 方法的位置,可能会引发错误,因为您的 class 路径上的 Base64 class 不包含该函数。 如果您发布整个 build.gradle 文件将会很有帮助。