सवाल एंड्रॉइड एसडी कार्ड फ़ोल्डर को लिखें


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

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

चियर्स

EEF


76
2017-08-23 21:24


मूल


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


जवाब:


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);
...

152
2017-08-23 21:36



अपनी निर्देशिका और फ़ाइल नामों में सभी निचले केस अक्षरों का उपयोग करना सुनिश्चित करें। - BeccaP
क्या मुझे पता है कि इसका अर्थ "/ dir1 / dir2" से क्या है और इसके बिना मैं अपनी फ़ाइल को एसडीकार्ड में सहेज नहीं सकता हूं? - AndroidOptimist
इंटरनेट जोड़ने और एंड्रॉइड को बाहरी संग्रहण अनुमति लिखना न भूलें .. - Nepster
डॉक्टर के अनुसार: नोट: यहां "बाहरी" शब्द से भ्रमित न हों। यह निर्देशिका मीडिया / साझा भंडारण के रूप में बेहतर ढंग से सोचा जा सकता है। यह एक फाइल सिस्टम है जो अपेक्षाकृत बड़ी मात्रा में डेटा रख सकता है और यह सभी अनुप्रयोगों में साझा किया जाता है (अनुमतियों को लागू नहीं करता है)। परंपरागत रूप से यह एक एसडी कार्ड है, लेकिन इसे किसी डिवाइस में अंतर्निहित स्टोरेज के रूप में भी कार्यान्वित किया जा सकता है जो संरक्षित आंतरिक भंडारण से अलग है और इसे कंप्यूटर पर फाइल सिस्टम के रूप में रखा जा सकता है - mr5
@NeonWarge यहाँ देखें - mr5


एंड्रॉइड मैनिफेस्ट में अनुमति जोड़ें

जोड़ना यह 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> 

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

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

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

एक फाइलराइटर का प्रयोग करें

अंत में लेकिन कम से कम भूल जाओ 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();

29
2017-11-20 17:18



पुस्तक जो मैं पढ़ रहा हूं उसके लेखक एक का उपयोग करने की सिफारिश करते हैं FileOutputStream (ठीक है, यह विकल्प को कवर नहीं करता है)। इसका उपयोग करना बेहतर क्यों है FileWriter इसके बजाए - क्या यह तेज़ / अधिक विश्वसनीय / कुछ और है? - aga
@aga FileWriter स्ट्रिंग्स को सीधे लिखने के लिए सुविधा विधियां हैं, जो कि पर मौजूद नहीं हैं FileOutputStream। यदि आप टेक्स्ट फाइल नहीं लिख रहे हैं, FileWriter बहुत मदद नहीं है। वास्तव में, यदि आप एक लिख रहे हैं छविफ़ाइल, यह वास्तव में एक के साथ बिल्कुल नहीं किया जा सकता है FileWriter  बेशक, अगर आप वास्तव में पाठ के लिए एक अच्छा एपीआई चाहते हैं, अपना लपेटो FileOutputStream में PrintStream और आपके पास सभी समान विधियां होंगी System.out। - Ian McLaird
फाइल सफलतापूर्वक लिखी जाने के बाद मुझे अपने एसडीकार्ड पर फ़ाइल क्यों नहीं मिल सकती? - Someone Somewhere


यहां जवाब मिला - 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 / फ़ोल्डर पर जाते हैं तो आपको कोड में निर्दिष्ट सामग्री के साथ - My-File-Name.txt नाम की एक फ़ाइल दिखाई देगी।

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

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

2
2018-01-30 08:05



निर्देशिका /sdcard/ हमेशा एसडीकार्ड नहीं है। - CurlyCorvus
मैं घुंघराले से सहमत हूँ। मेरे फोन पर विधि प्राप्त करें बाहरी स्टोरेज डायरेक्टरी एक नकली भंडारण देता है, जो एसडीकार्ड नहीं है। - Spindizzy


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

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

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

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

-1
2017-10-05 15:31