दिलचस्प पोस्ट
मेरे एंड्रॉइड ऐप में पाठ को कैसे प्रतिलिपि करें? किसी और एंड्रॉइड एप्लिकेशन से एक एंड्रॉइड एप्लिकेशन को कैसे कॉल करें कैसे मैक पर .bash_profile को पुनर्स्थापित करें? मेरे यूनिक्स टर्मिनल में से कोई भी काम नहीं कर रहा है क्या किसी भी जावास्क्रिप्ट इंजन की पूंछ को अनुकूलित किया जाता है? JQuery.ajax के बाद अनपेक्षित टोकन बृहदान्त्र JSON क्या मैं इंट्रानेट में एएसपी.नेट डेवलपमेंट सर्वर तक पहुंच सकता हूं? JSON स्कीमा (ड्राफ़्ट -4) में परिभाषाओं का उपयोग कैसे करें मुख्य () पोर्टेबल के लिए तीसरे तर्क के रूप में चार * envp है जावा – शून्य चर की स्मृति में स्थान की आवश्यकता होती है आर में एक कॉलम के प्रत्येक अनन्य मान के लिए केवल पहली पंक्ति का चयन करें पीएचपी टर्नेरी ऑपरेटर बनाम स्विच स्टेटमेंट बनाम आईएफएफएफ़ … जो मुझे इस्तेमाल करना चाहिए? एंड्रॉइड में एक और दृश्य के ऊपर एक दृश्य रखते हुए / ओवरलैपिंग (z- इंडेक्स) मान्य पथ का उपयोग करते समय NotSupportedException ("दिए गए पथ का प्रारूप समर्थित नहीं है") क्या कारण हैं? पृष्ठ रीफ्रेश के बाद मूल्य को बनाए रखने के लिए जेएस वैरिएबल कैसे प्राप्त करें? वेबवरी से HTML सामग्री कैसे प्राप्त करें?

एंड्रॉइड में डायजेस्ट यूथल्स का उपयोग करने की विधि नहीं मिली

मैं एंड्रॉइड 2.3.1 में जेडीके 1.6 का उपयोग कर पुस्तकालय डाइजेस्टियल्स का उपयोग करने की कोशिश कर रहा हूं, हालांकि ऐप निष्पादित करते समय मुझे निम्नलिखित त्रुटि मिलती है:

Could not find method org.apache.commons.codec.binary.Hex.encodeHexString, referenced from method org.apache.commons.codec.digest.DigestUtils.shaHex

यहां आपके पास स्टैकट्र्रेस है:

 02-03 10:25:45.153: I/dalvikvm(1230): Could not find method org.apache.commons.codec.binary.Hex.encodeHexString, referenced from method org.apache.commons.codec.digest.DigestUtils.shaHex 02-03 10:25:45.153: W/dalvikvm(1230): VFY: unable to resolve static method 329: Lorg/apache/commons/codec/binary/Hex;.encodeHexString ([B)Ljava/lang/String; 02-03 10:25:45.153: D/dalvikvm(1230): VFY: replacing opcode 0x71 at 0x0004 02-03 10:25:45.153: D/dalvikvm(1230): VFY: dead code 0x0007-0008 in Lorg/apache/commons/codec/digest/DigestUtils;.shaHex ([B)Ljava/lang/String; 02-03 10:25:45.163: D/AndroidRuntime(1230): Shutting down VM 02-03 10:25:45.163: W/dalvikvm(1230): threadid=1: thread exiting with uncaught exception (group=0x40015560) 02-03 10:25:45.173: E/AndroidRuntime(1230): FATAL EXCEPTION: main 02-03 10:25:45.173: E/AndroidRuntime(1230): java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Hex.encodeHexString 02-03 10:25:45.173: E/AndroidRuntime(1230): at org.apache.commons.codec.digest.DigestUtils.md5Hex(DigestUtils.java:226) 02-03 10:25:45.173: E/AndroidRuntime(1230): at com.caumons.trainingdininghall.ConnectionProfileActivity.onCreate(ConnectionProfileActivity.java:20) 02-03 10:25:45.173: E/AndroidRuntime(1230): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 02-03 10:25:45.173: E/AndroidRuntime(1230): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586) 02-03 10:25:45.173: E/AndroidRuntime(1230): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638) 02-03 10:25:45.173: E/AndroidRuntime(1230): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 02-03 10:25:45.173: E/AndroidRuntime(1230): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928) 02-03 10:25:45.173: E/AndroidRuntime(1230): at android.os.Handler.dispatchMessage(Handler.java:99) 02-03 10:25:45.173: E/AndroidRuntime(1230): at android.os.Looper.loop(Looper.java:123) 02-03 10:25:45.173: E/AndroidRuntime(1230): at android.app.ActivityThread.main(ActivityThread.java:3647) 02-03 10:25:45.173: E/AndroidRuntime(1230): at java.lang.reflect.Method.invokeNative(Native Method) 02-03 10:25:45.173: E/AndroidRuntime(1230): at java.lang.reflect.Method.invoke(Method.java:507) 02-03 10:25:45.173: E/AndroidRuntime(1230): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 02-03 10:25:45.173: E/AndroidRuntime(1230): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 02-03 10:25:45.173: E/AndroidRuntime(1230): at dalvik.system.NativeStart.main(Native Method) 

