आप एंड्रॉइड में एसडी कार्ड पर एक फ़ोल्डर कैसे लिखते हैं?


83

मैं अपने सर्वर से एक फ़ाइल डाउनलोड करने के लिए निम्नलिखित कोड का उपयोग कर रहा हूं फिर इसे एसडी कार्ड की रूट डायरेक्टरी में लिखें, यह सब ठीक काम करता है:

package com.downloader;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.os.Environment;
import android.util.Log;

public class Downloader {

    public void DownloadFile(String fileURL, String fileName) {
        try {
            File root = Environment.getExternalStorageDirectory();
            URL u = new URL(fileURL);
            HttpURLConnection c = (HttpURLConnection) u.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();
            FileOutputStream f = new FileOutputStream(new File(root, fileName));

            InputStream in = c.getInputStream();

            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ((len1 = in.read(buffer)) > 0) {
                f.write(buffer, 0, len1);
            }
            f.close();
        } catch (Exception e) {
            Log.d("Downloader", e.getMessage());
        }

    }
}

हालांकि, Environment.getExternalStorageDirectory();इसका उपयोग करने का मतलब है कि फ़ाइल हमेशा रूट पर लिखी जाएगी /mnt/sdcard। क्या फ़ाइल लिखने के लिए एक निश्चित फ़ोल्डर निर्दिष्ट करना संभव है?

उदाहरण के लिए: /mnt/sdcard/myapp/downloads


12
काम करने के लिए प्रकट में अनुमतियों को जोड़ने के लिए भी याद रखने की आवश्यकता है .. <उपयोग-अनुमति Android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
timemirror

जवाबों:


160
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/dir1/dir2");
dir.mkdirs();
File file = new File(dir, "filename");

FileOutputStream f = new FileOutputStream(file);
...

1
अपनी निर्देशिका और फ़ाइल नामों में सभी निचले अक्षरों का उपयोग करना सुनिश्चित करें।
BeccaP

1
क्या मुझे पता है कि इसका क्या मतलब है "/ dir1 / dir2" और इसके बिना मैं sdcard में अपनी फ़ाइल नहीं बचा सकता आह?
AndroidOptimist

17
डॉक्टर के अनुसार: नोट: यहाँ "बाहरी" शब्द से भ्रमित न हों। इस निर्देशिका को मीडिया / साझा भंडारण के रूप में बेहतर माना जा सकता है। यह एक फाइलसिस्टम है जो अपेक्षाकृत बड़ी मात्रा में डेटा पकड़ सकता है और जिसे सभी अनुप्रयोगों में साझा किया जाता है (अनुमति लागू नहीं करता है)। परंपरागत रूप से यह एक एसडी कार्ड है , लेकिन इसे डिवाइस में अंतर्निहित स्टोरेज के रूप में भी लागू किया जा सकता है जो संरक्षित आंतरिक भंडारण से अलग है और इसे कंप्यूटर पर फाइल सिस्टम के रूप में माउंट किया जा सकता है
mr5


चेतावनी: getExternalStorageDirectory()एपीआई 29 में पदावनत किया गया।
जोश कोर्रेया

30

Android मैनिफ़ेस्ट में अनुमति जोड़ें

अपने एप्लिकेशन मैनिफ़ेस्ट में यह WRITE_EXTERNAL_STORAGE अनुमति जोड़ें ।

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="your.company.package"
    android:versionCode="1"
    android:versionName="0.1">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <!-- ... -->
    </application>
    <uses-sdk android:minSdkVersion="7" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest> 

बाहरी भंडारण की उपलब्धता की जाँच करें

आपको पहले उपलब्धता के लिए हमेशा जांच करनी चाहिए। बाहरी भंडारण पर आधिकारिक Android प्रलेखन से एक स्निपेट ।

boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
    // We can read and write the media
    mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // We can only read the media
    mExternalStorageAvailable = true;
    mExternalStorageWriteable = false;
} else {
    // Something else is wrong. It may be one of many other states, but all we need
    //  to know is we can neither read nor write
    mExternalStorageAvailable = mExternalStorageWriteable = false;
}

एक Filewriter का उपयोग करें

