آموزش حافظه خارجی ( External Storage ) در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش حافظه خارجی ( External Storage ) در برنامه نویسی اندروید می پردازیم ما در اینبار به سه عمل Read یا خواندن حافظه , Write نوشتن در حافظه و در آخر save ذخیره در حافظه خارجی اندروید می پردازیم در ادامه با ما همراه باشید.
دو نوع حافظه خارجی یا External Storage وجود دارد که عبارتند از
- Primary External Storage : این حافظه همان حافظه داخلی گوشی محصوب می شود مثلا گوشی Galaxy s7 32 GB و این نوع حافظه در تمامی گوشی ها وجود دارد و به آن حافظه داخلی یا Built-in Memory نیز می گویند.
- Secondary External Storage : این حافظه ممکن است در بعضی گوشی ها وجود داشته باشد یا نداشته باشد و به آن SD-CARD نیز می گویند.
برای اینکه بخواییم از حافظه خارجی استفاده یعنی هم بخوانیم و هم بنویسیم باید دسترسی های زیر را در فایل AndroidManifest.xml اضافه کنیم.
1 2 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> |
اگر بخواهیم بررسی کنیم که حافظه خارجی وجود دارد و یا غیر قابل نوشتن است می توانیم از کد زیر استفاده کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) { } else { } private static boolean isExternalStorageReadOnly() { String extStorageState = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) { return true; } return false; } private static boolean isExternalStorageAvailable() { String extStorageState = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(extStorageState)) { return true; } return false; } |
در ادامه نحوه استفاده از آن را در یک مثال ساده می بینید.
ابتدا یک فایل به نام activity_main.xml ایجاد کنید (این layout اصلی ما است) و کد زیر را در آن قرار دهید.
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 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Reading and Writing to External Storage Programchi.ir" android:textSize="24sp"/> <EditText android:id="@+id/myInputText" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:lines="5" android:minLines="3" android:gravity="top|left" android:inputType="textMultiLine"> <requestFocus /> </EditText> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="1.0" android:layout_marginTop="20dp"> <Button android:id="@+id/saveExternalStorage" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="SAVE" android:layout_weight="0.5"/> <Button android:id="@+id/getExternalStorage" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.5" android:text="READ" /> </LinearLayout> <TextView android:id="@+id/response" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:text="" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> |
شامل یک EditText برای دریافت ورودی از کاربر و ذخیره آن در یک فایل txt یک دکمه برای برای ذخیره داده وارد شده و یک دکمه دیگر برای دریافت داده ذخیره شده در فایل txt استفاده شده است و از یک TextView برای اینکه بدانیم عملیات انجام شده اتفاق افتاده اند یا نه .
حالا یک فایل به نام 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 | package ir.programchi; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import android.os.Bundle; import android.app.Activity; import android.os.Environment; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { EditText inputText; TextView response; Button saveButton,readButton; private String filename = "SampleFile.txt"; private String filepath = "MyFileStorage"; File myExternalFile; String myData = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); inputText = (EditText) findViewById(R.id.myInputText); response = (TextView) findViewById(R.id.response); saveButton = (Button) findViewById(R.id.saveExternalStorage); saveButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { FileOutputStream fos = new FileOutputStream(myExternalFile); fos.write(inputText.getText().toString().getBytes()); fos.close(); } catch (IOException e) { e.printStackTrace(); } inputText.setText(""); response.setText("SampleFile.txt saved to External Storage..."); } }); readButton = (Button) findViewById(R.id.getExternalStorage); readButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { FileInputStream fis = new FileInputStream(myExternalFile); DataInputStream in = new DataInputStream(fis); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String strLine; while ((strLine = br.readLine()) != null) { myData = myData + strLine; } in.close(); } catch (IOException e) { e.printStackTrace(); } inputText.setText(myData); response.setText("SampleFile.txt data retrieved from Internal Storage..."); } }); if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) { saveButton.setEnabled(false); } else { myExternalFile = new File(getExternalFilesDir(filepath), filename); } } private static boolean isExternalStorageReadOnly() { String extStorageState = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) { return true; } return false; } private static boolean isExternalStorageAvailable() { String extStorageState = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(extStorageState)) { return true; } return false; } } |
در ابتدا عملکرد دو void به نام های isExternalStorageReadOnly و isExternalStorageAvailable را توضیح دادیم و در قبل هم آموزش ایجاد فایل txt را در سایت قرار داده بودیم می توانید از آن آموزش برای درک بهتره ایجاد فایل txt استفاده کنید در صورتی که خطا داشتید باید متغیر filepath را تغییر دهید در بالا هم کار خاصی انجام نداده ایم داده را از طریق EditText داده را دریافت می کنیم سپس فایل txt را ایجاد می کنیم و داده دریافت شده را در آن قرار می دهیم و زمانی که بروی دکمه دریافت کلیک کنیم داده دریافت می شود و در EditText قرار می گیرد.
این آموزش هم به پایان رسید.
موفق و موید باشید.
سلام من میخوام یک فایل رو از روی حافظه خارجی مثلا یک فایل که در فولدر pictures است رو کپی کنم توی یه فولدر دیگه در همون حافظه خارجی میشه راهنمایی کنید که چه کدی نیاز دارم ؟