How to read and write files to removable sd card in Android?

I want to store Android Id in Text file. The text file should be created on external sdcard.

Code:

PackageManager m = getPackageManager();
String s = getPackageName();
PackageInfo p = m.getPackageInfo(s, 0);
s = p.applicationInfo.dataDir;
File myFile = new File(s + "/MyDoople.txt");
myFile.createNewFile();
FileOutputStream fOut = new FileOutputStream(myFile);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append(TxtS.getText());
myOutWriter.close();
fOut.close();
Toast.makeText(getBaseContext(),"Text Updated",Toast.LENGTH_SHORT).show();

The Second is

 File sdCard = new File("file:///mnt/external_sd/");
 File myFile = new File(sdCard, "test.txt");
 FileWriter writer = new FileWriter(myFile); 
 writer.append(TESTSTRING);
 writer.flush(); 
 writer.close();
有帮助吗?

解决方案 5

My question is solved. I directly use the path "/mnt/external_sd/.. Path of File.".

But it was only work with my Device

其他提示

Try the below. Use Environment.getExternalStorageDirectory() to get the path

  File dir =new File(android.os.Environment.getExternalStorageDirectory(),"MyFolder");
    if(!dir.exists())
    {
           dir.mkdirs();
    }    
    String filename= "MyDoople.txt";
    try
    {
    File f = new File(dir+File.separator+filename);

    FileOutputStream fOut = new FileOutputStream(f);
    OutputStreamWriter myOutWriter = new OutputStreamWriter(
            fOut);
    myOutWriter.append("Mytest");
    myOutWriter.close();
    fOut.close();
    Toast.makeText(getBaseContext(),
            "Text Updated",
            Toast.LENGTH_SHORT).show();
   }
    catch(Exception e)
    {
        e.printStackTrace();
    }

To update:

try
{

FileWriter fileWritter = new FileWriter(f,true);
BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
bufferWritter.write("Mydata");
bufferWritter.close();
}
 catch(Exception e)
 {
e.printStackTrace();
 }

Result on my device when i opened with a text file viewer.

enter image description here

Edit:

The below is hackish and not the recommended way.

In my device (Samsung Galaxy s3) my internal phone memory is named sdCard0 and my external extSdcard. This Environment.getExternalStorageDirectory() will give path of internl memory. In such cases you can use the below to get path of external memory.

String externalpath = new String();
String internalpath = new String();

