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

استاندارد

در بخش قبلی در مورد نحوه خواندن از یک فایل 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();
            }
        }
    }
}

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

استاندارد

در این بخش از آموزش برنامه نویسی اندروید می خواهیم کار با اینتنت ها (Intent) و گذر بین اکتیویتی ها را آموزش بدهیم.

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

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

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

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

پس از معرفی توضیحاتی در رابطه با Intentها کار را شروع می کنیم.

من یک پروژه به نام Intent-Gsm در اندروید استودیو ایجاد می کنم. سپس به قسمت لایه اپلیکیشن برنامه می روم و یک دکمه 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.intent_gsm.MainActivity">

    <Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="181dp"
        android:id="@+id/button"
        android:elevation="0dp" />
</RelativeLayout>

پس از اضافه کردن دکمه ، باید یک Activity جدید به پروژه اضافه نماییم.

برای این کار از منوی فایل New را زده و به قسمت Activity می رویم. سپس Empty Activity را انتخاب می کنیم.

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

ما نام هایی که خود اندورید استودیو به صورت پیش فرض انتخاب کرده است را به همان صورت می گذاریم.

ولی این نام ها چیست؟

در قسمت اول (Activity Name) نام همان فایلی را می خواهد که در مسیر Java وجود دارد. یعنی همان قسمتی که برای برنامه نویسی جاوا به کار می رود.

در قسمت دوم (Layout Name) نام لایه اپلیکیشن ما را می خواهد.

زیرا یک اکتیویتی جدا باید همراه با کدجاوای جداگانه و رابط کاربری جداگانه برای آن کد باشد.

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

ولی در قسمت آخر، نام پکیج پروژه را بدهید.

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

همچنین لایه ای برای طراحی این اکتیویتی نیز در قسمت layout اضافه شده است.

به قسمت لایه طراحی (layout) اکتیویتی جدید (در اینجا فایل activity_main2.xml) می رویم.

یک TextView به این لایه اضافه می کنیم. من نام این TextView را Activity 2 قرار می دهم.

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_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.gsm_developers.intent_gsm.Main2Activity">

    <TextView
        android:text="Activity 2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="218dp"
        android:id="@+id/textView" />
</RelativeLayout>

در اکتیویتی اول، یک دکمه ی Button اضافه کردیم. حال باید به قسمت جاوای اکتیویتی اول برویم تا کدهایی را برای آن دکمه بنویسیم که با کلیک به اکتیویتی دوم از این پروژه منتقل شویم.

پس فایل MainActivity.java را باز می کنیم.

در متد ()onCreate دکمه ی Button را به قسمت جاوای برنامه معرفی می کنیم.

Button Btn = (Button) findViewById(R.id.button);

یک رویداد onClickListener به دکمه Button اضافه می کنیم.

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

Btn.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                startActivity(new Intent(MainActivity.this , Main2Activity.class));
            }
});

همان طور که مشاهده می کنید با استفاده از متدی به نام startActivity این کار صورت می پذیرد.

در این متد، یک Intent جدید با استفاده از دستور New Intent به عنوان ورودی برای startActivity می نویسیم.

این Intent دو آرگومان ورودی می پذیرد.

یکی اکتیویتی که در آن هستیم که در کد بالا به صورت MainActivity.this مشخص شده است.

دومین آرگومان ، اکتیویتی که می خواهیم به آن برویم، که این کار نیز به صورت کد Main2Activity.class نوشته شده است.

MainActivity.java

package com.gsm_developers.intent_gsm;

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

public class MainActivity extends AppCompatActivity {

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

        Button Btn = (Button) findViewById(R.id.button);
        Btn.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                startActivity(new Intent(MainActivity.this , Main2Activity.class));
            }
        });
    }
}

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

وقتی اپلیکیشن اجرا می شود، مشاهده می کنید که Layout مربوط به اکتیویتی اول به شما نشان داده می شود.

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

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش سی و ششم: کار با VideoView در اندروید)

استاندارد

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

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

من یک پروژه جدید ایجاد می کنم و اسم آن را VideoView-Gsm میذارم.

سپس به activity_main.xml رفته و از Paletteها و در قسمت Images & Media یک ابزار VideoView را بر روی لایه اپلیکیشن خودم می کشم.

