شرح External Storage في الاندرويد

دروس التخزين الخارجية External Storage في Android Studio مع مثال

في هذا البرنامج التعليمي سوف ندرس حول تخزين البيانات / الملفات في وحدة تخزين android الخارجية أو يمكنك قول الذاكرة الثانوية / بطاقة SD الخاصة بهاتفك. يتم تخزين البيانات في ملف يحدده المستخدم نفسه ويمكن للمستخدم الوصول إلى هذه الملفات. لا يمكن الوصول إلى هذه الملفات إلا حتى خروج التطبيق أو تثبيت بطاقة SD على جهازك.
شرح وحدة التخزين الخارجية في Android Studio
ملاحظة مهمة: من الضروري إضافة تخزين خارجي إذن القراءة والكتابة. لذلك تحتاج إلى إضافة إذن في ملف android Manifest.
افتح ملف AndroidManifest.xml وأضف الأذونات إليه بعد اسم الحزمة مباشرة.

وحدة تخزين خارجية إذن قراءة وكتابة في Android Studio

توافر التخزين الخارجي في Android Studio

لتجنب تعطل التطبيق ، يلزم التحقق قبل ما إذا كانت بطاقة SD التخزينية متاحة لعمليات القراءة والكتابة. تُستخدم طريقة getExternalStorageState () لتحديد حالة وسائط التخزين ، أي أن بطاقة SD مُثبتة ، وهل يمكن قراءتها ، أم أنها قابلة للكتابة وما إلى ذلك .. كل هذا النوع من المعلومات.

boolean isAvailable= false;
  boolean isWritable= false;
  boolean isReadable= false;
  String state = Environment.getExternalStorageState();
  if(Environment.MEDIA_MOUNTED.equals(state)){
  // Read and write operation possible
  isAvailable= true;
  isWritable= true;
  isReadable= true;
  } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){
  // Read operation possible
  isAvailable= true;
  isWritable= false;
  isReadable= true;
  } else {
  // SD card not mounted
  isAvailable = false;
  isWritable= false;
  isReadable= false; }

طرق تخزين البيانات في Android

  • getExternalStorageDirectory () - طريقة أقدم للوصول إلى وحدة التخزين الخارجية في مستوى واجهة برمجة التطبيقات أقل من 7. إنها مطلقة الآن ولا يوصى بها. تحصل مباشرة على المرجع للدليل الجذر لوحدة التخزين الخارجية أو بطاقة SD.
  • getExternalFilesDir (String type) -  يُنصح بهذه الطريقة لتمكيننا من إنشاء ملفات خاصة خاصة بالتطبيق وتتم إزالة الملفات عند إلغاء تثبيت التطبيق. مثال البيانات الخاصة بالتطبيق.
  • getExternalStoragePublicDirectory ():  هذه هي الطريقة الحالية الموصى بها والتي تمكننا من الاحتفاظ بالملفات عامة ولا يتم حذفها مع إلغاء تثبيت التطبيق. توجد صور تم النقر عليها بواسطة الكاميرا حتى نقوم بإلغاء تثبيت تطبيق الكاميرا.

مثال على التخزين الخارجي External Storage في Android Studio

يوجد أدناه مثال يوضح كيف يمكن للمستخدم استخدام الذاكرة الخارجية لتخزين البيانات. هنا نقوم بإنشاء نشاطين ، النشاط الأول يحتوي على النموذج الذي سيخزن البيانات في ملف والثاني يستخدم لتحميل البيانات المحفوظة.

كود التحميل

مثال على التخزين الخارجي في android Studio
الخطوة 1: قم بإنشاء مشروع جديد وقم بتسميته ExternalStorageExample .

الخطوة 2: افتح res -> layout -> activity_main.xml (أو) main.xml وأضف الكود التالي:

في هذا الكود ، قم ببساطة بإضافة عرض النص ، وتحرير النص ، والزر لوظيفة onclick.

