कभी-कभी जेब और जेन्स के जवाब काम नहीं करते हैं और अशक्त लौट आते हैं। इस मामले में मैं अनुवर्ती समाधान का उपयोग करता हूं। फ़ाइल के प्रमुख में आमतौर पर टाइप हस्ताक्षर होते हैं। मैंने इसे पढ़ा और हस्ताक्षर की सूची में ज्ञात के साथ तुलना की ।
/**
*
* @param is InputStream on start of file. Otherwise signature can not be defined.
* @return int id of signature or -1, if unknown signature was found. See SIGNATURE_ID_(type) constants to
* identify signature by its id.
* @throws IOException in cases of read errors.
*/
public static int getSignatureIdFromHeader(InputStream is) throws IOException {
// read signature from head of source and compare with known signatures
int signatureId = -1;
int sigCount = SIGNATURES.length;
int[] byteArray = new int[MAX_SIGNATURE_LENGTH];
StringBuilder builder = new StringBuilder();
for (int i = 0; i < MAX_SIGNATURE_LENGTH; i++) {
byteArray[i] = is.read();
builder.append(Integer.toHexString(byteArray[i]));
}
if (DEBUG) {
Log.d(TAG, "head bytes=" + builder.toString());
}
for (int i = 0; i < MAX_SIGNATURE_LENGTH; i++) {
// check each bytes with known signatures
int bytes = byteArray[i];
int lastSigId = -1;
int coincidences = 0;
for (int j = 0; j < sigCount; j++) {
int[] sig = SIGNATURES[j];
if (DEBUG) {
Log.d(TAG, "compare" + i + ": " + Integer.toHexString(bytes) + " with " + sig[i]);
}
if (bytes == sig[i]) {
lastSigId = j;
coincidences++;
}
}
// signature is unknown
if (coincidences == 0) {
break;
}
// if first bytes of signature is known we check signature for full coincidence
if (coincidences == 1) {
int[] sig = SIGNATURES[lastSigId];
int sigLength = sig.length;
boolean isSigKnown = true;
for (; i < MAX_SIGNATURE_LENGTH && i < sigLength; i++) {
bytes = byteArray[i];
if (bytes != sig[i]) {
isSigKnown = false;
break;
}
}
if (isSigKnown) {
signatureId = lastSigId;
}
break;
}
}
return signatureId;
}
signatureId
हस्ताक्षर की सरणी में हस्ताक्षर का एक सूचकांक है। उदाहरण के लिए,
private static final int[] SIGNATURE_PNG = hexStringToIntArray("89504E470D0A1A0A");
private static final int[] SIGNATURE_JPEG = hexStringToIntArray("FFD8FF");
private static final int[] SIGNATURE_GIF = hexStringToIntArray("474946");
public static final int SIGNATURE_ID_JPEG = 0;
public static final int SIGNATURE_ID_PNG = 1;
public static final int SIGNATURE_ID_GIF = 2;
private static final int[][] SIGNATURES = new int[3][];
static {
SIGNATURES[SIGNATURE_ID_JPEG] = SIGNATURE_JPEG;
SIGNATURES[SIGNATURE_ID_PNG] = SIGNATURE_PNG;
SIGNATURES[SIGNATURE_ID_GIF] = SIGNATURE_GIF;
}
अब मेरे पास फाइल टाइप है भले ही फाइल का URI नहीं है। अगले मैं फ़ाइल प्रकार से माइम प्रकार मिलता है। यदि आप नहीं जानते कि किस प्रकार का माइम प्राप्त करना है, तो आप इस तालिका में उचित पा सकते हैं ।
यह बहुत सारे फ़ाइल प्रकारों के लिए काम करता है। लेकिन वीडियो के लिए यह काम नहीं करता है, क्योंकि आपको माइम प्रकार प्राप्त करने के लिए ज्ञात वीडियो कोडेक की आवश्यकता है। वीडियो के माइम प्रकार प्राप्त करने के लिए मैं MediaMetadataRetriever का उपयोग करता हूं ।