मेरा लक्ष्य आंतरिक संग्रहण पर एक XML फ़ाइल बनाना है और फिर इसे शेयर इरादे से भेजना है।आंतरिक संग्रहण से फ़ाइल बनाएं और साझा करें
मैं इस कोड
FileOutputStream outputStream = context.openFileOutput(fileName, Context.MODE_WORLD_READABLE);
PrintStream printStream = new PrintStream(outputStream);
String xml = this.writeXml(); // get XML here
printStream.println(xml);
printStream.close();
मैं इसे साझा करने के लिए आउटपुट फ़ाइल के लिए एक उरी प्राप्त करने का प्रयास कर रहा हूँ अटक का उपयोग कर एक एक्सएमएल फ़ाइल बनाने में सक्षम हूँ। मैं पहली बार एक उरी के लिए फ़ाइल को परिवर्तित करके फ़ाइल का उपयोग करने की कोशिश की
File outFile = context.getFileStreamPath(fileName);
return Uri.fromFile(outFile);
यह फ़ाइल रिटर्न: ///data/data/com.my.package/files/myfile.xml लेकिन मैं करने के लिए प्रकट नहीं कर सकता इसे ईमेल, अपलोड, इत्यादि से संलग्न करें
यदि मैं मैन्युअल रूप से फ़ाइल की लंबाई की जांच करता हूं, तो यह उचित है और दिखाता है कि एक उचित फ़ाइल आकार है।
अगला मैंने एक सामग्री प्रदाता बनाया और फ़ाइल को संदर्भित करने का प्रयास किया और यह फ़ाइल के लिए मान्य संभाल नहीं है। ContentProvider
को कभी भी कोई बिंदु नहीं कहा जाता है।
Uri uri = Uri.parse("content://" + CachedFileProvider.AUTHORITY + "/" + fileName);
return uri;
यह सामग्री प्रस्तुत करती है: //com.my.package.provider/myfile.xml लेकिन मैं फ़ाइल की जांच कर यह शून्य लंबाई है।
मैं फ़ाइलों को सही तरीके से कैसे एक्सेस करूं? क्या मुझे सामग्री प्रदाता के साथ फाइल बनाने की ज़रूरत है? यदि हां, तो कैसे?
अद्यतन
यहाँ कोड मैं साझा करने के लिए उपयोग कर रहा हूँ है। अगर मैं जीमेल का चयन करता हूं, तो यह एक अटैचमेंट के रूप में दिखाता है लेकिन जब मैं इसे भेजता हूं तो त्रुटि संलग्नक नहीं दिखा सका और आने वाले ईमेल में कोई अनुलग्नक नहीं है।
public void onClick(View view) {
Log.d(TAG, "onClick " + view.getId());
switch (view.getId()) {
case R.id.share_cancel:
setResult(RESULT_CANCELED, getIntent());
finish();
break;
case R.id.share_share:
MyXml xml = new MyXml();
Uri uri;
try {
uri = xml.writeXmlToFile(getApplicationContext(), "myfile.xml");
//uri is "file:///data/data/com.my.package/files/myfile.xml"
Log.d(TAG, "Share URI: " + uri.toString() + " path: " + uri.getPath());
File f = new File(uri.getPath());
Log.d(TAG, "File length: " + f.length());
// shows a valid file size
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("text/plain");
startActivity(Intent.createChooser(shareIntent, "Share"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
break;
}
}
मैंने देखा है कि वहाँ एक Exception
createChooser (...) अंदर से यहां फेंक दिया है, लेकिन मैं समझ नहीं क्यों यह फेंक दिया है।
ई/ActivityThread (572): गतिविधि com.android.internal.app.ChooserActivity IntentReceiver [email protected] कि मूल रूप से यहाँ पंजीकृत था लीक किया गया है। क्या आप unregisterReceiver() पर कॉल खो रहे हैं?
मैंने इस त्रुटि का शोध किया है और कुछ भी स्पष्ट नहीं मिला है। इन दोनों लिंक से पता चलता है कि मुझे एक रिसीवर को अपंजीकृत करने की आवश्यकता है।
- ChooserActivity has leaked IntentReceiver
- Why does Intent.createChooser() need a BroadcastReceiver and how to implement?
मैं एक रिसीवर सेटअप है, लेकिन यह एक AlarmManager
कि कहीं सेट किया गया है और/अपंजीकृत रजिस्टर करने के लिए एप्लिकेशन की आवश्यकता नहीं है के लिए है।
openFile के लिए कोड (...)
यदि आवश्यक हो, तो यहां सामग्री प्रदाता मैंने बनाया है।
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
String fileLocation = getContext().getCacheDir() + "/" + uri.getLastPathSegment();
ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File(fileLocation), ParcelFileDescriptor.MODE_READ_ONLY);
return pfd;
}
मुझे लगता है कि सामग्री बनाने के बजाय पहली विधि को काम करना चाहिए प्रदाता। ContentProvider का उपयोग पूरी फ़ाइल के बजाय डेटा वापस करने के लिए किया जाता है, यह आपकी आवश्यकताओं को पूरा नहीं करेगा। मेरा अनुमान है कि आपके एक्सएमएल को संभालने के लिए कोई ऐप नहीं है। क्या आप उस कोड को पोस्ट कर सकते हैं जहां आपका शेयर इरादा बनाया जा रहा है – nandeesh
यदि कोड इसे अधिक स्पष्ट बनाता है और साथ ही एक अपवाद भी है, तो मुझे यह समझ में नहीं आता कि यह संबंधित है या नहीं। – Kirk
क्या आपने एक सामग्री प्रदाता बनाया है? यदि आपके पास है, तो क्या आप इसके लिए अपना कोड पोस्ट कर सकते हैं। यदि आपको ContentProvider बनाने और OpenFile विधि को ओवरराइड करने की आवश्यकता नहीं है। उस विधि को जीमेल द्वारा बुलाया जाएगा जब यह सामग्री से जुड़े फाइल को खोलने का प्रयास करता है: //com.my.package.provider/myfile.xml uri। – Rob