آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه و نهم: نوشتن در فایل در دایرکتوری معین )

استاندارد

در بخش قبلی در مورد نحوه خواندن از یک فایل Text در دایرکتوری مشخص صحبت کردیم.

دیدیم که می توان با استفاده از کلاس Environment به فایل تکست دسترسی داشت، سپس با استفاده از کلاس File ، آن فایل را به برنامه معرفی کردیم و در آخر محتویات فایل تکست را به رشته String تبدیل نمودیم.

در این بخش می خواهیم برعکس این کار را انجام دهیم.

یعنی عمل نوشتن در فایل Text با استفاده از یک رشته را انجام بدهیم.

در بخش قبلی از کلاس FileInputStream برای وارد نمودن اطلاعات از فایل به اپلیکیشن استفاده کردیم.

از آنجایی که این کلاس جریان بایت های یک فایل را می پذیرد، می تواند با انواع مختلف فایل کار کند.

در این بخش می خواهیم از کلاس FileOutputStream برای وارد نمودن اطلاعات از پروژه (اپلیکیشن) به فایل خروجی استفاده نماییم. ( نوشتن در فایل یا عمل Write )

در این بخش نیز از کلاس FileOuputStream که رفتاری مشابه دارد و اطلاعات را به جریانی از بایت ها برای ارسال به فایل، تبدیل می کند، استفاده می شود.

 از این کلاس می توان برای فایل های مختلف استفاده نمود.

اگر فرض کنیم فایل را به صورت زیر، از دایرکتوری مشخص مثلا (/android/) با نام “1” که پسوند txt. دارد ، به کد جاوای برنامه معرفی کرده باشیم…

String fileName = "1.txt";
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String pathDir = baseDir + "/Android/";

File myfile = new File(pathDir + File.separator + fileName);

برای نوشتن بر روی فایل از این کد استفاده خواهیم نمود.

FileOutputStream stream = new FileOutputStream(myfile); // نام فایل است myfile
        try {
            stream.write("Gsm Developers".getBytes()); //به جریانی از بایت ها تبدیل شده و بر روی فایل نوشته می شود "Gsm Developers" در قسمت اول، رشته ی
        } finally {
            stream.close();
        }

شرح کد:

 

فرض می کنیم فایلی به صورتی که در تصویر مشاهده می کنید وجود دارد.

مشخصات این فایل بدین صورت است:

Name: 1.txt

Directory: /Android/

نام و دایرکتوری فایل را به صورت زیر در کدجاوای پروژه مشخص می کنیم:

String fileName = "1.txt";
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String pathDir = baseDir + "/Android/";

در مرحله ی بعدی یک شی به نام myfile از کلاس File می سازیم و با استفاده از مسیر دایرکتوری که به برنامه گفتیم و نام فایلی که می خواهیم آن را تعریف می کنیم.

File myfile = new File(pathDir + File.separator + fileName);

در قسمت اول، pathDir یعنی مسیر دایرکتوری و در قسمت سوم، fileName یعنی همان نام فایل از ورودی های سازنده برای این شی می باشند.

برای نوشتن بر روی فایل بدین ترتیب عمل می کنیم.

ابتدا یک شی به نام stream از کلاس FileOutputStream ، می سازیم و فایل را به عنوان ورودی سازنده ی آن شی ، قرار می دهیم.

FileOutputStream stream = new FileOutputStream(myfile);

در قسمت بعد، از آنجایی که می خواهیم یک متن را به فایل تکست، اضافه نماییم، کد زیر را می نویسیم.

stream.write("Gsm Developers".getBytes());

این کد، رشته ی “Gsm Developers” را به جریانی از بایت ها تبدیل نموده و در فایل write می کند.

نکته:

در بعضی کامپایلرها مثلا Android Studio ، به دلیل آن که فایل ممکن است در حافظه موجود نباشد یا به هر دلیلی قابل نوشتن نباشد، کدی که مربوط به کلاس FileOutputStream است را در ساختار try-catch می نویسیم.

