آموزش فلش گوشی های سامسونگی و نکات مهم فلش

استاندارد

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

پس با ما باشید …

پیش نیاز ها و معلومات

داریور چیست ؟

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

برای اتصال گوشی و یا تبلت اندرویدی به کامپیوتر از طریق کابل USB نیاز به نصب درایور مربوطه برای شناساندن دستگاه به رایانه دارید. ارتباط کامل با کامپیوتر بوسیله کابل یو اس بی به منظور روت کردن،بکاپ گیری و… حتی انتقال فایل میبایست “Drivers” دیوایس اندرویدی شما روی کامپیوتر نصب باشد. بهترین روش نصب درایور گوشی تبلت نصب برنامه مدیریت برند دستگاه شما روی کامپیوتر است در این حالت هم میتوانید از مزایای آن نرم افزار رسمی استفاده کنید و هم مطمئن باشید که درایور دستگاه شما به خوبی روی رایانه شما نصب شده است.

فلشر چیست و چی کارای دارد ؟
فلشر برنامه ای هست که با آن میتوانیم فایل رسمی یا کاستوم را بر روی گوشی رایت کنیم .
فرق میان نام رامهای اندروید چیست؟(رسمی،کاستوم،کوک،OMS)

هر برندی از خودش فلشر های دارد ماننده برند سامسونگ فلش این برند اودین ( Odin ) میباشد و میتوانیم از باکس های مربوطه نیز استفاده کنیم ماننده : z3x , Miracle , EFT , و…

فریمور (Firmware ) چیست ؟

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

دلایل منتشر کردن فریمور جدید:
رفع باگ ها و حفره های امنیتی فریمور نسخه قبل، افزایش امنیت و امکانات به فریمور جدید و…

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

 

نوت : نام های که جایگذین فریمور شده اند به زبان فارسی عبارت است اند : ( رام , فایل فلش و فریمور ) اما در زبان انگلیسی به این شیوه گفته میشود ( Rom , Firmware , File Flash )

نوع رام ها :

برنده سامسونگ 3 نوع رام رسمی تولید میکند که عبارت است از : 

تک فایل , چهار فایل و 5 فایل میباشید

رام های تک فایل :

رام های تک فایل یا Single file در دیوایس های سامسونگ برای بروز رسانی و مشکلات دیگری که در گوشی های سامسونگ به وجود می آیند از آن استفاده می شود.

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

نوت : در رام های جدید سامسونگ امکان حذف اطلاعات میباشید چونکه در بغضی از رام ها فایل های ماننده یوزردیتا هست که موجب به حذف اطلاعات کاربر میشود

 

رام های چهار فایل :

این رام همانطور که از نامش مشخص هست دارای 4 فایل می باشد . شامل فایل های ( BL , AP , CP , CSC )

رام های چهارفایل در مقایسه با رام های تک فایل بسیار کاربردی هستند و در اکثر موارد بسیاری از مشکلات بوجود آمده در گوشی را که با رام های تک فایل حل نشده برطرف می کند

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

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

 

رام های پنج فایل :

با توجه به کاربردی که در بالا در مورد رام های چهار فایل خدمتتان توضیح دادیم

شرکت سامسونگ در نسخه های اندروید 7.0 به بالا سعی کرده اکثر رام هایی که ارائه می دهد به صورت چندفایل باشد

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

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

رام های پنج فایل به این گونه هست که علاوه بر چهارفایلی که وجود دارد یک فایل به نام Home_CSC به انها اضافه شده است که این فایل جایگزین فایل CSC می شود

و بعد از رایت رام اطلاعات کاربر باقی می ماند

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

مشخصه در دستگاه های سامسونگ چیست ؟

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

آموزش پیدا کردن شمار ساخت در وقت روشن بودن گوشی :

برای بدست آورد شماره ساخت گوشی خود به آدرس زیر بروید:

تنظیمات > اصلی (سیستم) > درباره دستگاه >  شماره ساخت
Settings > General (System) > About Device> Build Number

برای بدست آورد مدل گوشی خود به آدرس زیر بروید:

تنظیمات > اصلی (سیستم) > درباره دستگاه >  شماره مدل
Settings > General (System) > About Device> Model Number

 

شماره ساخت گوشی های سامسونگ به صورت زیر است:

A300FUXXU1ANL1

رنگ سبز مدل عددی گوشی را نمایش میدهد : A300FU
رنگ سرخ باینری گوشی را نمایش میدهد که باینری بعد از XX نمایش داده میشود : U1
رنگ آبی تاریخ انتشار فایل را نمایش میدهد : ANL1

در گوشیهای سامسونگ مهم باینری گوشی میباشد برای فلش گوشی ها باید باینری یکسان یا بالاتر باشد تا فایل بدون ارور روی گوشی مورد نظر رایت شود

 

برای پیدا کردن مشخصه گوشی در وقتیکه گوشی مورد نظر خاموش میباشد یا رمز دارد از آموزش زیر استفاده کنید

