2016-09-23 126 views
7

我正在使用Microsoft aad:adal4j来处理来自Mobile的动态crm登录。实现后我正在获取下面的异常。Android Microsoft Dynamics CRM adal4j登录问题

我在做什么错?

错误

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.boot.jar) 
java.util.concurrent.ExecutionException: 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.boot.jar) 
at java.util.concurrent.FutureTask.report(FutureTask.java:94) 
at java.util.concurrent.FutureTask.get(FutureTask.java:164) 
at com.sampleadal.MainActivity.onCreate(MainActivity.java:33) 
at android.app.Activity.performCreate(Activity.java:6237) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: 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.boot.jar) 
at com.microsoft.aad.adal4j.AuthenticationContext.computeSha256Hash(AuthenticationContext.java:798) 
at com.microsoft.aad.adal4j.AuthenticationContext.logResult(AuthenticationContext.java:775) 
at com.microsoft.aad.adal4j.AuthenticationContext.access$200(AuthenticationContext.java:61) 
at com.microsoft.aad.adal4j.AuthenticationContext$1.call(AuthenticationContext.java:130) 
at com.microsoft.aad.adal4j.AuthenticationContext$1.call(AuthenticationContext.java:117) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
at java.lang.Thread.run(Thread.java:818) 

代码

AuthenticationResult result = (AuthenticationResult) new AuthenticationContext(Constants.AUTHORITY_URL, false, Executors.newFixedThreadPool(1)).acquireToken(Constants.SERVICE_URL, Constants.CLIENT_ID, "my_login_id", "my_password", null).get(); 
Log.d("TAG", "Access Token - " + result.getAccessToken() + " \n Refresh Token - " + result.getRefreshToken() + " \n ID Token - " + result.getAccessToken() + " \n User ID - " + result.getUserInfo().getUniqueId() + " \n Displayable ID - " + result.getUserInfo().getDispayableId()); 

摇篮文件

compile 'com.microsoft.aad:adal4j:0.0.2' 

而且也试过这样:

代码:

AuthenticationResult result = (AuthenticationResult) new AuthenticationContext(Constants.AUTHORITY_URL, false, Executors.newFixedThreadPool(1)).acquireToken(Constants.SERVICE_URL, new ClientCredential("my_login_id", "my_password"), null).get(); 

输出

{ 
    "error": "unauthorized_client", 
    "error_description": "AADSTS70001: Application with identifier 'prasanth' was not found in the directory windows.net\r\nTrace ID: 8c5ccd53-af99-4ff0-8556-501a53080d2f\r\nCorrelation ID: 8651e7f1-a7db-4673-aafb-52fef0d48d2d\r\nTimestamp: 2016-09-26 06:10:41Z" 
} 
+1

请检查链接:http://stackoverflow.com/questions/9126567/method-not-found-using-digestutils-in-android/29833101#29833101 – abhishesh

+0

@abhishesh我已经尝试过, –

+0

@PrasanthS是否包含了您自己的Apache commons库的重命名版本,并在'com.microsoft.aad:adal4j'中更改了包名? –

回答

1

@abhishesh已经指出正确的解决方案。 java的adald4j库不是为android设计的,而是使用android在内部使用的不同版本的apache commons库。 我使用figo connect API(www.figo.io)遇到了同样的问题。

你需要做的:

  1. 下载adald4j图书馆https://github.com/AzureAD/azure-activedirectory-library-for-java 并将其添加到您的项目在当地。

  2. 下载apache commons库并重新命名所有包的名称(如“org.apache.commons.codec.android”)。例如使用搜索和替换跨越文本中的多个文件。 也在本地添加Apache公共库。

  3. 将您下载的adald4j库中常见的apache的所有包实现重命名为新的指定名称。这确保库使用你的apache commons版本而不是android内部版本。