FileOutputStream stream = null;
        try {
            stream = new FileOutputStream(myfile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            stream.write("Gsm Developers".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

برای دادن دسترسی ها و مجوزهای لازم، باید به قسمت AndroidManifest.xml رفته و کد زیر را برای نوشتن در حافظه ی خارجی بنویسیم.

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

پروژه را Run می کنیم.

اگر به فایل رجوع کنید ، می بینید که محتوای آن به رشته ای که شما در کد نوشتید، تبدیل شده است.

کد کامل MainActivity.java

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

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

        String fileName = "1.txt";
        String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
        String pathDir = baseDir + "/Android/";

        File myfile = new File(pathDir + File.separator + fileName);

        FileOutputStream stream = null;
        try {
            stream = new FileOutputStream(myfile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            stream.write("Gsm Developers".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه و هشتم: خواندن از انواع فایل در دایرکتوری معین )

استاندارد

در بخش قبلی در مورد خواندن از فایل صحبت شد. دیدیم که با استفاده از دایرکتوری معین و نام فایل text ، می توانستیم محتویات و نوشته های آن را مشاهده نماییم.

در واقع محتویات فایل، به یک متغیر رشته ای String ، تبدیل می شد و با استفاده از پیغام Toast به کاربر نمایش داده می شود.

در این قسمت هم می خواهیم ، عمل خواندن از فایل را انجام دهیم ولی اینبار می خواهیم که این کار را با استفاده از کلاس FileInputStream انجام دهیم.

با استفاده از کلاس FileInputStream می توانیم عملیات بیشتری را بر روی فایل انجام دهیم.

و حتی در برخورد با انواع فایل های مختلف، راحتتر عمل نماییم. زیرا این کلاس، فایل را به صورت بایت در می آورد.

برای این کار باید کد زیر را در قسمت MainActivity.java مورد استفاده قرار دهید.

int length = (int) file.length(); // به دست آوردن طول فایل

byte[] bytes = new byte[length]; //  تعریف متغیر آرایه ای از نوع بایت

FileInputStream in = new FileInputStream(myfile); // نام فایل است myfile
try {
    in.read(bytes); //  bytes خواندن جریان بایت های فایل و نوشتن آن بر روی متغیر
} finally {
    in.close();
}

String contents = new String(bytes); //   به متغیر رشته ای جهت نمایش byte  تبدیل متغیر

البته فرض بر آنست که فایل به صورتی که در بخش های قبلی توضیح داده شده، تعریف شده است.

مثلا به صورت زیر:

String fileName = "1.txt";
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String pathDir = baseDir + "/Android/";

File myfile = new File(pathDir + File.separator + fileName);

شرح کد:

فرض می کنیم فایلی به صورتی که در تصویر مشاهده می کنید وجود دارد.

و محتویات آن به این شکل است:

پس مشخصات این فایل بدین صورت است:

      Name: 1.txt

/Directory: /Android

Content: Gsm Developers

دقیقا مثل بخش قبلی ، نام و دایرکتوری فایل را به صورت زیر در کدجاوای پروژه مشخص می کنیم:

String fileName = "1.txt";
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String pathDir = baseDir + "/Android/";

در مرحله ی بعدی یک شی به نام myfile از کلاس File می سازیم و با استفاده از مسیر دایرکتوری که به برنامه گفتیم و نام فایلی که می خواهیم آن را تعریف می کنیم.

File myfile = new File(pathDir + File.separator + fileName);

در قسمت اول، pathDir یعنی مسیر دایرکتوری و در قسمت سوم، fileName یعنی همان نام فایل از ورودی های سازنده برای این شی می باشند.

این موارد، در بخش قبلی نیز توضیح داده شد. ولی در این قسمت می خواهیم از کلاس FileInputStream که در واقع جریان ورودی فایل را می خواند استفاده نماییم.

بدین منظور در ابتدا طول فایل را به دست می آوریم:

int length = (int) myfile.length();

سپس یک متغیر آرایه ای به نام bytes از نوع byte معرفی می کنیم و تعداد خانه های آن را برابر با طول فایل در نظر می گیریم.

byte[] bytes = new byte[length];

در مرحله ی بعدی با استفاده از کلاس FileInputStream ، جریان ورودی فایل را به بایت تبدیل کرده و در متغیر آرایه ای bytes می ریزیم.

FileInputStream in = new FileInputStream(myfile);
try {
    in.read(bytes);
} finally {
    in.close();
}

وقتی فایل شما به صورت bytes در بیاید می توانید از آن در قسمت های مختلف کد خود، استفاده نمایید. ولی به دلیل سادگی و پیوسته بودن مطالب در اینجا ما مانند بخش قبل، آن را تبدیل به رشته string می کنیم.

پس در قسمت بعدی، متغیر آرایه ای bytes را به رشته String تبدیل می کنیم تا بتوانیم با استفاده از پیغام Toast آن را به کاربر نمایش دهیم.

String contents = new String(bytes);

در آخر با استفاده از پیغام Toast ، محتویات این رشته به کاربر نمایش داده می شود.

Toast.makeText(getApplicationContext(),contents, Toast.LENGTH_SHORT).show();

نکته:

در بعضی کامپایلرها مثلا Android Studio ، به دلیل آن که فایل ممکن است در حافظه موجود نباشد یا به هر دلیلی قابل خواندن نباشد، دو کد قبلی را در ساختار try-catch می نویسیم.

FileInputStream in = null;
        try {
            in = new FileInputStream(myfile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            in.read(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

برای دادن دسترسی ها باید به قسمت AndroidManifest.xml رفته و کد زیر را برای خواندن از حافظه ی خارجی بنویسیم.

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

پروژه را Run می کنیم.

کد کامل MainActivity.java

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String fileName = "1.txt";
        String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
        String pathDir = baseDir + "/Android/";

        File myfile = new File(pathDir + File.separator + fileName);

        int length = (int) myfile.length();
        byte[] bytes = new byte[length];

        FileInputStream in = null;
        try {
            in = new FileInputStream(myfile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            in.read(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        String contents = new String(bytes);
        Toast.makeText(getApplicationContext(),contents, Toast.LENGTH_SHORT).show();

    }
}

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه و هفتم: خواندن از فایل Text در دایرکتوری معین )

استاندارد

در بخش قبلی در مورد چک کردن این که آیا فایلی با اسم و دایرکتوری داده شده، وجود دارد، صحبت کردیم.

دیدیم که با استفاده از یک مسیر دایرکتوری و نام یک فایل در حافظه ی خارجی می توان ، امکان وجود یا عدم وجود فایل را بررسی نمود.

خواندن از فایل های مختلف بستگی به نوع فرمت آن ها و نحوه استفاده از آن ها در پروژه ممکن است با هم تفاوت داشته باشند.

در این بخش می خواهیم با استفاده از یک فایل Text ، آموزش نحوه خواندن از همان فایل آموزش قبلی و همان مسیر را به شما آموزش دهیم.

من یک پروژه در اندروید استودیو، به نام Read-File-Gsm ایجاد می کنم.

به سراغ قسمت جاوای برنامه رفته و کدهای زیر را برای خواندن از فایل text ، در قسمت MainActivity.java و در متد ()onCreate می نویسم.

String fileName = "1.txt";
        String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
        String pathDir = baseDir + "/Android/";

        File myfile = new File(pathDir + File.separator + fileName);

        try {
            String contents = new Scanner(myfile).useDelimiter("\\A").next();
            Toast.makeText(getApplicationContext(),contents, Toast.LENGTH_SHORT).show();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

شرح کد:

 

فرض می کنیم فایلی به صورتی که در تصویر مشاهده می کنید وجود دارد.

و محتویات آن به این شکل است:

پس مشخصات این فایل بدین صورت است:

      Name: 1.txt

/Directory: /Android

Content: Gsm Developers

پس مثل بخش قبلی ، نام و دایرکتوری فایل را به صورت زیر در کدجاوای پروژه مشخص می کنیم:

String fileName = "1.txt";
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String pathDir = baseDir + "/Android/";

در مرحله ی بعدی یک شی به نام myfile از کلاس File می سازیم و با استفاده از مسیر دایرکتوری که به برنامه گفتیم و نام فایلی که می خواهیم آن را تعریف می کنیم.

File myfile = new File(pathDir + File.separator + fileName);

در قسمت اول، pathDir یعنی مسیر دایرکتوری و در قسمت سوم، fileName یعنی همان نام فایل از ورودی های سازنده برای این شی می باشند.

تا این قسمت، همه چیز مثل بخش قبلی بود. ولی برای خواندن از آن فایل Text می خواهیم کدهای آن را بنویسیم.

کد زیر محتویات داخل فایل تکست را می خواند و آن را تبدیل به رشته String می کند.

String contents = new Scanner(myfile).useDelimiter("\\A").next();

در قسمت بعدی که اختیاری است، با استفاده از پیغام Toast محتویات رشته که در واقع محتویات فایل Text است را به کاربر نمایش می دهیم.

Toast.makeText(getApplicationContext(),contents, Toast.LENGTH_SHORT).show();

به دلیل آن که فایل ممکن است در حافظه موجود نباشد یا به هر دلیلی قابل خواندن نباشد، دو کد قبلی را در ساختار try-catch می نویسیم.

try {
       String contents = new Scanner(myfile).useDelimiter("\\A").next();
       Toast.makeText(getApplicationContext(),contents, Toast.LENGTH_SHORT).show();
        }
catch (FileNotFoundException e) {
       e.printStackTrace();
        }

عدم رعایت این موضوع ، ممکن است منجر به خطای کامپایلر شود.

پروژه را Run می کنیم.

کد کامل MainActivity.java

package com.gsm_developers.read_file_gsm;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class MainActivity extends AppCompatActivity {

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

        String fileName = "1.txt";
        String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
        String pathDir = baseDir + "/Android/";

        File myfile = new File(pathDir + File.separator + fileName);

        try {
            String contents = new Scanner(myfile).useDelimiter("\\A").next();
            Toast.makeText(getApplicationContext(),contents, Toast.LENGTH_SHORT).show();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه و ششم: بررسی امکان وجود فایل در دایرکتوری معین )

استاندارد

در بخش قبلی این موضوع را بررسی کردیم که چگونه می توان، امکان دسترسی خواندن و نوشتن (R/W) در حافظه ی خارجی را با استفاده از کدهای برنامه نویسی، بررسی نمود.

در این بخش می خواهیم با استفاده از آدرس فایل (دایرکتوری) ، به فایل دسترسی پیدا کرده و امکان وجود یا عدم وجود فایل در دایرکتوری مشخص را بررسی نماییم.

من یک پروژه به نام Files-Gsm در اندروید استودیو ایجاد می کنم.

به سراغ کد جاوای برنامه (MainActivity.java) رفته و کد زیر را در متد ()onCreate می نویسم.

این کد برای بررسی وجود یک فایل با مشخصات زیر به کار می رود.

FileName= 1.txt

Directory = /Android/

سپس با استفاده از پیغام Toast امکان وچود فایل در دایرکتوری مشخص شده، بررسی می شود.

String fileName = "1.txt"; // نام فایل
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); // مسیر پایه حافظه خارجی
String pathDir = baseDir + "/Android/"; // مسیر دایرکتوری

File f = new File(pathDir + File.separator + fileName); // تعریف فایل با استفاده از دو پارامتر نام فایل و مسیر آن
if(f.exists()){
    Toast.makeText(getApplicationContext(),"File Vojud Darad", Toast.LENGTH_SHORT).show(); // پیغامی جهت نشان دادن وجود فایل
        }
else{
    Toast.makeText(getApplicationContext(),"File Vojud Nadarad", Toast.LENGTH_SHORT).show(); //پیغامی جهت عدم وجود فایل 
        }

شرح کد:

فرض می کنیم فایلی به صورتی که در تصویر مشاهده می کنید وجود دارد.

یعنی نام آن:

1.txt

و مسیر آن فایل نیز در مسیر اصلی و پوشه ی Android می باشد.

برای این فایل باید دایرکتوری مسیر زیر را در قسمت کدنویسی جاوا تعریف نماییم:

/Android/

مثلا اگر فایل در پوشه ای به نام Pictures در پوشه ی Telegram باشد (Telegram->Pictures)، مسیر آن به صورت زیر می شود:

/Telegram/Pictures/

پس در مرحله ی اول، نام این فایل را تعریف می کنیم.

String fileName = "1.txt";

سپس مسیر اصلی حافظه ی خارجی (یعنی همان قسمت اصلی که اگر پوشه ی Telegram در آن باشد مسیر به صورت /Telegram/ می شود) را با استفاده از کد زیر به دست می آوریم.

( این مسیر، همان مسیر اصلی می باشد که وقتی فایل منیجر را نصب می کنیم عموما ما را به همین سمت هدایت می کنند)

String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();

در مرحله ی بعدی مسیری که ما می توانیم با استفاده از فایل منیجر خودمان ببینیم را مشخص می کنیم ( مثلا پوشه ی Telegram)

در این جا ما پوشه ی /Android/ را که در حافظه ی خارجی است، تعریف می نماییم.

String pathDir = baseDir + "/Android/";

با کمی دقت متوجه می شوید که این مسیر باعث می شود که مسیری نسبی (/Android/) را نسبت به مسیر پایه (baseDir) که همان حافظه ی خارجی ما است، مشخص نماییم.

در مرحله ی بعدی یک شی به نام f از کلاس File می سازیم و با استفاده از مسیر دایرکتوری که به برنامه گفتیم و نام فایلی که می خواهیم آن را تعریف می کنیم.

File f = new File(pathDir + File.separator + fileName);

در قسمت اول، pathDir یعنی مسیر دایرکتوری و در قسمت سوم، fileName یعنی همان نام فایل از ورودی های سازنده برای این شی می باشند.

با استفاده از متد exists که متدی از کلاس File است، و همچنین کار این متد، برای بررسی وجود این فایل می باشد می توان، وجود یا عدم وجود این فایل را در آن دایرکتوری بررسی نمود.

if(f.exists()){
            Toast.makeText(getApplicationContext(),"File Vojud Darad", Toast.LENGTH_SHORT).show();
        }
else{
            Toast.makeText(getApplicationContext(),"File Vojud Nadarad", Toast.LENGTH_SHORT).show();
        }

با استفاده از پیغام Toast ، پیام های تعریف شده در بالا به کاربر نشان داده می شود.

پروژه را Run می کنم.

اگر فایل، طبق تصویر در همان مسیر وجود داشته باشد، مشاهده می کنید که با پیغام “File Vojud Darad” مواجه می شویم.

ولی اگر فایل وجود نداشته باشد، با پیغام “File Vojud Nadarad” مواجه می شویم.

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه و پنجم: بررسی امکان دسترسی خواندن و نوشتن در حافظه )

استاندارد

دسترسی خواندن و نوشتن در حافظه موضوع مورد بحث این بخش است.

در این بخش از آموزش برنامه نویسی اندروید، می خواهیم بررسی کنیم که آیا می توانیم فایلی را در حافظه ی خارجی توسط اپلیکیشن بنویسیم؟

به عبارتی آیا اپلیکیشن ما اجازه ی این کار را دارد؟

این بخش، پیش نیاز کار با فایل ها در برنامه نویسی اندروید است.

پس بررسی موضوع دسترسی خواندن و نوشتن در حافظه ی خارجی ، می تواند به ما در کار با فایل ها کمک نماید.

قبل از هر چیز دقت نمایید که حافظه ی گوشی و یا تبلت اندرویدی به دو قسمت حافظه ی داخلی و حافظه ی خارجی تقسیم می شود.

که نام انگلیسی آن ها به ترتیب Internal Memory و External Memory می باشد.

کاربر به Internal Memory دسترسی ندارد. بلکه به External Memory دسترسی دارد.

هدف ما در این بخش نیز بررسی دسترسی اپلیکیشن به این حافظه می باشد.

دقت کنید که External Memory را با Sd Card که یعنی کارت حافظه ی Sd ، با قابلیت جداشدن است، اشتباه نگیرید.

برنامه نویسی جاوای این پروژه

به قسمت کد جاوای برنامه یعنی MainActivity.java می رویم.

در ابتدا در متد ()onCreate دو متیر از نوع Boolean معرفی می کنیم.

boolean memoryExternalStorageAvailable = false;
boolean memoryExternalStorageWrite = false;

متغیر اولی، یعنی memoryExternalStorageAvailable بررسی می کند که آیا می توان به حافظه دسترسی پیدا کرد؟ به عبارتی آیا حافظه ی خارجی برای اپلیکیشن حاضر (Available) است؟ (Read)

متغیر دومی، یعنی memoryExternalStorageWrite بررسی می کند که آیا امکان نوشتن در حافظه وجود دارد؟ (Write)

کاری که می خواهیم انجام دهیم اینست که با بررسی با استفاده از کدهایی در قسمت بعدی، در صورت مثبت بودن جواب این سوالات، مقدار True و در صورت منفی بودن جواب این سوالات، مقدار false را به متغیر مربوطه بدهیم.

با استفاده از کلاس Environment می توان به حافظه ی خارجی دسترسی داشت.

پس یک متغیر رشته ای از یکی از متدهای این کلاس می سازم. و نامش را state به معنی وضعیت می گذارم.

String state = Environment.getExternalStorageState();

مشاهده می کنید که این متغیر یک نوع رشته از متد getExternalStorageState می باشد. که در واقع متد getExternalStorageState وضعیت حافظه ی خارجی را به ما اطلاع می دهد.

در قسمت بعدی با استفاده از یک ساختار کنترلی if-else به بررسی این موضوع می پردازم که آیا حافظه ی خارجی بر روی دستگاه، سوار (mount) شده است یا خیر؟

if (Environment.MEDIA_MOUNTED.equals(state)) {
            memoryExternalStorageAvailable = memoryExternalStorageWrite = true;
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            memoryExternalStorageAvailable = true;
            memoryExternalStorageWrite = false;
        } else {
            memoryExternalStorageAvailable = memoryExternalStorageWrite = false;
        }

در همین ساختار کنترلی است که مقدارهای دو متغیر Boolean ی که در ابتدا تعریف نمودیم، مشخص می شود.

در if دوم، با استفاده از MEDIA_MOUNTED_READ_ONLY به معنی آنست که اگر ، حافظه ی خارجی به صورت Read Only است، فقط متغیر memoryExternalStorageAvailable مقدار True را داشته باشد. که به معنی فقط خواندنی است.

برای این که این موضوع را به اطلاع کاربر برسانیم بهتر است از یک پیغام Toast استفاده کنیم.

پس دو رشته به نام های Readable و Writeable می سازم.

مقدار اولیه ی این دو رشته به ترتیب برابر Not Readable و Not Writable است. ولی اگر از دستور if با موفقیت عبور نمایند، مقدار Can Read Data From External Memory و Can Write Data into External Memory به آن ها داده می شود که این پیغام در آخر با استفاده از یک Toast به کاربر نمایش داده می شود.

String Readable = "Not Readable";
if(memoryExternalStorageAvailable)
    Readable="Can Read Data From External Memory";
String Writeable = "\nNot Writeable";
if(memoryExternalStorageWrite)
     Writeable="\nCan Write Data into External Memory";
Toast.makeText(getApplicationContext(), Readable+Writeable, Toast.LENGTH_SHORT).show();

کد کامل MainActivity.java

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

        boolean memoryExternalStorageAvailable = false;
        boolean memoryExternalStorageWrite = false;
        String state = Environment.getExternalStorageState();

        if (Environment.MEDIA_MOUNTED.equals(state)) {
            memoryExternalStorageAvailable = memoryExternalStorageWrite = true;
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            memoryExternalStorageAvailable = true;
            memoryExternalStorageWrite = false;
        } else {
            memoryExternalStorageAvailable = memoryExternalStorageWrite = false;
        }
        String Readable = "Not Readable";
        if(memoryExternalStorageAvailable)
            Readable="Can Read Data From External Memory";
        String Writeable = "\nNot Writeable";
        if(memoryExternalStorageWrite)
            Writeable="\nCan Write Data into External Memory";
        Toast.makeText(getApplicationContext(), Readable+Writeable, Toast.LENGTH_SHORT).show();

    }
}

در برخی منابع، ذکر شده که برای دادن دسترسی ها به اپلیکیشن در صورت نیاز باید کدهای زیر برای دسترسی به حافظه ی خارجی در AndroidManifest.xml نوشته شوند.

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

پروژه را Run می کنیم.

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه و چهارم: انتقال اپلیکیشن به حافظه SD )

استاندارد

بیشتر دستگاه های اندرویدی با حافظه داخلی 16 یا 32 گیگابایت عرضه می شوند. که پس از آن که سیستم عامل و اپلیکیشن هامقداری از آن را به خود اختصاص دهند، مقدار باقی مانده کمتر خواهد بود.

اگر چه این مقدار نیز می تواند در ابتدا کافی باشد ولی به مرور زمان ممکن است حافظه داخلی بعد از مدتی دچار کمبود حافظه شود.

امروزه بیشتر گوشی ها و تبلت های اندرویدی ، امکان اضافه کردن Sd Card را دارند. که می توان با استفاده از آن بعضی از اپلیکیشن ها را به کارت حافظه انتقال داد.

در این قسمت از برنامه نویسی اندروید، می خواهیم به شما آموزش دهیم که چگونه با استفاده از کدنویسی ، این امکان را برای اپلیکیشن خود به وجود آورید.

به عبارتی اگر پروژه هایی که تا به حال نوشته اید، قابلیت Move to Sd card آن ها، غیرفعال بوده است، به دلیل آن است که این امکان را برای پروژه ی خود به وجود نیاورده بودید.

می توان با دسترسی دادن به این پروژه، طبق چیزی که در زیر گفته شده است، این کار را انجام داد.

ولی ما این آموزش را به صورت پروژه محور انجام داده و با استفاده از Intent ، می خواهیم به سراغ تنظیمات این اپلیکیشن رفته تا این بخش را به صورت مستقیم مشاهده کنیم.

همچنین برای کسانی که می خواهند از درون یک اپلیکیشن به صورت مستقیم، به قسمت تنظیمات آن بروند، آموزش خوبی است.

تعیین دسترسی ها

برای آن که بتوانیم به Sd Card منتقل نماییم و در واقع انتقال این اپلیکیشن به حافظه Sd ، باید دسترسی های آن را پیکربندی نماییم.

به سراغ manifests->AndoirdManifest.xml می رویم. سپس کد زیر را در تگ manifest> اضافه می کنیم.

android:installLocation="auto"

دقت نمایید که همین کار برای فعال شدن Move to Sd Card کافی ست.

طراحی Layout اپلیکیشن

ما در اینجا سعی می کنیم این آموزش را به صورتی پروژه محور انجام داده تا با ارائه مثالی عملی این کار را انجام دهیم.

من یک پروژه در اندروید استودیو ایجاد می کنم و نامش را Sd-Card-Gsm می گذارم.

به سراغ Layout اپلیکیشن (activity_main.xml) می رویم و یک دکمه Button ایجاد می کنیم.

<Button
        android:text="Move to Sd Card"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/button"
        android:onClick="AppManager"/>

دقت نمایید که به دکمه Button بالا یک خاصیت onClick اضافه نمودیم که مقدار آن AppManager می گذاریم تا متد آن را بعدا در قسمت جاوای برنامه بنویسیم.

android:onClick="AppManager"/>

کاری که این دکمه Button انجام می دهد اینست که با کلیک بر روی آن، برنامه به اکتیویتی تنظیمات این اپلیکیشن رفته تا عملیات Move to Sd Card را برای آن انجام دهیم.

MainActivity.java

به سراغ برنامه نویسی این پروژه (MainActivity.java) می رویم تا کدهای جاوای آن را بنویسیم.

در این قسمت ، در کلاسMainActivity ، یک متد به نام AppManager ایجاد می کنیم.

کاری که این متد برای ما انجام می دهد اینست که با استفاده از این Intent ، وقتی به روی دکمه Button کلیک نماییم، به قسمت تنظیمات (Settings) این اپلیکیشن می رویم.

این متد به شکل زیر است:

public void AppManager(View view) {
        String packageName = "com.gsm_developers.sd_card_gsm";

        try {
            Intent intent = new  Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.setData(Uri.parse("package:" + packageName));
            startActivity(intent);
        }
        catch (ActivityNotFoundException e) {
            Intent intent = new  Intent(android.provider.Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS);
            startActivity(intent);
        }
    }

 

کدهای بالا را شرح می دهیم:

در قسمت try این متد، یک Intent به نام intent می سازیم که به application details این برنامه دسترسی داشته و وارد آن شویم.

Intent intent = new  Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);

ولی در ابتدای این متد، یک متغیر به نام packageName از نوع رشته می سازیم که مقدار آن را برابر نام پکیج این پروژه قرار می دهیم.

String packageName = "com.gsm_developers.sd_card_gsm";

باید نام پکیج این اپلیکیشن وقتی به Sd Card منتقل شود، را به این Intent تخصیص دهیم.

intent.setData(Uri.parse("package:" + packageName));

در قسمت بعدی باید این Intent را با استفاده از کد startActivity شروع (Start) نماییم.

startActivity(intent);

کد کامل MainActivity

package com.gsm_developers.sd_card_gsm;

import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

    public void AppManager(View view) {
        String packageName = "com.gsm_developers.sd_card_gsm";

        try {
            Intent intent = new  Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.setData(Uri.parse("package:" + packageName));
            startActivity(intent);
        }
        catch (ActivityNotFoundException e) {
            Intent intent = new  Intent(android.provider.Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS);
            startActivity(intent);
        }
    }
}

یادتان باشد که دسترسی این اپلیکیشن را نیز تغییر دهید.

یعنی به سراغ manifests->AndoirdManifest.xml رفته و سپس کد زیر را در تگ manifest> اضافه می کنیم.

android:installLocation="auto"

 کد کامل manifest این اپلیکیشن را در زیر مشاهده می کنید.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.gsm_developers.sd_card_gsm"
    android:installLocation="auto">

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

کار به اتمام رسیده است، پروژه را Run می کنیم.

با زدن دکمه ی Move To Sd Card به بخش Settings این اپلیکیشن می رویم.

مشاهده می کنید که این قسمت برای این اپلیکیشن فعال شده است.

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه و سوم: Context Menu )

استاندارد

در این بخش از برنامه نویسی اندروید، می خواهیم با ContextMenu ها آشنا شده و نحوه کار کردن با آن ها را آموزش دهیم.

ContextMenu در سیستم عامل ویندوز و … هم وجود دارد. بدین صورت که وقتی بر روی فایلی کلیک می کنید، می توانید با کلیک راست بر روی آن کارهایی که می توانید بر روی فایل انجام دهید را ببینید.

ولی در اندروید این کار با استفاده از نگه داشتن طولانی مدت (Hold) بر روی فایل انجام می شود.

در بخش سی ام، با لیست ویو ها و نحوه کار با آن ها آشنا شدیم.

در این بخش، با استفاده از Context Menu می خواهیم ، عملیاتی را بر روی لیست ویو (ListView) ها انجام دهیم.

مثلا این که بتوانیم نام مخاطبینی را در لیست ویو قرار بدهیم، و عملیاتی نظیر تماس و ارسال پیام را برای این لیست ویو انجام دهیم.

پس کاری که در این بخش نیز انجام می دهیم اینست که با نگه داشتن طولانی بر روی نام یکی از افرادی که در لیست ویو تعریف می کنیم، بتوانیم عملیات تماس و ارسال پیام را برای وی مشاهده نماییم.

من یک پروژه در اندروید استودیو ایجاد می کنم و نامش را ContextMenu-Gsm می گذارم.

ابتدا به سراغ Layout برنامه می رویم و یک لیست ویو را به لایه اپلیکیشن، اضافه می کنیم.

کد لیست ویو من :

<ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listview"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="23dp" />

 

خط “android:id=”@+id/listview را به صورت دستی اضافه نمودم.

در قسمت بعدی باید در MainActivity.java ، کدهای جاوای لازم را برای لیست ویو بنویسیم.

همچنین Context Menu نیز در این بخش توضیح داده می شود.

در متد ()onCreate لیست ویو را تعریف کرده و با استفاده از آداپتر ، مقدارهایی که با استفاده از آرایه رشته ای به آن دادیم، را به لیست ویو اضافه می کنیم.

ListView listView;
String myContacts[]={"Iliya","kurosh","Arya","Mehrdad","Behnam"};
listView=(ListView)findViewById(R.id.listview);
ArrayAdapter<String> adapter=new  ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,myContacts);
listView.setAdapter(adapter);

تمام مراحل بالا در بخش سی ام توضیح داده شد. ولی یک کد در انتهای متد ()onCreate به این بخش اضافه شده است.

این کد عبارت است از :

registerForContextMenu(listView);

در این کد که listView ما به صورت آرگومان ورودی آن ، قرار گرفته است، ما لیست ویویی که نوشتیم را برای عملیات Context Menu که بعدا تعریف میکنیم آماده می کنیم.

در خارج از متد ()onCreate یک متد به نام onCreateContextMenu تعریف کرده و در آن کدهایی می نویسیم تا در هنگامی که Context Menu باز شود، مقادیری که می خواهیم به ما نشان داده شود.

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
    {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("انتخاب عملیات");
        menu.add(0, v.getId(), 0, "تماس");
        menu.add(0, v.getId(), 0, "پیامک");
    }

مثلا در کد بالا ، Context Menu ما، عنوانی به نام “انتخاب عملیات” دارد.

همچنین دو عملیات “تماس” و “پیامک” را نیز برای Context Menu در این بخش تعریف می کنیم.

در مرحله بعد متدی از نوع boolean به نام onContextItemSelected تعریف می کنیم تا وقتی بر روی عملیات مربوطه مثلا تماس کلیک کردیم، کارهایی که می خواهیم را برای ما انجام دهید.

public boolean onContextItemSelected(MenuItem item){
        if(item.getTitle()=="تماس"){
            Toast.makeText(getApplicationContext(),"You Can Define Calling Code Later",Toast.LENGTH_LONG).show();
        }
        else if(item.getTitle()=="پیامک"){
            Toast.makeText(getApplicationContext(),"You Can Define Sending Sms Code Later",Toast.LENGTH_LONG).show();
        }else{
            return false;
        }
        return true;
    }

همان طور که در کد بالا مشاهده می کنید، با استفاده از دستورات کنترلی If ، عملیاتی که می خواهیم را نوشته ایم.

مثلا اگر در کد بالا بر روی تماس کلیک شود، با استفاده از کد زیر عملیات مربوط به تماس ، انجام می شود که در اینجا با استفاده از Toast این موضوع به اطلاع کاربر می رسد.

if(item.getTitle()=="تماس")

کد MainActivity.java

package com.gsm_developers.contextmenu_gsm;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

        ListView listView;
        String myContacts[]={"Iliya","kurosh","Arya","Mehrdad","Behnam"};
        listView=(ListView)findViewById(R.id.listview);
        ArrayAdapter<String> adapter=new  ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,myContacts);
        listView.setAdapter(adapter);

        registerForContextMenu(listView);
    }

    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
    {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("انتخاب عملیات");
        menu.add(0, v.getId(), 0, "تماس");
        menu.add(0, v.getId(), 0, "پیامک");
    }
    public boolean onContextItemSelected(MenuItem item){
        if(item.getTitle()=="تماس"){
            Toast.makeText(getApplicationContext(),"You Can Define Calling Code Later",Toast.LENGTH_LONG).show();
        }
        else if(item.getTitle()=="پیامک"){
            Toast.makeText(getApplicationContext(),"You Can Define Sending Sms Code Later",Toast.LENGTH_LONG).show();
        }else{
            return false;
        }
        return true;
    }

}