अपवाद का कारण बनने वाला कोड:

String hash = DigestUtils.shaHex("textToHash");

मैंने एंड्रॉइड के बाहर जावा क्लास में एक ही कोड को निष्पादित किया है और यह काम करता है! इसलिए, मुझे नहीं पता कि एंड्रॉइड के साथ काम करने पर यह काम क्यों नहीं करता है … मैंने अपने ऐप में लिब्रैटिटी को एक नया लिब्स / फ़ोल्डर के अंदर रखा और इसे इस्तेमाल करने के लिए बिल्डपाथ को अपडेट किया। अगर मैं sha1 के बजाय md5 का उपयोग करने का प्रयास करता हूं तो मुझे एक ही अपवाद मिलता है। किसी भी सहायता की सराहना की जाएगी! धन्यवाद।

अद्यतन करें:

चूंकि यह एक बहुत सक्रिय प्रश्न है, मैंने @ डीए 25 के पक्ष में स्वीकार किए गए उत्तर को बदल दिया है, क्योंकि उनका समाधान सरल है और अपवोट्स की उच्च संख्या यह साबित करती है कि यह काम करती है।

वेब के समाधान से एकत्रित समाधान "एंड्रॉइड में डायजेस्ट यूथल्स का उपयोग करने की विधि नहीं मिली"

मैं अपने एंड्रॉइड ऐप में डाइजेस्ट्युलल्स का इस्तेमाल करने की कोशिश कर रहा हूं। यह सबसे अच्छा जवाब था जो मुझे खोज से मिल सकता था, लेकिन मैं नाम स्थान के साथ .jar फ़ाइल के पुनर्निर्माण के लिए अनिच्छुक था। इस मुद्दे पर कुछ समय बिताने के बाद, मुझे मेरे मामले की समस्या का समाधान करने का एक आसान तरीका मिला। मेरे कोड के लिए समस्या का बयान था

 String s = DigestUtils.md5Hex(data); 

इस कथन को निम्नलिखित के साथ बदलें और यह काम करेगा:

 String s = new String(Hex.encodeHex(DigestUtils.md5(data))); 

इसी तरह शाहैक्स परीक्षा के लिए, आप इसे बदल सकते हैं

 String hash = new String(Hex.encodeHex(DigestUtils.sha("textToHash"))); 

यह इसलिए काम करता है क्योंकि Android में एन्कोड हैक्सस्ट्राइंग () नहीं है, लेकिन इसके पास एन्कोड हैक्स () है आशा है कि इससे अन्य लोगों को उसी मुद्दे पर चलने में मदद मिलेगी।

चूंकि इस समस्या के मूल कारण के लिए कोई स्पष्ट उत्तर नहीं है, मैं यह स्पष्ट करना चाहता हूं कि यहां क्या हो रहा है।

क्यों NoSuchMethodError पहली जगह में फेंक दिया है?

