ANDROID:java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.encodeBase64String在ANDROID中

ANDROID:java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.encodeBase64String在ANDROID中,android,eclipse,oauth,base64,signature,Android,Eclipse,Oauth,Base64,Signature,想要为oauth登录生成签名。为此,我使用了HmacSHA1和base64算法。请看下面的代码。我已经访问了许多与此相关的链接,但这为java平台[J2EE]提供了解决方案不适用于Android。相同的代码/方法工作正常,在java的eclipse中生成签名,但它在Android中抛出错误 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java

想要为oauth登录生成签名。为此,我使用了HmacSHA1和base64算法。请看下面的代码。我已经访问了许多与此相关的链接,但这为java平台[J2EE]提供了解决方案不适用于Android。相同的代码/方法工作正常,在java的eclipse中生成签名,但它在Android中抛出错误

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;


import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;



import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class FitBitActivity extends Activity implements Serializable{
    WebView webView;
    static String authToken;
    Context context = this;
    ProgressDialog progressBar;
    String finalAuthToken = "";
    String finalAuthTokenSecrate = "";
    String finalEncodedUserID = "";
    String authVerifer = "";
    String tempAuthToken = "";
    String fitbitUser = "";
    SharedPreferences sharedPref;
    String userid;
    static String TAG = "FitBitActivity";

    String Authorization = ""; 
    String res= "";
    static String timestamp ;
    String auth_nonce="456236281" ; 
     static String nonce ;
   // String parameters;
    static String consumerKey= "XXXXXX your key XXXXX";
    private ProgressDialog pDialog;

     Random RAND ;
     private static final String HMAC_SHA1 = "HmacSHA1";


    @SuppressLint({ "NewApi", "NewApi", "NewApi" })
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fitbit_activity);

        Long tsLong = System.currentTimeMillis()/1000;
        timestamp = tsLong.toString();

        RAND = new Random();
        nonce = timestamp + RAND.nextInt();


        generateSignature();


    }

    public static  void generateSignature() {
        // TODO Auto-generated method stub
        String base_string =
                "POST&https%3A%2F%2Fapi.fitbit.com%2Foauth%2Frequest_token&oauth_consumer_key%3D"
 +consumerKey+"%26"+"oauth_nonce%3D"+nonce+"%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D"+timestamp+"%26oauth_version%3D1.0";
        String key = "sign";


         try {
                Mac mac = Mac.getInstance("HmacSHA1");
                SecretKeySpec secret = new SecretKeySpec(key.getBytes("UTF-8"), mac.getAlgorithm());
                mac.init(secret);
                byte[] digest = mac.doFinal(base_string.getBytes());

                String enc = new String(digest);

                // Base 64 Encode the results
                String retVal = Base64.encodeBase64String(digest);

              // byte[] retVal = Base64.encode(base_string.getBytes(), Base64.NO_WRAP);

               // byte[] retVal = Base64.encodeBase64(base_string.getBytes()); 

                Log.e(TAG, "String: " + base_string);
                Log.e(TAG, "key: " + key);
                Log.e(TAG, "result: " + retVal.toString());             

            } catch (Exception e) {
                System.out.println(e.getMessage());
            }

    }


}

org.apache.commons.codec.binary.Base64类不是标准Android API的一部分。要解决此问题,只需使用Android附带的标准
Base64
类,替换以下行:

import org.apache.commons.codec.binary.Base64;
...
String retVal = Base64.encodeBase64String(digest);
作者:


让我纠正一下,你是在从“android.util.base64”软件包中讲述base64吗?奇怪的是,如果他没有将org.apache.commons.codec.binary.base64添加到他的应用程序中,它就无法通过编译,怎么会发生异常?@Leog-可能有多种原因。这很可能是ant/gradle脚本中的配置问题,但也可能是他用来编译应用程序的JDK的问题。不管怎样,因为Android已经为Base64编码/解码提供了类,包括整个commons编解码器包都没有提供任何好处。对我的兄弟来说+1。工作正常。我花了一天的时间,按照谷歌的解决方案,有很多额外的lib需要导入,但无法得到输出。不知道我错在哪里,我也尝试了utils包的base64,但同样的错误也发生了。
import android.util.Base64;
...
String retVal = Base64.encodeToString(digest, Base64.DEFAULT);