پروژه را Run می کنیم.

مشاهده می کنید که لیست ویو ما همان مواردی که به  آن اضافه نمودیم را نشان می دهد.

با نگه داشتن طولانی بر روی یکی از این آیتم ها ، Context Menu به ما نشان داده می شود.

اگر بر روی تماس بزنیم، عملیات مربوط به تماس به ما نشان داده می شود:

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه و دوم: برنامه نویسی کلیپ بورد (ClipBoard) در اندروید )

استاندارد

در این بخش از برنامه نویسی اندروید، می خواهیم نحوه ساخت کلیپ بورد (ClipBoard) های ساده را به شما آموزش دهیم.

کلیپ بورد (clipboard) یک حافظه ی موقت است که تصاویر،متن و ..در این محیط به طور موقت ذخیره می شوند تا بعدا مورد استفاده قرار بگیرد و یا حذف شود.

این بخش را به صورت پروژه محور، انجام می دهیم.

من یک پروژه به نام Gsm-ClipBoard در اندروید استودیو ایجاد می کنم. به سراغ فایل Layout برنامه یعنی activity_main.xml می روم.

این فایل همان طور که می دانید در مسیر res->Layout می باشد.

کاری که می خواهیم انجام دهیم اینست که در یک EditText یا همان PlainText ، متنی را بنویسیم سپس با استفاده از ابزار دکمه button کپی کنیم. و در EditText دیگر، آن را با دکمه ی Button دیگر، Paste نماییم. پس به چهار ابزار نیاز داریم.