अपवाद स्टैक ट्रेस के अनुसार, गलती का कारण बनने वाली रेखा 225 में DigestUtils#md5hex विधि है। देखते हैं कि हमारे पास क्या है (मैं मानता हूं कि आपने संस्करण 1.4 का प्रयोग किया है, क्योंकि यह केवल एकमात्र रिलीज है जहां Hex#encodeHexString विधि को पंक्ति 226 में लागू किया जा रहा है):

 public static String md5Hex(String data) { return Hex.encodeHexString(md5(data)); } 

अपवाद का कहना है java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Hex.encodeHexString । चलो समझें क्यों

सबसे पहले, एंड्रॉइड फ्रेमवर्क में पहले से ही Commons Codec लाइब्रेरी ( DigestUtils क्लास को छोड़कर) शामिल है। हां, यह Android SDK हिस्से के रूप में सामने नहीं आ रहा है और आप इसे सीधे उपयोग नहीं कर सकते। लेकिन आप अभी भी इसका उपयोग करना चाहते हैं। तो तुम क्या करते हो? आप अपने आवेदन के हिस्से के रूप में Commons Codec लाइब्रेरी को जोड़ें। कंपाइलर शिकायत नहीं करता है – उसकी दृष्टि से सब कुछ ठीक था।

लेकिन रनटाइम पर क्या होता है? आइए अपने अपवाद स्टैक ट्रेस का पालन करें:
सबसे पहले, आप अपने गतिविधि के DigestUtils#md5Hex विधि से DigestUtils#md5Hex 5 DigestUtils#md5Hex को बुला रहे हैं। जैसा कि मैंने उपरोक्त लिखा था, ढांचे में उस वर्ग को शामिल नहीं किया जाता है, इसलिए DigestUtils ( Commons Codec संस्करण 1.4 से) आपके डेक्स से लोड किया गया है।
अगला, md5hex विधि Hex#encodeHexString विधि को खोलने की कोशिश करता है। Hex क्लास Commons Codec लाइब्रेरी का एक हिस्सा है जो ढांचे में शामिल है। बात यह है कि इसकी संस्करण 1.3 है (जुलाई 2004 से प्राचीन रिलीज) Hex क्लास बूट क्लासपाथ में मौजूद है, जिसका अर्थ है कि रनटाइम हमेशा Hex क्लास के बजाय इसे पसंद करेगा जो आपके डेक्स के अंदर पैक किया गया है। जब आप अपना ऐप (डाल्विक रनटाइम के साथ) शुरू करते हैं, तो आप इसके बारे में अपने एप्लिकेशन लॉग में चेतावनियां देख सकते हैं:

 D/dalvikvm? DexOpt: 'Lorg/apache/commons/codec/binary/Hex;' has an earlier definition; blocking out I/dalvikvm? DexOpt: not resolving ambiguous class 'Lorg/apache/commons/codec/binary/Hex;' D/dalvikvm? DexOpt: not verifying/optimizing 'Lorg/apache/commons/codec/binary/Hex;': multiple definitions I/dalvikvm? Could not find method org.apache.commons.codec.binary.Hex.encodeHexString, referenced from method org.apache.commons.codec.digest.DigestUtils.md5Hex 

हेक्स # एन्कोडएक्सस्ट्रिंग विधि को संस्करण 1.4 की Commons Codec पुस्तकालय में पेश किया गया था और इसलिए यह ढांचे के Hex वर्ग में मौजूद नहीं है। रनटाइम इस विधि को नहीं ढूँढ सकता है और इस प्रकार NoSuchMethodError अपवाद फेंकता है।

स्वीकार किए जाते हैं उत्तर का समाधान क्यों काम करता है?

 String s = new String(Hex.encodeHex(DigestUtils.md5(data))); 

सबसे पहले, DigestUtils#md5 विधि को कहा जाता है। जैसा कि मैंने पहले ही कहा है, DigestUtils क्लास का उपयोग किया जाएगा जो आपके डेक्स में पैक किया गया है। यह विधि किसी अन्य Commons Codec कक्षाओं का उपयोग नहीं करती है, इसलिए इसके साथ कोई समस्या नहीं है।

