Soru Android sd kart klasörüne yaz


Sunucumdan bir dosya indirmek ve daha sonra sd kartının kök dizinine yazmak için aşağıdaki kodu kullanıyorum, hepsi iyi çalışıyor:

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

    }
}

Ancak, kullanarak Environment.getExternalStorageDirectory(); dosyanın her zaman root'a yazacağı anlamına gelir /mnt/sdcard. Dosyayı yazmak için belirli bir klasör belirtmek mümkün mü?

Örneğin: /mnt/sdcard/myapp/downloads

Şerefe

Eef


76
2017-08-23 21:24


Menşei


Ayrıca bunun çalışması için manifest içinde izinleri eklemeyi unutmayın .. <uses-allow android: name = "android.permission.WRITE_EXTERNAL_STORAGE" /> - timemirror


Cevaplar:


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



Dizininizdeki tüm küçük harfleri ve dosya adlarını kullandığınızdan emin olun. - BeccaP
"/ Dir1 / dir2" ile ne anlama geldiğini ve bunun olmadan sdcard ah dosyasımı kaydedemediğimi anlayabilir miyim? - AndroidOptimist
Android'e internet ekle ve Harici Depolama Yazma izni vermeyi unutmayın. - Nepster
Doktora göre: Not: Burada "harici" kelimesiyle karıştırmayın. Bu dizin medya / paylaşımlı depolama olarak düşünülebilir. Göreceli olarak büyük miktarda veri tutabilen ve tüm uygulamalarda paylaşılabilen bir dosya sistemidir (izinleri zorlamaz). Geleneksel olarak bu bir SD karttırAncak, korunan dahili depolamadan farklı bir cihazda yerleşik depolama olarak da kullanılabilir ve bir bilgisayarda bir dosya sistemi olarak monte edilebilir - mr5
@NeonWarge buraya bakın - mr5


Android Manifest'e İzin Ekle

Eklemek bu WRITE_EXTERNAL_STORAGE izni uygulamalarınıza tezahür eder.

<?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> 

Harici depolama kullanılabilirliğini kontrol et

Her zaman kullanılabilirliği kontrol etmelisiniz. Bir snippet harici depolama ile ilgili resmi android belgeleri.

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

Bir Filewriter kullanın

Sonunda ama en azından unutmayalım FileOutputStream ve kullan FileWriter yerine. Bu sınıf formu hakkında daha fazla bilgi FileWriter javadoc. Kullanıcıyı bilgilendirmek için burada daha fazla hata işleme koymak isteyebilirsiniz.

// 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



Okuduğum kitabın yazarları, bir FileOutputStream (iyi, alternatifleri kapsamaz). Neden kullanmak daha iyidir FileWriter bunun yerine - daha hızlı / daha güvenilir / başka bir şey mi? - aga
@aga FileWriter mevcut olmayan dizeleri doğrudan yazmak için kolaylık yöntemleri vardır. FileOutputStream. Metin dosyaları yazmıyorsanız FileWriter fazla yardım değil. Aslında, eğer bir görüntüdosya, hiç bir ile gerçekten yapamazsınız FileWriter  Tabii eğer Gerçekten mi Metin için güzel bir API isteyin, sarın FileOutputStream içinde PrintStream ve aynı yöntemlere sahip olacaksınız System.out. - Ian McLaird
Dosya başarılı bir şekilde yazılınca neden dosyayı sdcard'ımda bulamıyorum? - Someone Somewhere


Cevabı burada buldum - http://mytechead.wordpress.com/2014/01/30/android-create-a-file-and-write-to-external-storage/

Diyor ki,

/**

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

ve sonra bu kodu aslında harici depolamaya yazmak için kullanalım:

// 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();

Ve işte bu. Şimdi / sdcard / your-dir-name / klasörünü ziyaret ediyorsanız, kodda belirtilen içeriğe sahip bir dosyam - My-File-Name.txt dosyasını göreceksiniz.

Not: - Aşağıdaki izinlere ihtiyacınız var -

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

2
2018-01-30 08:05



Rehber /sdcard/ her zaman sdcard değildir. - CurlyCorvus
Curly'i kabul ediyorum. Telefonumda getExternalStorageDirectory yöntemi, taklit edilen bir depolama alanı döndürür, bu da sdcard değildir. - Spindizzy


SDCard’ta İndirme veya Müzik Klasörüne dosya indirmek için 

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

Ve bu izni manifesto olarak eklemeyi unutma

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

-1
2017-10-05 15:31