<?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:id="@+id/activity_main"
  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.example.externalstorageexample.MainActivity">


  <TextView
  android:id="@+id/textView"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_alignParentTop="true"
  android:layout_marginTop="46dp"
  android:gravity="center"
  android:text="@string/add_text"
  android:textSize="18sp"
  android:textStyle="bold|italic" />


  <Button
  android:id="@+id/button4"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignLeft="@+id/button"
  android:layout_alignParentBottom="true"
  android:layout_alignStart="@+id/button"
  android:layout_marginBottom="52dp"
  android:layout_marginLeft="96dp"
  android:layout_marginStart="96dp"
  android:onClick="next"
  android:text="@string/click_to_view" />

  <Button
  android:id="@+id/button2"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_above="@+id/button4"
  android:layout_alignParentEnd="true"
  android:layout_alignParentRight="true"
  android:layout_marginBottom="22dp"
  android:layout_marginEnd="32dp"
  android:layout_marginRight="32dp"
  android:onClick="savePublic"
  android:text="@string/save_as_public" />

  <Button
  android:id="@+id/button"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignBaseline="@+id/button2"
  android:layout_alignBottom="@+id/button2"
  android:layout_alignParentLeft="true"
  android:layout_alignParentStart="true"
  android:layout_marginLeft="24dp"
  android:layout_marginStart="24dp"
  android:onClick="savePrivate"
  android:text="@string/save_as_private" />

  <EditText
  android:id="@+id/editText2"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_alignParentLeft="true"
  android:layout_alignParentStart="true"
  android:layout_below="@+id/textView"
  android:layout_marginTop="16dp"
  android:ems="10"
  android:gravity="center_vertical|center"
  android:inputType="textMultiLine" />

  </RelativeLayout>

الخطوة 3: افتح src -> package -> MainActivity.java

في هذه الخطوة ، نفتح MainActivity ونضيف الوظائف المحددة عبر الأزرار بنقرة واحدة. تحصل الدالة savePrivate و savePublic على البيانات من edittext وحفظها بتنسيق بايت في ملف. يتم أيضًا استخدام الخبز المحمص لعرض المسار حيث يتم تخزين الملف باسم الملف. تستخدم الوظيفة التالية النية للانتقال إلى النشاط التالي المرتبط بها.

ملاحظة مهمة: هناك اختلاف أثناء استرداد البيانات بمستوى API مختلف. تم تغيير مفهوم الإذن منذ API 23. قبل مستوى API 23 ، سُئل المستخدم أثناء التثبيت ، بعد مستوى API 23 ، يُطلب من المستخدم أثناء وقت التشغيل. لذلك تمت إضافة إذن وقت تشغيل إضافي في التطبيق الذي يعمل على مستوى API أعلى من 23.