अगला, Hex#encodeHex को बुलाया जाएगा। Hex क्लास का उपयोग किया जाएगा जो ढांचे का एक है (संस्करण 1.3)। encodeHex विधि (जो एक पैरामीटर लेती है – बाइट सरणी) Commons Codec लाइब्रेरी के संस्करण 1.3 में मौजूद है, और इसलिए यह कोड ठीक काम करेगा।

मैं क्या सुझाव देना चाहूंगा?

मेरा सुझाव दिया गया है कि वर्ग नाम स्थान / पैकेज का नाम बदलने का उपाय है। ऐसा करने से मैं स्पष्ट रूप से निर्दिष्ट कर रहा हूं कि कौन सी कोड निष्पादित करने जा रहा है, और विवादास्पद व्यवहार को रोका जा सकता है जो संस्करण के मुद्दों के कारण हो सकता है।

आप इसे मैन्युअल रूप से कर सकते हैं (जैसे Caumons ने अपने जवाब में लिखा है), या स्वचालित रूप से जारज उपकरण के साथ।

अपने blogpost में jarjar का उपयोग करने के लिए इस मुद्दे सारांश और सुझाव देखें।

अंत में मुझे जवाब मिलता है और यह अच्छी तरह से काम करता है। जैसा कि किसी अन्य प्रकार के एन्क्रिप्ट (बेस 64) के लिए अपाचे कोडेक में ऐसी कोई विधि त्रुटि में वर्णित नहीं है, मैंने उसी समस्या को पुन: उत्पन्न करने की कोशिश की और मुझे ठीक उसी त्रुटि मिलती है तो मैं जुड़े सवाल के मामले में था। जैसा कि वे कहते हैं, यह पैकेज नाम org.apache.commons.codec के साथ एक आंतरिक नाम टकराव प्रतीत होता है और जैसा कि @ डॉन ने मुझे इसे बदलकर com.apache.commons.codec में बदल दिया और ठीक काम किया! मैंने यह कैसे किया?

मैंने सोर्स कोड डाउनलोड किया और com लिए 3 डायरेक्टरों को बदल दिया। मैंने उन फाइलों में पैकेज नाम के सभी संस्करणों को भी स्थान दिया है, जहां वे दिखाई देते हैं और com/apache/commons/codec/ में डॉक्स में संदर्भ भी बदल दिए हैं। (उन्हें मैन्युअल रूप से पुन: संयोजित करने की कोशिश न करें या आप छेद दिन खर्च करेंगे)। तब मैंने पुस्तकालय संकलित किया और जड़ को चींटी के साथ उत्पन्न किया, जिसे मैं commons-codec-1.6-android.jarcommons-codec-1.6-android.jar । मैं अपने एंड्रॉइड ऐप के libs/ फ़ोल्डर में जार डाल दिया और इसे बिल्डपाथ में जोड़ा। साथ ही, मैंने सभी फाइलों को शामिल करने वाले फ़ोल्डर के रूप में स्रोतों को संलग्न किया है तो अब मेरे पास एंड्रॉइड के साथ प्रयोग करने के लिए लाइब्रेरी है!

आशा है कि यह किसी और को मदद करता है!

धन्यवाद @ डीए 25

यह मेरे लिए ठीक काम कर रहा है

मेरे पास निर्भरता जोड़ें

 compile 'commons-codec:commons-codec:1.9' 

रेफरी: http://mvnrepository.com/artifact/commons-codec/commons-codec/1.9

मेरे फ़ंक्शन

 public String encode(String key, String data) { try { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"); sha256_HMAC.init(secret_key); return new String(Hex.encodeHex(sha256_HMAC.doFinal(data.getBytes("UTF-8")))); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } 

मेरे लिए प्रोगुर्ड ने अस्पष्टता के दौरान कक्षा को हटा दिया। अपने प्रोगार्ड नियमों में इसे जोड़ें

 -keep class org.apache.commons.** { *; } 

यहाँ वह विधि है जो मैं अपाचे पैकेज का उपयोग कर रहा था।

 Hex.encodeHex(digest)