پس دو ابزار PlainText از جعبه ابزار (Palette) انتخاب کرده و به لایه اپلیکیشن می کشم.

سپس دو ابزار دکمه Button نیز به داخل این لایه می کشم. و اسم یکی از آن ها را Copy نام دیگری را Paste می گذارم.

من برای دو دکمه ی Button که ایجاد کردم خاصیت دیگری به اسم onClick اضافه می کنم.

این خاصیت شبیه Listener عمل می کند و باعث می شود که وقتی بر روی دکمه Button کلیک کردیم، دکمه تابعی که به آن در این قسمت معرفی می شود را اجرا نماید.

به عنوان مثال :

android:onClick="copy"

در قسمت جاوای برنامه باید متدی به نام copy وجود داشته باشد تا وقتی بر روی این دکمه کلیک شد، عملیات مربوط به آن اجرا شوند.

پس کد دکمه های ما به این صورت است:

<Button
        android:text="Copy"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:onClick="copy"
        android:id="@+id/button" />

    <Button
        android:text="Paste"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/editText2"
        android:layout_alignLeft="@+id/button"
        android:layout_alignStart="@+id/button"
        android:layout_marginTop="80dp"
        android:onClick="paste"
        android:id="@+id/button2" />

کد Layout اپلیکیشن