در قسمت Properties از ابزار VideoView که به لایه اپلیکیشن کشیدیم، مقدار layout_width را fill_parent می گذاریم تا عرض صفحه را بپوشاند. مقدار layout_height را نیز، wrap_content میگذاریم تا VideoView ارتفاع خودش را با فایل ویدیویی ما هماهنگ کند.

کد VideoView

<VideoView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/videoView"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="60dp" />

به سراغ کدنویسی جاوای برنامه می رویم. فایل MainActivity.xml را باز کرده و طبق مراحل زیر پیش می رویم.

در این قسمت، فایل ویدیویی که می خواهیم پخش شود را در یکی پوشه های پروژه برنامه می ریزیم. برای این کار باید فایل ویدیویی را در پوشه Raw کپی کنیم. در قسمت پخش صوت، از آموزش های اندروید چگونگی آن توضیح داده شد ولی برای راحتی شما، در اینجا نیز همان توضیحات را می دهیم. (مراحل زیر) :

قبلا گفته شد که پوشه Res پوشه منابع ما است و عکس ها و فایل های ما برای استفاده در برنامه در این پوشه قرار می گیرد. پس باید یک پوشه جدید به نام Raw در پوشه Res ایجاد کنیم.

برای این کار طبق عکس، بر روی پوشه Res کلیک راست کرده و سپس از قسمت New، بر روی Android Resource Directory کلیک می کنیم.

android-studio-beginners-gsm-developers_86

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

android-studio-beginners-gsm-developers_87

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

android-studio-beginners-gsm-developers_88

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

ویدیویی که من کپی کردم، نامش Myvideo.mp4 است که مشاهده می کنید در پوشه Raw اضافه شده است.

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

اگر از اینجا به بعد با نام بالا پیش بروید، با خطا مواجه می شوید. ولی چرا؟

چون که من اولین بار فایل خودم را با حروف بزرگ مثل My که در بالا نوشته بودم، نوشتم. پس در برنامه نویسی اندروید فایل ها در منابع نباید با حروف بزرگ باشند.

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

اسم فایل را به myvideo.mp4 تغییر میدهم.

ابزار VideoView را که در بخش لایه اپلیکیشن، اضافه کرده بودیم در این قسمت معرفی می کنیم. و نام متغیر آن را Video می گذاریم.

VideoView Video = (VideoView) findViewById(R.id.videoView);

برای ابزار VideoView باید کلاس VideoView به برنامه، Import شود:

import android.widget.VideoView;

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

در این جا زیاد لازم نیست وارد این جزئیات شویم، این توضیحات فقط برای این بود که بگوییم ما در این پروژه، به یک رشته احتیاج داریم تا کار بافر را برای ما انجام دهد و ویدیوی ما در آن رشته ذخیره شود. و سپس از همان رشته، VideoView ویدیوی ما را پخش کند.

 متغیر Buffer را از نوع String معرفی می کنیم. برای این کار، کد زیر را می نویسیم:

String Buffer = "android.resource://com.gsm_developers.videoview_gsm/"+R.raw.myvideo;

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

“android.resource:// نام پکیج /”R.محل فایل ما در پروژه

در اینجا نام پکیج، com.gsm_developers.videoview_gsm می باشد. (نام پکیج را می توانید در اولین خط از فایل جاوا MainActivity.java مشاهده نمایید.)

محل فایل ما نیز در پوشه Raw و اسم آن myvideo است. که می شود: R.raw.myvideo

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

Uri uri = Uri.parse(Buffer);

حال باید Uri ما که در مرحله قبل آن را معرفی کردیم، توسط VideoURI ست شود.

Video.setVideoURI(uri);

کد زیر نیز، ویدیو شما را پخش می کند.

Video.start();

کد کامل MainActivity

package com.gsm_developers.videoview_gsm;

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.VideoView;

public class MainActivity extends AppCompatActivity {

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

        VideoView Video = (VideoView) findViewById(R.id.videoView);

        String Buffer = "android.resource://com.gsm_developers.videoview_gsm/"+R.raw.myvideo;

        Uri uri = Uri.parse(Buffer);
        Video.setVideoURI(uri);
        Video.start();
    }
}

اگر اپلیکیشینی را که نوشته ایم اجرا نمایید، خروجی زیر را مشاهده می کنید.