package com.example.externalstorageexample;

  import android.Manifest;
  import android.content.Intent;
  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.EditText;
  import android.widget.Toast;
  import java.io.File;
  import java.io.FileOutputStream;
  import java.io.IOException;

  public class MainActivity extends AppCompatActivity {
  EditText editText;
  private int STORAGE_PERMISSION_CODE = 23;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  editText = (EditText) findViewById(R.id.editText2);
  }

  public void next(View view) {
  Intent intent = new Intent(MainActivity.this, Main2Activity.class);
  startActivity(intent);
  }

  public void savePublic(View view) {
  //Permission to access external storage
  ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
  String info = editText.getText().toString();
  File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS);// Folder Name
  File myFile = new File(folder, "myData1.txt");// Filename
  writeData(myFile, info);
  editText.setText("");
  }

  public void savePrivate(View view) {
  String info = editText.getText().toString();
  File folder = getExternalFilesDir("AbhiAndroid");// Folder Name
  File myFile = new File(folder, "myData2.txt");// Filename
  writeData(myFile, info);
  editText.setText("");
  }

  private void writeData(File myFile, String data) {
  FileOutputStream fileOutputStream = null;
  try {
  fileOutputStream = new FileOutputStream(myFile);
  fileOutputStream.write(data.getBytes());
  Toast.makeText(this, "Done" + myFile.getAbsolutePath(), Toast.LENGTH_SHORT).show();
  } catch (Exception e) {
  e.printStackTrace();
  } finally {
  if (fileOutputStream != null) {
  try {
  fileOutputStream.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
  }
  }
  }

الخطوة 4 : افتح res -> layout -> activity_main2.xml (أو) main2.xml وأضف الكود التالي:

في هذا النشاط ، يتشابه التخطيط مع main.xml.

<?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:id="@+id/activity_main2"
  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.example.externalstorageexample.Main2Activity">

  <TextView
  android:id="@+id/getText"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_alignParentLeft="true"
  android:layout_alignParentStart="true"
  android:layout_alignParentTop="true"
  android:layout_marginTop="33dp"
  android:gravity="center"
  android:text=""
  android:textSize="18sp"
  android:textStyle="bold|italic" />

  <Button
  android:id="@+id/button3"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_above="@+id/button5"
  android:layout_alignParentEnd="true"
  android:layout_alignParentRight="true"
  android:onClick="getPublic"
  android:text="@string/show_public_data" />

  <Button
  android:id="@+id/button2"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentLeft="true"
  android:layout_alignParentStart="true"
  android:layout_below="@+id/getText"
  android:layout_marginTop="178dp"
  android:onClick="getPrivate"
  android:text="@string/show_private_data"
  tools:ignore="UnknownId" />

  <Button
  android:id="@+id/button5"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_below="@+id/button2"
  android:layout_centerHorizontal="true"
  android:layout_marginTop="59dp"
  android:onClick="back"
  android:text="@string/back" />

  </RelativeLayout>

الخطوة 5: افتح src -> package -> MainActivity2.java

في هذه الخطوة ، نفتح MainActivity2 ونضيف الوظائف المحددة عبر الزر عند النقر. تقوم الدالتان getPrivate و getPublic باسترداد البيانات من الملف وإضافتها إلى المخزن المؤقت وتعيين النص على طريقة عرض النص. تحتوي وظيفة الرجوع على نية للعودة إلى النشاط الرئيسي.

package com.example.externalstorageexample;

  import android.content.Intent;
  import android.os.Environment;
  import android.support.v7.app.AppCompatActivity;
  import android.os.Bundle;
  import android.view.View;
  import android.widget.TextView;
  import java.io.*;

  public class Main2Activity extends AppCompatActivity {
  TextView showText;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main2);
  showText = (TextView) findViewById(R.id.getText);

  }

  public void back(View view) {
  Intent intent = new Intent(Main2Activity.this, MainActivity.class);
  startActivity(intent);
  }

  public void getPublic(View view) {
  File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS); // Folder Name
  File myFile = new File(folder, "myData1.txt"); // Filename
  String text = getdata(myFile);
  if (text != null) {
  showText.setText(text);
  } else {
  showText.setText("No Data");
  }
  }

  public void getPrivate(View view) {
  File folder = getExternalFilesDir("AbhiAndroid"); // Folder Name
  File myFile = new File(folder, "myData2.txt"); // Filename
  String text = getdata(myFile);
  if (text != null) {
  showText.setText(text);
  } else {
  showText.setText("No Data");
  }
  }

  private String getdata(File myfile) {
  FileInputStream fileInputStream = null;
  try {
  fileInputStream = new FileInputStream(myfile);
  int i = -1;
  StringBuffer buffer = new StringBuffer();
  while ((i = fileInputStream.read()) != -1) {
  buffer.append((char) i);
  }
  return buffer.toString();
  } catch (Exception e) {
  e.printStackTrace();
  } finally {
  if (fileInputStream != null) {
  try {
  fileInputStream.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
  }
  return null;
  }

  }

الإخراج :

الآن قم بتشغيل التطبيق وسترى الشكل على الشاشة. أضف البيانات في الحقل واحفظها. انقر بعد ذلك على "التالي" للانتقال إلى النشاط التالي والحصول على البيانات التي تم حفظها من قبل على أنها عامة أو خاصة.