<?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.gsm_developers.clipboard_gsm.MainActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:text="Copy this text"
        android:ems="10"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="83dp"
        android:id="@+id/editText" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:text="Paste The text here"
        android:ems="10"
        android:layout_alignParentBottom="true"
        android:layout_alignRight="@+id/editText"
        android:layout_alignEnd="@+id/editText"
        android:layout_marginBottom="154dp"
        android:id="@+id/editText2" />

    <Button
        android:text="Copy"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:onClick="copy"
        android:id="@+id/button" />

    <Button
        android:text="Paste"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/editText2"
        android:layout_alignLeft="@+id/button"
        android:layout_alignStart="@+id/button"
        android:layout_marginTop="80dp"
        android:onClick="paste"
        android:id="@+id/button2" />
</RelativeLayout>

به سراغ فایل MainActivity.java می رویم تا کدهای جاوای برنامه را بنویسیم.

در کلاس MainActivity ، ابتدا یک شی به نام Clipboard از کلاس ClipboardManager ، می سازیم. تا عملیات مربوط به Copy & Paste را بتوانیم با آن مدیریت نماییم.

private ClipboardManager Clipboard;

سپس یک شی به نام Clipdata از کلاس ClipData می سازیم تا مقدار رشته ای که می خواهیم از EditText اول، کپی کنیم را در خود نگه دارد.