برای این کار ابتدا گوشی را خاموش کنید. سپس کلید افزایش صدا (+Volume) + کلید Home + Power را همزمان بگیرید.

در مدلهای سری جدید 2018 و 2019 که فاقد دکمه ی هوم هستند.

کافیست گوشی را خاموش کنید. ولوم افزایش صدا (+Volume) + کلید Power را همزمان بگیرید.

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

 

 

شمار ساخت این گوشی عبارت است از : G950FXXU1AQDD که باینری این گوشی U1 میباشد پس باید فایل مطابق باینری این مدل پیدا کنید و روی گوشی رایت کنید

آموزش فلش رام های سامسونگ

1..گوشی را خاموش کنید

2. دکمه کم کردن صدا (ولوم پایین) به همراه دکمه پاور نگه دارید

3. پس از ویبره زدن گوشی پاور را رها کنید. به این صفحه هدایت خواهید شد!

4. برای ادامه مرحله ولوم بالا را بزنید تا گوشی به حالت دانلودینگ (…Downloading) هدایت شود.

5. گوشی را با استفاده از usb به کامپیوتر وصل کنید.

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

6. پس از نصب درایور های مورد نیاز و اتصال دستگاه به کامپیوتر نرم افزار Odin را اجرا کنید. در صورت اجرای صحیح مراحل باید نرم افزار odin به این صورت COM PORT گوشی شما را شناسایی کند.

7. دکمه AP موجود در نرم افزار ODIN را بزنید سپس فایلی که دانلود کرده اید را انتخاب کنید.

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

9. در این مرحله قطعا نباید دستگاه را از کامپیوتر جدا کنید منتظر بمانید تا عملیات رایت رام به اتمام برسد.

10. پس از اتمام عملیات رایت رام باید با پیغام !PASS مواجه شوید در غیر اینصورت عملیات رایت ناقص بوده و احتمال داره گوشی شماسافت بریک یا هارد بریک شود.

1..گوشی را خاموش کنید

2. دکمه کم کردن صدا (ولوم پایین) به همراه دکمه پاور نگه دارید

3. پس از ویبره زدن گوشی پاور را رها کنید. به این صفحه هدایت خواهید شد!

4. برای ادامه مرحله ولوم بالا را بزنید تا گوشی به حالت دانلودینگ (…Downloading) هدایت شود.

5. گوشی را با استفاده از usb به کامپیوتر وصل کنید.

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

6. پس از نصب درایور های مورد نیاز و اتصال دستگاه به کامپیوتر نرم افزار Odin را اجرا کنید. در صورت اجرای صحیح مراحل باید نرم افزار odin به این صورت COM PORT گوشی شما را شناسایی کند.

7. دکمه BL موجود در نرم افزار ODIN را بزنید سپس فایلی که اول اسم آن BL نوشته شده را انتخاب کنید.
دکمه AP موجود در نرم افزار ODIN را بزنید سپس فایلی که اول اسم آن AP نوشته شده را انتخاب کنید.
دکمه CP موجود در نرم افزار ODIN را بزنید سپس فایلی که اول اسم آن CP نوشته شده را انتخاب کنید.
دکمه CSC موجود در نرم افزار ODIN را بزنید سپس فایلی که اول اسم آن CSC نوشته شده را انتخاب کنید.


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


9. در این مرحله قطعا نباید دستگاه را از کامپیوتر جدا کنید منتظر بمانید تا عملیات رایت رام به اتمام برسد.

10. پس از اتمام عملیات رایت رام باید با پیغام !PASS مواجه شوید در غیر اینصورت عملیات رایت ناقص بوده و احتمال داره گوشی شماسافت بریک یا هارد بریک شود.

نوت : رام های پنج فایا ماننده 4 فایل رایت میشوند اما با یک تفاوت رام های 5 فایل دارای یک فایل اضافی هست که برای مواقع که شخص نمیخواهد اطلاعات اش پاک شود از آن استفاده میشود

برای فلش بدون حذف اطلاعات در داخل ODIN بجای فایل CSC فایل HOME_CSC را انتخاب کنید و مراحل را هماننده آموزش زیر انجام بدهید

نوت : در بعضی از مدل های امکان حذف اطلاعات هست …

 

1..گوشی را خاموش کنید

2. دکمه کم کردن صدا (ولوم پایین) به همراه دکمه پاور نگه دارید

3. پس از ویبره زدن گوشی پاور را رها کنید. به این صفحه هدایت خواهید شد!

4. برای ادامه مرحله ولوم بالا را بزنید تا گوشی به حالت دانلودینگ (…Downloading) هدایت شود.

5. گوشی را با استفاده از usb به کامپیوتر وصل کنید.

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

6. پس از نصب درایور های مورد نیاز و اتصال دستگاه به کامپیوتر نرم افزار Odin را اجرا کنید. در صورت اجرای صحیح مراحل باید نرم افزار odin به این صورت COM PORT گوشی شما را شناسایی کند.

