سؤال

حاولت اليوم، بما في ذلك حزمة Apache.commons.codec في تطبيق Android الخاص بي ولم أستطع تشغيلها. لا يمكن أن Android البحث عن الطريقة ORD.APACHE.CORMONS.CODEC.BINARY. * وإخراج الأخطاء التالية في DDMS

01-12 08: 41: 41: 41: 48.161: خطأ / dalvikvm (457): تعذر العثور على طريقة org.apache.commons.codec.binary.base64.Encodebase64urlsafestring، المشار إليها من الطريقة com.dqminh.app.util.util.sendrequest

01-12 08: 41: 41: 41: 48.161: تحذير / dalvikvm (457): vfy: غير قادر على حل الطريقة الثابتة 10146: Lorg / Apache / commons / Codec / BASSEC / BASE64؛.

01-12 08: 41: 48.161: تحذير / dalvikvm (457): VFY: رفض Opcode 0x71 في 0x0004

أي فكرة عن كيفية حل هذه المشكلة؟ شكرًا جزيلاً.

هل كانت مفيدة؟

المحلول

كان لدي مشكلة مماثلة أثناء استخدام Android مع مكتبة Oauth أنا أضعف.

حصلت أيضا من Android ذلك، على الرغم من أنني قد أدرجت apache.commons.codec في ClassPath، طريقة معينة (encodeBase64String) لم يتم العثور على.

التحقق من Javadocs، كلا الطريقتين المطالبة بأنها 1.4 وأكبر فقط, ، لذلك تخميني هو أن أندرويد يتضمن بالفعل نسخة قديمة من commons.codec حيث هذه الطرق غير محددة بالفعل.

كان الحل الخاص بي لاستخدام طريقة قديمة، مثل هذا:

String encodedString = new String(Base64.encodeBase64('string to encode'));

الطريقة التي تريد استخدامها مختلفة لأنها تحل محل + وقيم آمنة URL - و _. لذلك ربما قد تستخدم شيئا مثل:

String encodedString = new String(Base64.encodeBase64('string to encode'));
String safeString = encodedString.replace('+','-').replace('/','_');

امل ان يساعد!

نصائح أخرى

ليس لديك لاستخدام المشاعات Apache، على Android، يمكنك استخدامها android.util.base64. في حين أن.

لقد واجهت نفس المشكلة بالضبط. لذلك بدأت تصفح التعليمات البرمجية المصدر أندرويد، وكما اتضح أن تخمين Pablo Fernandez حول Android الذي يحتوي على تطبيق Org.apache.commons.code.binary صحيح. ومع ذلك، فإن الإصدار 1.2 من المشاعات Apache، وليس الإصدار 1.4 أو حتى 1.5. يمكنك أن ترى نفسك في Android مصدر.

كملاحظة هذا هو السؤال هو نسخة مكررة هذا المشنور

يمكنك استخدام الوظيفة التالية:

private static String encodeBase64URLSafeString(byte[] binaryData) {

        return android.util.Base64.encodeToString(binaryData, Base64.URL_SAFE);

    }

مصدر + قائمة الأعلام الأخرى المحتملة: http://developer.android.com/Reference/android/util/base64.html.

الحل الخاص بي لنفس المشكلة هو إعادة تسمية الفئة المشكلة org.apache.commons.codec.binary.Base64.java داخل org.apache.commons.codec.binary.ApacheBase64.java. وبعد لقد قمت باستخدام إعادة تسمية Refactor Eclipse.

بهذه الطريقة، يتم الاحتفال بأحدث وأكبر حل Apache واستخدامه، وليس هناك فرصة لتكرار المشكلة العرضية عندما يتم رفع تطبيقي في نهاية المطاف من The Android 1.6 أدنى قاسم.

ملاحظة لدي شجرة مصدر APACE Commons بأكملها تم تعيينها بالفعل كمشروع Java Eclipse منفصل، بجانب مشروع Android الخاص بي. استخدم مشروع Android الخاص بي العديد من فئات Apache Commons Commons، لكنه فشل في Base64 بسبب المشاكل المذكورة أعلاه ...