private ClipData Clipdata;

همچنین دو شی نیز از کلاس EditText می سازیم تا بتوانیم ابزارهای CopyText و PasteText را به کد جاوای برنامه معرفی کنیم.

private EditText CopyText,PasteText;

در متد ()onCreate این اشیایی که ساختیم را مقدار دهی می کنیم. تا در هنگام اجرای برنامه دارای مقدار باشند.

Clipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
CopyText = (EditText)findViewById(R.id.editText);
PasteText = (EditText)findViewById(R.id.editText2);

البته Clipdata که شی از کلاس ClipData بود را در توابعی که می خواهیم بنویسیم، مقدار دهی می کنیم.

در خارج از متد ()onCreate یک تابع برای عملیات کپی مینویسیم. اسم این تابع را copy می گذاریم.

public void copy(View view){
        String text = CopyText.getText().toString();
        Clipdata = ClipData.newPlainText("text", text);
        Clipboard.setPrimaryClip(Clipdata);
        Toast.makeText(getApplicationContext(), "Text Copied",
                Toast.LENGTH_SHORT).show();
    }

کد بالا ابتدا متغیری به نام text را از نوع رشته معرفی کرده و مقدار آن را برابر با متنی که در ابزار EditText اول وجود دارد می گذارد.

سپس در خط دوم، مقدار آن را به عنوان ورودی متد newPlainText برای ذخیره ی نوشته ، در آبجکت Clipdata می ریزیم.

دستور getPrimaryClip که یکی از اجزای آبجکت Clipboard است، کلیپ بورد را برای عملیات کپی و پیس فراخوانی می کند.

مقدار آرگومان ورودی این متد (getPrimaryClip) برای کپی کردن، آبجکت Clipdata که شی از کلاس ClipData می باشد، است که در بالا آن را مقدار دهی کردیم.

در خط آخر نیز، عملیات کپی کردن متن، به کاربر با استفاده از یک Toast اطلاع داده می شود.

در قسمت بعدی یک متد برای Paste کردن به نام paste می نویسیم.

