दिलचस्प पोस्ट
पता लगाएँ कि कोई चेतावनी या पुष्टिकरण पृष्ठ पर प्रदर्शित होता है कस्टम ऑब्जेक्ट्स को NSUserDefaults में सहेजें jquery: पुनर्निर्देशित किए बिना यूआरएल पते को परिवर्तित करें? JavaScript में सरणी से तत्व कैसे निकालें? Django व्यवस्थापक, स्थैतिक और मीडिया फ़ाइलों में भ्रम समान चौड़ाई फ्लेक्स आइटम वे लपेटो के बाद भी UIView के साथ एक पुस्तक की तरह एक पृष्ठ को चालू करें? लिनक्स में जीसीसी के लिए पथ कैसे शामिल है? सी में एक सरणी में एक पाठ फ़ाइल को पढ़ना समवर्ती संशोधन अपवाद: एक ArrayList को जोड़ना MSVCP120d.dll गायब है Google मानचित्र, एक लिंक पर क्लिक करने के बाद जानकारी विंडो खोलें एसक्यूएल सर्वर सीटीई और रिकर्सन उदाहरण दृश्य स्टूडियो में multithreaded प्रोग्राम डीबग करने पर "चरण ओवर" जेनकिंस सीआई पर एक्सेल खोलें

आंतरिक संग्रहण से एक फ़ाइल बनाएं और साझा करें

मेरा लक्ष्य आंतरिक भंडारण पर एक XML फ़ाइल बनाना है और फिर इसे शेयर इन्टेंट के माध्यम से भेजना है

मैं इस कोड का उपयोग कर एक 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; } } 

मैंने देखा है कि यहां CreateChooser (…) के अंदर से एक अप्रत्याशित फेंक दिया गया है, लेकिन मुझे पता नहीं है कि यह क्यों फेंका गया है।

ई / गतिविधिथीफ्रेड (572): गतिविधि com.android.internal.app.ChooserActivity ने IntentReceiver com.android.internal.app.ResolverActivity$1@4148d658 लीक कर लिया है जो मूलतः यहां पंजीकृत था। क्या आप अपंजीकृत रिसीवर () को कॉल नहीं कर रहे हैं?

मैंने इस त्रुटि की खोज की है और कुछ भी स्पष्ट नहीं मिल सकता है इन दोनों लिंक्स से पता चलता है कि मुझे एक रिसीवर को अपंजीकृत करने की आवश्यकता है

  • चुनावकर्ता गतिविधि ने इन्टेंट रीसेवर को लीक कर दिया है
  • क्यों Intent.createChooser () को ब्रॉडकास्ट रिसीवर की आवश्यकता होती है और इसे कैसे कार्यान्वित करें?

मेरे पास एक रिसीवर सेटअप है, लेकिन यह एक AlarmManager के लिए है जिसे कहीं और सेट किया गया है और एप को पंजीकरण / अपंजीकृत करने की आवश्यकता नहीं है

ओपनफ़ाइल के लिए कोड (…)

यदि यह आवश्यक है, तो यहां वह सामग्री प्रदाता है जिसे मैंने बनाया है।

 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; } 

Solutions Collecting From Web of "आंतरिक संग्रहण से एक फ़ाइल बनाएं और साझा करें"

ContentProvider के माध्यम से आपकी ऐप्स निजी निर्देशिका में संग्रहीत एक फ़ाइल को बेनकाब करना संभव है यहां कुछ उदाहरण कोड है I ने दिखा दिया है कि ऐसा कैसे किया जा सकता है कि ऐसा सामग्री प्रदाता बनाने के लिए।

प्रकट

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.providertest" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="15" /> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name="MyProvider" android:authorities="com.example.prov" android:exported="true" /> </application> </manifest> 

आपके ContentProvider में ParcelFileDescriptor लौटने के लिए ओपन फाइल को ओवरराइड करें

 @Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { File cacheDir = getContext().getCacheDir(); File privateFile = new File(cacheDir, "file.xml"); return ParcelFileDescriptor.open(privateFile, ParcelFileDescriptor.MODE_READ_ONLY); } 

