मेरे निष्कर्ष:
फ़ाइल पुनर्प्राप्त करने के विभिन्न तरीकों से निपटने के लिए आपको कई फ़िल्टर की आवश्यकता होती है। यानी, gmail अटैचमेंट द्वारा, फाइल एक्सप्लोरर द्वारा, HTTP द्वारा, FTP द्वारा ... वे सभी बहुत अलग-अलग इंटेंस भेजते हैं।
और आपको अपनी गतिविधि कोड में अपनी गतिविधि को ट्रिगर करने वाले इरादे को फ़िल्टर करने की आवश्यकता है।
नीचे दिए गए उदाहरण के लिए, मैंने एक नकली फ़ाइल प्रकार new.mrz बनाया। और मैंने इसे gmail अटैचमेंट और फ़ाइल एक्सप्लोरर से पुनर्प्राप्त किया।
गतिविधि कोड onCreate में जोड़ा गया ():
Intent intent = getIntent();
String action = intent.getAction();
if (action.compareTo(Intent.ACTION_VIEW) == 0) {
String scheme = intent.getScheme();
ContentResolver resolver = getContentResolver();
if (scheme.compareTo(ContentResolver.SCHEME_CONTENT) == 0) {
Uri uri = intent.getData();
String name = getContentName(resolver, uri);
Log.v("tag" , "Content intent detected: " + action + " : " + intent.getDataString() + " : " + intent.getType() + " : " + name);
InputStream input = resolver.openInputStream(uri);
String importfilepath = "/sdcard/My Documents/" + name;
InputStreamToFile(input, importfilepath);
}
else if (scheme.compareTo(ContentResolver.SCHEME_FILE) == 0) {
Uri uri = intent.getData();
String name = uri.getLastPathSegment();
Log.v("tag" , "File intent detected: " + action + " : " + intent.getDataString() + " : " + intent.getType() + " : " + name);
InputStream input = resolver.openInputStream(uri);
String importfilepath = "/sdcard/My Documents/" + name;
InputStreamToFile(input, importfilepath);
}
else if (scheme.compareTo("http") == 0) {
// TODO Import from HTTP!
}
else if (scheme.compareTo("ftp") == 0) {
// TODO Import from FTP!
}
}
जीमेल अटैचमेंट फ़िल्टर:
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />
<data android:mimeType="application/octet-stream" />
</intent-filter>
- लॉग: सामग्री आशय का पता चला: android.intent.action.VIEW: सामग्री: //gmail-ls/l.foul@gmail.com/messages/2950/attachments/0.1/BEST/false: एप्लिकेशन / ऑक्टेट-स्ट्रीम - नया। MRZ
फ़ाइल एक्सप्लोरर फ़िल्टर:
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" />
<data android:pathPattern=".*\\.mrz" />
</intent-filter>
- लॉग: फ़ाइल आशय का पता चला: android.intent.action.VIEW: फ़ाइल: ///storage/sdcard0/My%20Documents/new.mrz: null: new.mrz
HTTP फ़िल्टर:
<intent-filter android:label="@string/rbook_viewer">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
<data android:pathPattern=".*\\.mrz" />
</intent-filter>
ऊपर इस्तेमाल किए गए निजी कार्य:
private String getContentName(ContentResolver resolver, Uri uri){
Cursor cursor = resolver.query(uri, null, null, null, null);
cursor.moveToFirst();
int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
if (nameIndex >= 0) {
return cursor.getString(nameIndex);
} else {
return null;
}
}
private void InputStreamToFile(InputStream in, String file) {
try {
OutputStream out = new FileOutputStream(new File(file));
int size = 0;
byte[] buffer = new byte[1024];
while ((size = in.read(buffer)) != -1) {
out.write(buffer, 0, size);
}
out.close();
}
catch (Exception e) {
Log.e("MainActivity", "InputStreamToFile exception: " + e.getMessage());
}
}