public void paste(View view){
        ClipData neveshte = Clipboard.getPrimaryClip();
        ClipData.Item item = neveshte.getItemAt(0);
        String text = item.getText().toString();
        PasteText.setText(text);
        Toast.makeText(getApplicationContext(), "Text Pasted",
                Toast.LENGTH_SHORT).show();
    }

در کد بالا و اولین خط با استفاده از متد getPrimaryClip ، آبجکت Clipdata که مقدار آن را در کد بالا از ورودی EditText اول گرفته بودیم، فراخوانی کرده و در یک آبجکت جدید به نام neveshte که نوعی از کلاس ClipData می باشد می ریزیم.

در دو خط بعدی مقدار نوشته ای که درون این آبجکت است، گرفته شده و به رشته تبدیل می شود.

در خط چهارم، مقدار این رشته را به عنوان ورودی متن در ابزار EditText دوم ( که با آیدی PasteText آن را می شناسیم)، می ریزیم.

در خط آخر نیز با استفاده از پیغام Toast موفق بودن عملیات به کاربر نشان داده می شود.

کدهای MainActivity.java

package com.gsm_developers.clipboard_gsm;

import android.content.ClipData;
import android.content.ClipboardManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private ClipboardManager Clipboard;
    private ClipData Clipdata;
    private EditText CopyText,PasteText;

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

        Clipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
        CopyText = (EditText)findViewById(R.id.editText);
        PasteText = (EditText)findViewById(R.id.editText2);
    }

    public void copy(View view){
        String text = CopyText.getText().toString();
        Clipdata = ClipData.newPlainText("text", text);
        Clipboard.setPrimaryClip(Clipdata);
        Toast.makeText(getApplicationContext(), "Text Copied",
                Toast.LENGTH_SHORT).show();
    }

    public void paste(View view){
        ClipData neveshte = Clipboard.getPrimaryClip();
        ClipData.Item item = neveshte.getItemAt(0);
        String text = item.getText().toString();
        PasteText.setText(text);
        Toast.makeText(getApplicationContext(), "Text Pasted",
                Toast.LENGTH_SHORT).show();
    }
}

پروژه را Run می کنیم.

بر روی دکمه ی Copy کلیک می کنیم تا نوشته ی درون EditText ، کپی شود.

مشاهده می کنید که با استفاده از یک Toast این موضوع به اطلاع می رسد.

حال بر روی دکمه Paste کلیک می کنیم. مشاهده می کنید که نوشته ی بالا در ابزار EditText دوم، Paste شد.

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه و یکم: ارسال پیامک Sms با استفاده از خود اپلیکیشن )

استاندارد

در بخش قبلی در مورد نحوه ارسال sms در اپلیکیشن با استفاده از Intent صحبت کردیم.

پیام و شماره مخاطبی که می خواستیم پیام بفرستیم با استفاده از Intent به اکیتیویتی جدید و در واقع برنامه SMS که در سیستم عامل اندروید وجود دارد، محول می شد.

ولی سوالی که در اینجا پیش می آید اینست که چگونه می توان در خود اپلیکیشن و به صورت مستقیم اقدام به ارسال پیامک نمود؟

در این بخش با ما همراه باشید تا این شیوه را هم آموزش دهیم.

برای این کار دیگر نیازی به Intent ها نخواهیم داشت.

ولی این بخش حتی می تواند ساده تر از بخش قبلی باشد.

کاری که باید انجام بدهیم استفاده از کلاس SmsManager است.

کلاس SmsManager ، خود  عملیات ارسال پیامک را برای ما انجام می دهد و دیگر نیازی به Intent نمی باشد.

ولی باید دسترسی و مجوز ارسال پیامک به اپلیکیشن اندرویدیمان داده شود.

تمام مراحل طراحی Layout اپلیکیشن مثل جلسه قبل می باشد ولی ما بار دیگر برای جلوگیری از ابهام این مرحله را شرح می دهیم.

طراحی Layout اپلیکیشن

همانن بخش قبلی باید دو  EditText ایجاد نماییم.

یکی از آن ها که یک نوع PlainText است، کاربر پیام خود را وارد می کند.

و دومی مربوط به اینست که کاربر شماره ای که می خواهد به آن پیام ارسال کند را در EditText که یک ابزار Phone است، وارد نماید.

من یک پروژه در اندروید استودیو به نام Sms-Gsm ایجاد می کنم.

به قسمت لایه اپلیکیشن می روم و سپس از قسمت Text Fields ها در Palette ، یک ابزار Plain Text و یک ابزار Phone به Layout برنامه اضافه می کنم.

از قسمت Widget ها هم یک دکمه Button را برای ارسال اضافه میکنم.

کدهای Layout اپلیکیشن

<?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.gsm_developers.sms_gsm.MainActivity">

    <EditText
        android:layout_width="300dp"
        android:layout_height="200dp"
        android:inputType="textPersonName"
        android:text="write your text"
        android:ems="10"
        android:layout_marginTop="23dp"
        android:id="@+id/editText"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:ems="10"
        android:layout_below="@+id/editText"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="37dp"
        android:id="@+id/editText2" />

    <Button
        android:text="Send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText2"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="53dp"
        android:id="@+id/button" />
</RelativeLayout>

کدنویسی جاوای پروژه

به سراغ قسمت کدنویسی جاوای پروژه می رویم. (این قسمت نیز همانند بخش قبلی می باشد)

ابتدا باید سه ابزار PlainText که برای Message به کار می رود و Phone که یک EditText است و دکمه Button را به قسمت جاوای برنامه معرفی کنم.

پس دو شی EditText و یک شی Button خارج از متد ()onCreate به صورت سراسری ایجاد می کنم.

EditText Message;
EditText PhoneNumber;
Button SendButton;

حال در متد ()onCreate این سه شی را با استفاده از آیدی هایی که در لایه اپلیکیشن به سه ابزارمان دادیم، مقدار دهی میکنم.

Message =(EditText)findViewById(R.id.editText);
PhoneNumber =(EditText)findViewById(R.id.editText2);
SendButton =(Button)findViewById(R.id.button);

در مرحله ی بعدی یک رویداد Listener برای دکمه ایجاد می کنم تا وقتی بر روی دکمه Button کلیک شد، عملیاتی که می خواهیم را برای ما انجام دهد.

از این قسمت به بعد مراحل جدیدی را می خواهیم انچام بدهیم.

ابتدا باید پیام و شماره تماس مخاطب را از ابزارهایی که در قسمت لایه اپلیکیشن تعریف کرده بودیم، به رشته string تبدیل نماییم.

String Msg = Message.getText().toString();
String nmbr = PhoneNumber.getText().toString();

در قسمت بعدی، یک شی به نام MySms از کلاس SmsManager تعریف می کنیم.

SmsManager MySms = SmsManager.getDefault();

یکی از متدهای این کلاس یعنی sendTextMessage  برای ارسال پیامک به کار می رود.

پس با استفاده از شی MySms به این متد دسترسی پیدا می کنیم و پیام و شماره تماس که دو نوع رشته هستند را در قسمت آرگومان ورودی این متد، می نویسیم.

MySms.sendTextMessage(nmbr, null, Msg, null, null);