public  void getExternalMounts() {
Runtime runtime = Runtime.getRuntime();
try
{
Process proc = runtime.exec("mount");
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
String line;

BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
    if (line.contains("secure")) continue;
    if (line.contains("asec")) continue;

    if (line.contains("fat")) {//external card
        String columns[] = line.split(" ");
        if (columns != null && columns.length > 1) {
            externalpath = externalpath.concat("*" + columns[1] + "\n");
        }
} 
        else if (line.contains("fuse")) {//internal storage
        String columns[] = line.split(" ");
        if (columns != null && columns.length > 1) {
            internalpath = internalpath.concat(columns[1] + "\n");
        }
    }
}
}
catch(Exception e)
{
    e.printStackTrace();
}
  System.out.println("Path  of sd card external............"+externalpath);
  System.out.println("Path  of internal memory............"+internalpath);
}
private static String getExternalStoragePath(Context mContext) {

    StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
    Class<?> storageVolumeClazz = null;
    try {
        storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
        Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
        Method getPath = storageVolumeClazz.getMethod("getPath");
        Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
        Object result = getVolumeList.invoke(mStorageManager);
        final int length = Array.getLength(result);
        for (int i = 0; i < length; i++) {
            Object storageVolumeElement = Array.get(result, i);
            String path = (String) getPath.invoke(storageVolumeElement);
            boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
            if (removable == true) {
                return path;
            }
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return null;
}

and enter this code.

It return path of SD Card path if SD card is available

and then you can use that path .

String sdCardPath = getExternalStoragePath(context);
File Path1 = new File(sdCardPath + "NewFolder");
    if (!Path1.exists()) {
        Path1.mkdir();
    }
File file = new File(Path1, "test.txt");

Maybe you forget these permissions.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
      package com.example.writeinsdcard;

       import android.os.Bundle;
       import android.app.Activity;
       import android.view.Menu;
       import java.io.BufferedReader;
       import java.io.File;
       import java.io.FileNotFoundException;
       import java.io.FileOutputStream;
       import java.io.IOException;
       import java.io.InputStream;
       import java.io.InputStreamReader;
       import java.io.PrintWriter;
       import android.os.Environment;
       import android.util.Log;
       import android.widget.TextView;

       public class MainActivity extends Activity {

             private static final String TAG = "Sdcard";
             private TextView tv;

             @Override
             protected void onCreate(Bundle savedInstanceState) {
                      super.onCreate(savedInstanceState);
                      setContentView(R.layout.fragment_main);

                      tv = (TextView) findViewById(R.id.TextView01);
                      checkExternalMedia();
                      writeToSDFile();
                      readRaw();

             }

             @Override
             public boolean onCreateOptionsMenu(Menu menu) {
                      // Inflate the menu; this adds items to the action bar if it is present.
                      getMenuInflater().inflate(R.menu.main, menu);
                      return true;
             }

             /** Method to check whether external media available and writable. This is adapted from
          http://developer.android.com/guide/topics/data/data-storage.html#filesExternal */

             private void checkExternalMedia(){
                      boolean mExternalStorageAvailable = false;
                      boolean mExternalStorageWriteable = false;
                      String state = Environment.getExternalStorageState();

                      if (Environment.MEDIA_MOUNTED.equals(state)) {
                               // Can read and write the media
                               mExternalStorageAvailable = mExternalStorageWriteable = true;
                      } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
                               // Can only read the media
                               mExternalStorageAvailable = true;
                               mExternalStorageWriteable = false;
                      } else {
                               // Can't read or write
                               mExternalStorageAvailable = mExternalStorageWriteable = false;
                      }   
                      tv.append("\n\nExternal Media: readable="
                                     +mExternalStorageAvailable+" writable="+mExternalStorageWriteable);
             }

             /** Method to write ascii text characters to file on SD card. Note that you must add a 
          WRITE_EXTERNAL_STORAGE permission to the manifest file or this method will throw
          a FileNotFound Exception because you won't have write permission. */

             private void writeToSDFile(){

                      // Find the root of the external storage.
                      // See http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

                      File root = android.os.Environment.getExternalStorageDirectory(); 
                      tv.append("\nExternal file system root: "+root);


                      File dir = new File (root.getAbsolutePath() + "/download");
                      dir.mkdirs();
                      File file = new File(dir, "myData.txt");

                      try {
                               FileOutputStream f = new FileOutputStream(file);
                               PrintWriter pw = new PrintWriter(f);
                               pw.println("Howdy do to you.");
                               pw.println("Here is a second line.");
                               pw.flush();
                               pw.close();
                               f.close();
                      } catch (FileNotFoundException e) {
                               e.printStackTrace();
                               Log.i(TAG, "File not found. Did you" +
                               " add a WRITE_EXTERNAL_STORAGE permission to the manifest?");
                      } catch (IOException e) {
                               e.printStackTrace();
                      } 
                      tv.append("\n\nFile written to:\n"+file);
             }

             /** Method to read in a text file placed in the res/raw directory of the application. The
             method reads in all lines of the file sequentially. */

             private void readRaw(){
                      tv.append("\n\nData read from res/raw/textfile.txt:\n");
                      InputStream is = this.getResources().openRawResource(R.raw.textfile);
                      InputStreamReader isr = new InputStreamReader(is);
                      BufferedReader br = new BufferedReader(isr, 8192);    // 2nd arg is buffer size

                      // More efficient (less readable) implementation of above is the composite expression
                      /*BufferedReader br = new BufferedReader(new InputStreamReader(
                               this.getResources().openRawResource(R.raw.textfile)), 8192);*/

                      try {
                               String test; 
                               while (true){                
                                     test = br.readLine();   
                                     // readLine() returns null if no more lines in the file
                                     if(test == null) break;
                                     tv.append("\n"+"    "+test);
                               }
                               isr.close();
                               is.close();
                               br.close();
                      } catch (IOException e) {
                               e.printStackTrace();
                      }
                      tv.append("\n\nThat is all");
             }
       }

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.writesdcard"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />
    <!--permission to write external storage  -->
    <uses-permission 
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.writesdcard.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>
    </application>

</manifest>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top