अब मैं अपने बाइनरी एक्सएमएल डेटा से एपीके फ़ाइल के संस्करण को सफलतापूर्वक पुनर्प्राप्त कर सकता हूं।
यह विषय है, जहां मैं अपने जवाब के लिए महत्वपूर्ण हो गया (मैं भी ribo के कोड के अपने संस्करण जोड़ा): How to parse the AndroidManifest.xml file inside an .apk package
साथ ही, यहां XML पार्सिंग कोड मैंने लिखा विशेष रूप से संस्करण लाने के लिए दिया गया है:
XML पार्सिंग
/**
* Verifies at Conductor APK path if package version if newer
*
* @return True if package found is newer, false otherwise
*/
public static boolean checkIsNewVersion(String conductorApkPath) {
boolean newVersionExists = false;
// Decompress found APK's Manifest XML
// Source: https://stackoverflow.com/questions/2097813/how-to-parse-the-androidmanifest-xml-file-inside-an-apk-package/4761689#4761689
try {
if ((new File(conductorApkPath).exists())) {
JarFile jf = new JarFile(conductorApkPath);
InputStream is = jf.getInputStream(jf.getEntry("AndroidManifest.xml"));
byte[] xml = new byte[is.available()];
int br = is.read(xml);
//Tree tr = TrunkFactory.newTree();
String xmlResult = SystemPackageTools.decompressXML(xml);
//prt("XML\n"+tr.list());
if (!xmlResult.isEmpty()) {
InputStream in = new ByteArrayInputStream(xmlResult.getBytes());
// Source: http://developer.android.com/training/basics/network-ops/xml.html
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(in, null);
parser.nextTag();
String name = parser.getName();
if (name.equalsIgnoreCase("Manifest")) {
String pakVersion = parser.getAttributeValue(null, "versionName");
//NOTE: This is specific to my project. Replace with whatever is relevant on your side to fetch your project's version
String curVersion = SharedData.getPlayerVersion();
int isNewer = SystemPackageTools.compareVersions(pakVersion, curVersion);
newVersionExists = (isNewer == 1);
}
}
}
} catch (Exception ex) {
android.util.Log.e(TAG, "getIntents, ex: "+ex);
ex.printStackTrace();
}
return newVersionExists;
}
संस्करण तुलना नोट (पिछले स्निपेट में SystemPackageTools.compareVersions के रूप में देखा): यह कोड निम्न विषय से प्रेरित है: Efficient way to compare version strings in Java
/**
* Compare 2 version strings and tell if the first is higher, equal or lower
* Source: https://stackoverflow.com/questions/6701948/efficient-way-to-compare-version-strings-in-java
*
* @param ver1 Reference version
* @param ver2 Comparison version
*
* @return 1 if ver1 is higher, 0 if equal, -1 if ver1 is lower
*/
public static final int compareVersions(String ver1, String ver2) {
String[] vals1 = ver1.split("\\.");
String[] vals2 = ver2.split("\\.");
int i=0;
while(i<vals1.length&&i<vals2.length&&vals1[i].equals(vals2[i])) {
i++;
}
if (i<vals1.length&&i<vals2.length) {
int diff = Integer.valueOf(vals1[i]).compareTo(Integer.valueOf(vals2[i]));
return diff<0?-1:diff==0?0:1;
}
return vals1.length<vals2.length?-1:vals1.length==vals2.length?0:1;
}
मुझे आशा है कि इस मदद करता है।
यह जांचें http://stackoverflow.com/a/4761689/1109425 – nandeesh
क्या आप सब कुछ खत्म कर चुके थे? मुझे एक ही समस्या का सामना करना पड़ रहा है। धन्यवाद! – Mathieu
बीटीडब्ल्यू, मुझे उम्मीद है कि कोई भी फ़ाइल को डाउनलोड करने का अच्छा समाधान नहीं सोचता है, और * फिर * जांच करें कि इसकी आवश्यकता है या नहीं - पहला वाक्य क्या सुझाता है। संभवतः आप कोड चाहते हैं जो * आपके सर्वर * पर चलता है, और उपलब्ध संस्करण संख्या के साथ प्रतिक्रिया देता है। – ToolmakerSteve