ورودی اول، مربوط به آدرس مقصد ( شماره مخاطب ) ، ورودی دوم مربوط به آدرس مبدا (شماره فرستنده ) ، ورودی سوم، مربوط به پیام متنی و دو ورودی بعدی مربوط به مورد های ارسال و تحویل می باشند.

کد دکمه Button :

SendButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                String Msg = Message.getText().toString();
                String nmbr = PhoneNumber.getText().toString();

                SmsManager MySms = SmsManager.getDefault();
                MySms.sendTextMessage(nmbr, null, Msg, null, null);
            }

        });

کد کامل MainActivity

package com.gsm_developers.sms_gsm;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    EditText Message;
    EditText PhoneNumber;
    Button SendButton;

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

        Message =(EditText)findViewById(R.id.editText);
        PhoneNumber =(EditText)findViewById(R.id.editText2);
        SendButton =(Button)findViewById(R.id.button);

        SendButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                String Msg = Message.getText().toString();
                String nmbr = PhoneNumber.getText().toString();

                SmsManager MySms = SmsManager.getDefault();
                MySms.sendTextMessage(nmbr, null, Msg, null, null);
            }

        });
    }
}

نوبت به قسمت مجوزهای اپلیکیشن می رسد. برای ارسال پیامک Sms ، این اپلیکیشن باید دسترسی ارسال آن را داشته باشد.

پس به قسمت دسترسی ها یعنی AndroidManifest.xml می رویم.

و دسترسی زیر را قبل از تگ application> تعریف می کنیم.

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

پروژه را Run می کنیم.

پیام و شماره مورد نظر خود را وارد می کنیم.

دکمه Send را می زنیم تا پیام ارسال شود.

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه: ارسال پیامک Sms با استفاده از پیام رسان پیش فرض اندروید )

استاندارد

در بخش قبلی به قابلیت PhoneCall در برنامه نویسی اندروید، پرداختیم.

با استفاده از PhoneCall می توانستیم با دادن یک شماره ، و زدن یک دکمه Button که بر روی آن “تماس” نوشته شود، به آن شماره زنگ بزنیم.

در این بخش ، قابلیت دیگر ارتباطی یعنی ارسال پیامک را در برنامه نویسی اندروید آموزش می دهیم.

این آموزش، بسیار شبیه به بخش قبلی می باشد.

این بار با استفاده از دو مورد شماره و پیام، پیام را به شماره ای که می خواهیم می فرستیم.

برای این پروژه ما از Intent که در بخش قبلی آن را آموزش دادیم ، استفاده می کنیم. زیرا Intent قادر است داده ای را به صورت پیام به activity دیگری بفرستد.

ما برای ارسال پیام نیز به اکتیویتی تماس احتیاج داریم. پس شماره و پیام را به این اکتیویتی با استفاده از اینتنت می فرستیم.

دو  EditText ایجاد می کنیم.

یکی از آن ها که یک نوع PlainText است، کاربر پیام خود را وارد می کند.

کاربر می تواند شماره ای که می خواهد به آن پیام ارسال کند را در EditText که یک ابزار Phone است، وارد نماید.

شماره و پیام  داخل این دو ابزار را به ACTION_VIEW می فرستیم. ACTION_VIEW وظیفه ی عملیات ارسال پیامک را دارد.

من یک پروژه در اندروید استودیو به نام Sms-Gsm ایجاد می کنم.

به قسمت لایه اپلیکیشن می روم و سپس از قسمت Text Fields ها در Palette ، یک ابزار Plain Text و یک ابزار Phone به Layout برنامه اضافه می کنم.

از قسمت Widget ها هم یک دکمه Button را برای ارسال اضافه میکنم.

کدهای Layout اپلیکیشن

<?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.gsm_developers.sms_gsm.MainActivity">

    <EditText
        android:layout_width="300dp"
        android:layout_height="200dp"
        android:inputType="textPersonName"
        android:text="write your text"
        android:ems="10"
        android:layout_marginTop="23dp"
        android:id="@+id/editText"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:ems="10"
        android:layout_below="@+id/editText"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="37dp"
        android:id="@+id/editText2" />

    <Button
        android:text="Send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText2"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="53dp"
        android:id="@+id/button" />
</RelativeLayout>

به سراغ قسمت کدنویسی جاوای پروژه می رویم.

ابتدا باید سه ابزار PlainText که برای Message به کار می رود و Phone که یک EditText است و دکمه Button را به قسمت جاوای برنامه معرفی کنم.

پس دو شی EditText و یک شی Button خارج از متد ()onCreate به صورت سراسری ایجاد می کنم.

EditText Message;
EditText PhoneNumber;
Button SendButton;

حال در متد ()onCreate این سه شی را با استفاده از آیدی هایی که در لایه اپلیکیشن به سه ابزارمان دادیم، مقدار دهی میکنم.

Message =(EditText)findViewById(R.id.editText);
PhoneNumber =(EditText)findViewById(R.id.editText2);
SendButton =(Button)findViewById(R.id.button);

در مرحله ی بعدی یک رویداد Listener برای دکمه ایجاد می کنم تا وقتی بر روی دکمه Button کلیک شد، عملیاتی که می خواهیم را برای ما انجام دهد.

SendButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                String Msg = Message.getText().toString();
                String nmbr = PhoneNumber.getText().toString();

                Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( "sms:" + nmbr));
                intent.putExtra( "sms_body", Msg );
                startActivity(intent);
            }

        });

در کد بالا ابتدا با استفاده از متد ()getText().toString ، پیام و شماره ای که در ابزار Plain Text و phone وجود دارد، به رشته تبدیل شده و به متغیرهای Msg و nmbr که یک نوع رشته هستند، داده می شود.

این کار لازم است زیرا ما می خواهیم پیام را در Intent به صورت رشته ارسال نماییم.

سپس یک شی به نام intent از نوع Intent می سازیم و Intent.ACTION_VIEW را به آن نسبت می دهیم.

در قسمت بعدی با استفاده از متد putExtra که در کلاس Intent وجود دارد، شی intent را مقداردهی می کنیم.

(در این قسمت پیامی که داده ایم ، به عنوان یکی از پارامترهای شی intent مورد استفاده قرار می گیرد)

در آخر با استفاده از متد startActivity این اکتیویتی را شروع می کنیم.

کد کامل MainActivity

package com.gsm_developers.sms_gsm;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    EditText Message;
    EditText PhoneNumber;
    Button SendButton;

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

        Message =(EditText)findViewById(R.id.editText);
        PhoneNumber =(EditText)findViewById(R.id.editText2);
        SendButton =(Button)findViewById(R.id.button);

        SendButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                String Msg = Message.getText().toString();
                String nmbr = PhoneNumber.getText().toString();

                Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( "sms:" + nmbr));
                intent.putExtra( "sms_body", Msg );
                startActivity(intent);
            }

        });
    }
}

پروژه را Run می کنیم.

پیام و شماره مورد نظر خود را وارد می کنیم.

Send را میزنیم و مشاهده می کنیم که صفحه ارسال پیامک sms فراخوانی می شود. (اکتیویتی ارسال پیامک)