सुनिश्चित करें कि आपने कैश निर्देशिका में अपनी xml फाइल कॉपी की है

  private void copyFileToInternal() { try { InputStream is = getAssets().open("file.xml"); File cacheDir = getCacheDir(); File outFile = new File(cacheDir, "file.xml"); OutputStream os = new FileOutputStream(outFile.getAbsolutePath()); byte[] buff = new byte[1024]; int len; while ((len = is.read(buff)) > 0) { os.write(buff, 0, len); } os.flush(); os.close(); is.close(); } catch (IOException e) { e.printStackTrace(); // TODO: should close streams properly here } } 

अब किसी भी अन्य ऐप्स को अपनी निजी फ़ाइल के लिए सामग्री यूरी (सामग्री: //com.example.prov/myfile.xml) का उपयोग करके एक इनपुटस्ट्रीम प्राप्त करने में सक्षम होना चाहिए।

एक साधारण परीक्षण के लिए, निम्नलिखित के समान एक अलग ऐप से सामग्री प्रदाता को कॉल करें

  private class MyTask extends AsyncTask<String, Integer, String> { @Override protected String doInBackground(String... params) { Uri uri = Uri.parse("content://com.example.prov/myfile.xml"); InputStream is = null; StringBuilder result = new StringBuilder(); try { is = getApplicationContext().getContentResolver().openInputStream(uri); BufferedReader r = new BufferedReader(new InputStreamReader(is)); String line; while ((line = r.readLine()) != null) { result.append(line); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (is != null) is.close(); } catch (IOException e) { } } return result.toString(); } @Override protected void onPostExecute(String result) { Toast.makeText(CallerActivity.this, result, Toast.LENGTH_LONG).show(); super.onPostExecute(result); } } 

तो रोब का उत्तर सही है, मैं मानता हूँ, लेकिन मैंने इसे थोड़ी अलग तरीके से किया। जहाँ तक मैं समझता हूं, प्रदाता में सेटिंग के साथ:

 android:exported="true" 

आप अपनी सभी फाइलों को सार्वजनिक पहुंच दे रहे हैं ?! वैसे भी, कुछ फ़ाइलों को केवल पहुंच देने का एक तरीका है कि फ़ाइल पथ अनुमतियां निम्न तरीके से परिभाषित करें:

 <provider android:authorities="com.your.app.package" android:name="android.support.v4.content.FileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> 

और फिर अपनी XML निर्देशिका में आप फ़ाइल के रूप में परिभाषित file_paths.xml निम्नानुसार है:

 <paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path path="/" name="allfiles" /> <files-path path="tmp/" name="tmp" /> </paths> 

अब, "सभी फाइलें" इसी तरह की सार्वजनिक अनुमति देता है, मैं एंड्रॉइड विकल्प के रूप में अनुमान लगाता हूं : export = "true" लेकिन आप वास्तव में नहीं चाहते हैं कि मुझे लगता है कि मुझे उप-डायरेक्टरी परिभाषित करने के लिए अगली पंक्ति है फिर आपको जो कुछ करना है वह उन फ़ाइलों को संग्रहीत करता है जिन्हें आप साझा करना चाहते हैं, वहां उस डायर में

अगला क्या करना है, जैसा कि रोब कहता है, इस फाइल के लिए यूआरआई प्राप्त करें मैंने इस तरह से इसे किया:

 Uri contentUri = FileProvider.getUriForFile(context, "com.your.app.package", sharedFile); 

उसके बाद, जब मेरे पास यह यूआरआई होता है, तो मुझे दूसरे ऐप के इस्तेमाल के लिए इसे अनुमति के साथ संलग्न करना पड़ता था। मैं कैमरा एपी को इस फाइल यूआरआई का उपयोग या भेज रहा था वैसे भी यह तरीका है कि मुझे अन्य ऐप पैकेज जानकारी और यूआरआइ को अनुमति दी गई है:

 PackageManager packageManager = getPackageManager(); List<ResolveInfo> list = packageManager.queryIntentActivities(cameraIntent, PackageManager.MATCH_DEFAULT_ONLY); if (list.size() < 1) { return; } String packageName = list.get(0).activityInfo.packageName; grantUriPermission(packageName, sharedFileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); ClipData clipData = ClipData.newRawUri("CAMFILE", sharedFileUri); cameraIntent.setClipData(clipData); cameraIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); cameraIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivityForResult(cameraIntent, GET_FROM_CAMERA); 

मैंने कैमरे के लिए कोड छोड़ा क्योंकि मुझे कुछ और उदाहरण नहीं लेना था, जिस पर मैंने काम नहीं किया। लेकिन इस तरीके से आप देख सकते हैं कि आप यूआरआई के लिए खुद ही अनुमति दे सकते हैं।

कैमरे की बात यह है कि मैं इसे क्लिपडाटा के जरिए सेट कर सकता हूं और इसके अतिरिक्त अनुमतियाँ सेट कर सकता हूं। मुझे लगता है कि आपके मामले में आपको केवल FLAG_GRANT_READ_URI_PERMISSION की आवश्यकता है क्योंकि आप किसी फ़ाइल को एक ईमेल से जोड़ रहे हैं

FileProvider पर मदद करने के लिए यहां लिंक है, जैसा कि मैंने वहां मिली जानकारी पर अपने सभी पोस्ट पर आधारित है I हालांकि कुछ परेशानी को कैमरा ऐप के लिए पैकेज जानकारी मिली थी।

आशा करता हूँ की ये काम करेगा।

अगर आपको अपने ऐप की निजी फाइलों (शेयर के लिए, या अन्यथा) देखने के लिए अन्य ऐप्स की अनुमति की आवश्यकता हो, तो आप कुछ समय बचा सकते हैं और केवल वी 4 कॉम्पैट लाइब्रेरी का फ़ाइलप्रदाता