يمكنك ببساطة نسخ عدد الكود هذا من مكتبة Apache (إنه معزول جدا)http://www.java2s.com/open-source/android/blog-twitter/twitspeak/org/apache/commons/codec/binary/base64.java.htm.

تعديل:تم تحديث رابط محدث من آلة Wayback كما هو الأصلي:http://web.archive.org/web/20130610025148/http://www.java2s.com/open-source/android/blog-twitter/twitspeak/org/apache/commons/codec/binary/base64.java. HTM.

يرجى ملاحظة أن هذه الإجابة مصنوعة من قبل ديلان واتسون في التعليقات أعلاه:

كن على دراية أنك بحاجة إلى استخدام Base64.Encode ("Foobar" .getbytes ()، base64.base64.no_wrap)؛ للحصول على نفس النتيجة تماما مثل مكتبة المشاع Apache. انظر: stackoverflow.com/Questions/17912119.

كانت هذه الإجابة هي الوحيدة التي عملت بعد ساعات من محاولة توصيل تطبيق Android الخاص بي باستخدام تطبيق Java "Desktop".

إذن إليك بعض الكود المصدري، ربما سيساعد الآخرين:

رمز من تطبيق سطح المكتب:

   private static String convertToBase64(String s) {
        byte[] bytes = new byte[0];
        try {
            bytes = (s.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return DatatypeConverter.printBase64Binary(bytes);
    }

يتم استخدام هذا القصاص في الروبوت التطبيق:

 public static String convertToBase64(String password) {

        byte[] bPwd = new byte[0];
        try {
            bPwd = (password.getBytes("UTF-8"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            password = new String(Base64.encode(bPwd, Base64.NO_WRAP), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return password;
    }

هل قمت بتضمين مشروع Apache Commons Lib، مثل

org.apache.commons:commons-compress
org.apache.commons:commons-email
org.apache.commons:commons-io
org.apache.commons:commons-lang3
org.apache.commons:commons-parent
org.apache.commons:commons-pool2

GAV CORMONS-CODEC

commons-codec:commons-codec 

لكن اسم الحزمة هو

org.apache.commons.codec

ستكون اسم الحزمة هذا يتعارض مع مشروع Apache Commons Vory Libs، حاول تغيير اسم حزمة COMMONS-CODEC، ثم توليده كجار أو استيراد رمز المصدر قد غير اسم الحزمة؛

مع العلم أن هذا سؤال قديم، لكنني واجهت هذه المشكلة مؤخرا عند تجميع مستوى API 23, ، وجد حل آخر للمشكلة: الاستخدام جوجا مشروع.

// Encoding
String encodedString = BaseEncoding.base64().encode(text.getBytes(UTF_8));
System.out.println("encodedString: " + encodedString);

// Decoding
byte[] decodedString = BaseEncoding.base64().decode(encodedString);
System.out.println("decodedString: " + new String(decodedString, UTF_8));

مكتبة الجوافة (18.0) كان الإصدار الذي استخدمته، وكان التغيير سلسا. الكود يعمل كما هو متوقع.

وجدت الحل هنا: https://memorynotfound.com/Encode-Decode-base64-String-using-native-java/

هذا يعمل بالنسبة لي:

import org.apache.commons.codec.binary.Base64;

/**
 * This is used to get the base64 from the bytes
 *
 * @param rawBytes the raw bytes
 * @return the base64 encoded string
 */
public static String getBase64String(byte[] rawBytes) {
    String base64Str = "";
    if (rawBytes!= null) {
        base64Str= new String(Base64.encodeBase64(rawBytes));
    }
    return base64Str;
}

public static byte[] getBase64DecodedString(String base64EncodedStr) {
    byte[] base64Bytes = Base64.decodeBase64(base64EncodedStr.getBytes());
    return bitmap;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top