Hello Friends, Today I am writing this post to share that how to read and write file to external storage in Android. In the latest version of android Marshmallow, we cannot read and write file directly in external storage even we declare permission in manifest file but in lower version we can use external storage after declaring permission in manifest file.
To access external storage in Marshmallow we need to take permission at runtime. From the code below we can read & write file to external storage on any android version.
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zatackcoder.storefile"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.zatackcoder.storefile.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="File Content and Information will be shown here" android:id="@+id/data_and_info" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Write" android:id="@+id/writeB" android:layout_alignParentBottom="true" android:layout_toLeftOf="@+id/readB" android:layout_toStartOf="@+id/readB" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Read" android:id="@+id/readB" android:layout_marginRight="74dp" android:layout_marginEnd="74dp" android:layout_alignTop="@+id/writeB" android:layout_alignRight="@+id/data_and_info" android:layout_alignEnd="@+id/data_and_info" /> </RelativeLayout> |
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
package com.zatackcoder.storefile; import android.Manifest; import android.content.pm.PackageManager; import android.os.Build; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback{ TextView dataAndInfoTV; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dataAndInfoTV = (TextView)findViewById(R.id.data_and_info); Button writeB = (Button)findViewById(R.id.writeB); Button readB = (Button)findViewById(R.id.readB); writeB.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { if(isExternalStorageWritable()){ Toast.makeText(getApplicationContext(), "External Storage Writable", Toast.LENGTH_LONG).show(); File file = new File(Environment.getExternalStorageDirectory(),"storagefile"); if(!file.exists()){ if(file.mkdir()){ Toast.makeText(getApplicationContext(), "Directory created", Toast.LENGTH_LONG).show(); } } else { Toast.makeText(getApplicationContext(), "Directory already available", Toast.LENGTH_LONG).show(); dataAndInfoTV.setText(file.getAbsolutePath()); } File newfile = new File(file.getAbsolutePath()+"/testfile.txt"); try { if(!newfile.exists()){ newfile.createNewFile(); } FileOutputStream outputStream = new FileOutputStream(newfile); outputStream.write("This is file content".getBytes()); outputStream.close(); Toast.makeText(getApplicationContext(), "File created", Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Error while creating File", Toast.LENGTH_LONG).show(); } } else { Toast.makeText(getApplicationContext(), "External Storage Not Writable", Toast.LENGTH_LONG).show(); } } }); readB.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/storagefile/testfile.txt"); if(file != null && file.exists()){ try { FileInputStream fis = new FileInputStream(file); String str = ""; int data; while((data = fis.read()) != -1){ str += (char)data; } dataAndInfoTV.setText(str); } catch (FileNotFoundException e) { Toast.makeText(getApplicationContext(), "File not found", Toast.LENGTH_LONG).show(); } catch (IOException e) { Toast.makeText(getApplicationContext(), "Error while reading File", Toast.LENGTH_LONG).show(); } } else { Toast.makeText(getApplicationContext(), "File does not exists", Toast.LENGTH_LONG).show(); } } }); //Getting permission for Marshmallow or higher version at runtime getExternalStorageWritePermission(); } /* Checks if external storage is available for read and write */ private boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } private void getExternalStorageWritePermission(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ // Should we show an explanation? if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { } else { //Requesting permission. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); } } } } @Override //Override from ActivityCompat.OnRequestPermissionsResultCallback Interface public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 1: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission granted } return; } } } } |
Screen Shot
Download Android Studio Project
Thanks
Comments