अंत में, लेकिन इसके बजाय कम से कम भूल जाते हैं FileOutputStreamऔर उपयोग करते FileWriterहैं। उस वर्ग की अधिक जानकारी FileWriter javadoc का निर्माण करती है । आप उपयोगकर्ता को सूचित करने के लिए यहां कुछ और त्रुटि हैंडलिंग जोड़ना चाह सकते हैं।

// get external storage file reference
FileWriter writer = new FileWriter(getExternalStorageDirectory()); 
// Writes the content to the file
writer.write("This\n is\n an\n example\n"); 
writer.flush();
writer.close();

1
मैं जिस किताब को पढ़ रहा हूं उसके लेखक FileOutputStream(अच्छी तरह से, यह विकल्पों को कवर नहीं करता है) का उपयोग करने की सिफारिश करता है। FileWriterइसके बजाय इसका उपयोग करना बेहतर क्यों है - क्या यह तेज / अधिक विश्वसनीय / कुछ और है?
आगा

3
@aga FileWriterमें स्ट्रिंग्स को सीधे लिखने की सुविधा विधियाँ हैं, जो a पर मौजूद नहीं हैं FileOutputStream। यदि आप टेक्स्ट फाइल नहीं लिख रहे हैं, FileWriterतो ज्यादा मदद नहीं मिलेगी। वास्तव में, यदि आप एक छवि फ़ाइल लिख रहे हैं, तो यह वास्तव में बिल्कुल नहीं हो सकता है FileWriter , यदि आप वास्तव में पाठ के लिए एक अच्छा एपीआई चाहते हैं , तो अपने FileOutputStreamमें लपेटें PrintStreamऔर आपके पास सभी समान तरीके होंगे System.out
इयान मैक्लेयर

1
फ़ाइल सफलतापूर्वक लिखे जाने के बाद मुझे अपने sdcard पर फ़ाइल क्यों नहीं मिल रही है?
कोई व्यक्ति

2

यहाँ उत्तर मिला - http://mytechead.wordpress.com/2014/01/30/android-create-a-file-and-write-to-external-storage/

इसे कहते हैं,

/**

* Method to check if user has permissions to write on external storage or not

*/

public static boolean canWriteOnExternalStorage() {
   // get the state of your external storage
   String state = Environment.getExternalStorageState();
   if (Environment.MEDIA_MOUNTED.equals(state)) {
    // if storage is mounted return true
      Log.v("sTag", "Yes, can write to external storage.");
      return true;
   }
   return false;
}

और फिर इस कोड का उपयोग वास्तव में बाहरी संग्रहण पर लिखने के लिए करें:

// get the path to sdcard
File sdcard = Environment.getExternalStorageDirectory();
// to this path add a new directory path
File dir = new File(sdcard.getAbsolutePath() + "/your-dir-name/");
// create this directory if not already created
dir.mkdir();
// create the file in which we will write the contents
File file = new File(dir, "My-File-Name.txt");
FileOutputStream os = outStream = new FileOutputStream(file);
String data = "This is the content of my file";
os.write(data.getBytes());
os.close();

और यह बात है। अगर अब आप अपने / sdcard / your-dir-name / folder पर जाते हैं, तो आपको कोड में निर्दिष्ट सामग्री के साथ - My-File-Name.txt नाम की एक फ़ाइल दिखाई देगी।

पुनश्च: - आपको निम्नलिखित अनुमति की आवश्यकता है -

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2
निर्देशिका /sdcard/हमेशा sdcard नहीं है।
सिल्वरकोरवस

मैं कर्ली के लिए सहमत हूं। मेरे फोन पर विधि getExternalStorageDirectory एक एमुलेटेड स्टोरेज देती है, जो sdcard नहीं है।
स्पिन्डीज़ि

-1

एसडीकार्ड में डाउनलोड या संगीत फ़ोल्डर में एक फ़ाइल डाउनलोड करने के लिए

File downlodDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);// or DIRECTORY_PICTURES

और प्रकट में इन अनुमति को जोड़ने के लिए मत भूलना

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

क्या यह एसडी कार्ड के बजाय डाउनलोड फ़ोल्डर में नहीं है?
जोश कोर्रेया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.