7. دکمه BL موجود در نرم افزار ODIN را بزنید سپس فایلی که اول اسم آن BL نوشته شده را انتخاب کنید.
دکمه AP موجود در نرم افزار ODIN را بزنید سپس فایلی که اول اسم آن AP نوشته شده را انتخاب کنید.
دکمه CP موجود در نرم افزار ODIN را بزنید سپس فایلی که اول اسم آن CP نوشته شده را انتخاب کنید.
دکمه CSC موجود در نرم افزار ODIN را بزنید سپس فایلی که اول اسم آن CSC نوشته شده را انتخاب کنید.


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


9. در این مرحله قطعا نباید دستگاه را از کامپیوتر جدا کنید منتظر بمانید تا عملیات رایت رام به اتمام برسد.

10. پس از اتمام عملیات رایت رام باید با پیغام !PASS مواجه شوید در غیر اینصورت عملیات رایت ناقص بوده و احتمال داره گوشی شماسافت بریک یا هارد بریک شود.

آموزش فعال کردن حالت چند پنجره‌ای در اندروید 6

آموزش فعال کردن حالت چند پنجره‌ای در اندروید 6
استاندارد

باتوجه به جدول توضیع نسخه‌های اندروید هنوز اکثر کاربران از نسخه مارشملو اندروید استفاده می‌کنند، اندروید مارشملو حالت چند پنجره‌ای را به صورت پیش‌فرض پنهان کرده و اجازه استفاده از آن را به کاربر نمی‌دهد اما شما می‌توانید با یک آموزش ساده آن را فعال و از وجود آن لذت ببرید؛

تنها دو گروه از کاربران می‌توانند این قابلیت را فعال کنند.

گروه اول کاربرانی که دسترسی به روت دارند و گروه دوم کاربرانی که ریکاوری کاستوم twrp را نصب کرده‌اند و ممکن است هنوز دسترسی به روت نداشته باشند.

آموزش فعال‌سازی برای کاربرانی که دسترسی به روت دارند

ابتدا نسخه فول آنلاک اپلیکیشن buildprop editor را از این لینک دانلود و نصب کنید.

آموزش فعال کردن حالت چند پنجره‌ای در اندروید 6

آموزش فعال کردن حالت چند پنجره‌ای در اندروید 6

اپلیکیشن را اجرا کرده و دسترسی روت را از طریق انتخاب گزینه grant در super su به برنامه بدهید.

طبق تصویر در قسمت سرچ برنامه عبارت روبه‌رو را تایپ کنید: ro.build.type

لاین build.type را باز کرده و در قسمت value عبارت user را به userdebug تغییر دهید و ذخیره کنید.

گوشی را ریبوت کنید.

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

وارد تنظیمات اندروید شوید، سپس گزینه developer option را انتخاب کنید و به دنبال عبارت multi-window mode بگردید و تیک آن را بگذارید.

در صورتی که گزینه developer option را ندارید وارد قسمت about شوید و روی بیلد نامبر گوشی چندین بار پشت‌ سر هم کلیک کنید.

آموزش فعال کردن حالت چند پنجره‌ای در اندروید 6

آموزش فعال کردن حالت چند پنجره‌ای در اندروید 6

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

آموزش فعال‌سازی برای کاربرانی که کاستوم ریکاوری twrp دارند

ابتدا با کلید‌های ترکیبی وارد محیط ریکاوری شوید و گزینه mount را انتخاب کنید و تیک system را گذاشته و mount usb storage را انتخاب کنید.

گوشی خود را با کابل یو اس بی به کامپیوتر متصل کنید؛ حال باید از ابزار adb که در هنگام نصب ریکاوری از آن استفاده کردید، کمک بگیریم.

یک پوشه با نام دلخواه در دسکتاپ ایجاد کنید، وارد پوشه شوید و دکمه shift را نگه دارید و در محیط پوشه راست کلیک کنید و عبارت open command window here را انتخاب کنید.

در پنجره باز شده عبارت روبه‌رو را تایپ کنید: adb pull /system/build.prop

آموزش فعال کردن حالت چند پنجره‌ای در اندروید 6

حال وارد پوشه‌ای که ایجاد کردید شوید و فایل build.prop استخراج شده را با برنامه‌ای مثل ++notepad باز کنید.

خط ro.build.type را پیدا کنید و عبارت جلوی = را از user به userdebug تغییر دهید و فایل را ذخیره کنید.

آموزش فعال کردن حالت چند پنجره‌ای در اندروید 6

به cmd بازگردید و دستور رو‌به‌رو را اجرا کنید: /adb push build.prop /system

آموزش فعال کردن حالت چند پنجره‌ای در اندروید 6

آموزش فعال کردن حالت چند پنجره‌ای در اندروید 6

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

adb shell

cd system

chmod 644 build.prop

کابل را جدا کنید و در محیط ریکاوری به قسمت reboot وارد شده و system را انتخاب کنید.

آموزش فعال کردن حالت چند پنجره‌ای در اندروید 6

آموزش فعال کردن حالت چند پنجره‌ای در اندروید 6

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

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

استاندارد

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