کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

دسترسی به دوربین دستگاه اندرویدی جهت ساخت یک فایل ویدیویی

دسترسی به دوربین دستگاه اندرویدی
شرح مختصر پروژه

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

توضیحات پروژه

با عرض سلام و خسته نباشید به شما دانشجویان محترم آموزشگاه تحلیلگر داده ها. در این مقاله قصد داریم تا نحوه استفاده از دوربین در اندروید را بصورت تصویری در محیط برنامه نویسی Eclipse به شما دانشجویان محترم آموزش دهیم.

اهداف پروژه :

در این پروژه ما  قصد داریم اهداف زیر را پیاده سازی نماییم:

دسترسی به دوربین دستگاه اندرویدی جهت ساخت یک فایل ویدیویی 

ذخیره نمودن فایل ویدیویی ضبط شده با یک نام منحصر به فرد و با پسوند .mp4 و در یک پوشه دلخواه در پوشه Movies حافظه « SDCard » دستگاه اندرویدی 

Intent  چیست؟ 

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

برای شروع کار ابتدا می بایست یک پروژه جدید در محیط Eclipse ایجاد نماییم. برای این منظور از منوی File زیر منوی New و سپس زیر منوی Android Application Project را انتخاب می نماییم. (شکل 1)

 

image

 

شکل 1

 

 

همچنین برای ساده تر شدن و بالا بردن سرعت کار می توانید از منوی ابزار ها، منوی New و سپس Android Aplication Project را انتخاب نمایید. (شکل 2)

 

image

 

شکل 2

با انجام هر دو روش پنجره جدیدی با عنوان New Android Application باز می گردد. (شکل 3)

 

image

 

شکل 3

 

در این پنجره قسمت هایی وجود دارد که در زیر به توضیح آنها می پردازیم :

Aplication Name  : در این فیلد می بایست نام برنامه خود را وارد نمایید. توجه داشته باشید که هر مقداری را که در این فیلد وارد نمایید، برنامه با این نام در لیست برنامه های نصب شده قرار خواهد گرفت.

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

 

Project Name : در این فیلد می بایست نام کلی پروژه خود را وارد نمایید و بهتر است که یک رشته با معنا و مرطبت با برنامه خود وارد نمایید.

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

 

Package Name :  در این فیلد می بایست پکیج پروژه خود را تعیین نمایید که بهتر است آدرس وب سایت خود را بدون درج http  و www و بصورت از آخر به اول و به همراه نام وارد شده در فیلد Project Name وارد نمایید. این نوع مقداردهی به برنامه های مارکت نظیر بازار و Google Paly این امکان را میدهد تا زمانی که نسخه جدیدی از برنامه شما ساخته و آماده منتشر گردید باخبر شده و نسخه جدید برنامه تان را جایگزین نسخه قبلی نماید.

 

Minimum Required SDK : در این لیست انواع API های « نسخه های سیستم عامل اندروید » منتشر شده توسط گوگل وجود دارد. با انتخاب هر کدام از آنها مشخص می نمایید که برنامه تان به چه حداقل نسخه ای از سیستم عامل اندروید نیاز دارد. برای مثال اگر گزینه API 14 را انتخاب نمایید، برنامه تان در سیستم عامل اندروید پایین تر از اندروید 4 یا همان IceCream Sandwich، نصب و اجرا نمی گردد.

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

 

Target SDK : در این لیست انواع API های « نسخه های سیستم عامل اندروید » منتشر شده توسط گوگل وجود دارد. با انتخاب هر کدام از آنها مشخص می نمایید که بالاترین نسخه اندرویدی که برنامه شما می تواند در آن نصب و اجرا گردد کدام نسخه است. بدیهی ست که هرچه سطح API انتخاب شده بالاتر باشد، گوشی ها و تبلت های جدید نیز می توانند از برنامه شما استفاده نمایند.

 

Compile With : در این لیست انواع API های « نسخه های سیستم عامل اندروید » منتشر شده توسط گوگل وجود دارد. با انتخاب هر کدام از آنها مشخص می نمایید که برنامه Eclipse از کدام نسخه از سیستم عامل اندروید برای نوشتن کلاس های برنامه و همچنین کامپایل و تست نمودن آن استفاده نماید.

 

Theme : در این لیست می توانید یک Theme برای برنامه خود انتخاب نمایید.

 

توجه داشته باشید زمانی که مقدار Compile With را کمتر از API 14 انتخاب نمایید، از این قسمت نمی توانید استفاده نمایید و می بایست از لیست موجود گزینه None رو انتخاب نمایید.

پس از مقداردهی نمودن فیلد های ذکر شده بر روی دکمه Next کلیک می نماییم تا به مرحله بعدی ایجاد پروژه برویم. (شکل 4)

 

image

 

شکل 4

در مرحله بعدی اگر گزینه Create custom lunche icon را انتخاب نمایید، برنامه Eclipse به شما اجازه میدهد تا برای برنامه خود یک عکس جهت ساختن icon انتخاب و یا با استفاده از ابزار های خود برنامه Eclipse، icon مورد نظر خود را ترسیم نمایید. توجه داشته باشید که در صورت عدم انتخاب این گزینه، صفحه مربوطه برای شما باز نخواهد شد.

همچنین اگر گزینه Create Activity را انتخاب نمایید، برنامه Eclipse به شما اجازه میدهد که نام و نوع activity برنامه تان را انتخاب نمایید.

این دو گزینه را انتخاب می نماییم و سایر گزینه ها را به حالت پیش فرض خود می گذاریم. حال مجددا بروی دکمه Next  کلیک می نماییم تا به مرحله بعدی ایجاد پروژه برویم. (شکل 5)

 

image

 

شکل 5

در مرحله بعدی می توانید برای برنامه خود یک icon انتخاب و یا رسم نمایید.

دکمه image برای انتخاب یک عکس ترجیحا با فرمت png به عنوان icon برنامه

دکمه Clipart برای انتخاب یک clipart « شکلک » به عنوان icon برنامه

دکمه Text برای ورود یک نوشته به عنوان icon برنامه مورد استفاده قرار می گیرند.

ما دکمه image را انتخاب و پس از انتخاب کردن عکس مورد نظر به عنوان icon برنامه بر روی دکمه Next کلیک می نماییم تا به مرحله بعدی ایجاد پروژه برویم. (شکل 6)

 

image

شکل 6

در مرحله بعدی گزینه Create Activity را انتخاب می نماییم و از لیست موجود که بیانگر انتخاب نوع Activity برنامه می باشد گزینه Blank Activity را انتخاب می نماییم. (شکل 7)

 

image

شکل 7

در مرحله آخر نیز باید برای activity و layout خود یک نام انتخاب نمایید. ما نام انتخاب شده پیش فرض را قبول کرده و بر روی دکمه Finish کلیک می نماییم تا پروژه مان ساخته شود. (شکل 8)

 

image

 

شکل 8

تا این جای کار ما پروژه خود را در برنامه Eclipse ایجاد کرده ایم. حال برای ادامه کار می بایست layout برنامه خود را طراحی نماییم.

برای این منظور یک TextView و یک Button بر روی layout خود قرار می دهیم. (شکل 9)

 

image

 

شکل 9

 

همچنین مقادیر لازمه برای نمایش متن دکمه را در فایل string.xml وارد می نماییم.(شکل 10)

image

شکل 10

 

حال در این مرحله می بایست کد های اصلی برنامه را در کلاس MainActivity وارد نماییم.

اولین کدی که می بایست به کلاس MainActivity اضافه نماییم متد onCreate می باشد. این متد یکی از متدهای اصلی برنامه و همین طور چرخه حیات برنامه های اندرویدی می باشد و زمانی که برنامه برای اولین بار اجرا می گردد و یا دستگاه اندرویدی ما از حالت portrait به حالت landscape و یا بر عکس تغییر می کند، این متد فراخوانی می گردد.

یکی از دستورات مهمی که باید به این متد اضافه شود دستور setContentView است. وظیفه این دستور به نمایش در آوردن layout برنامه می باشد.(شکل 11)

image

شکل  11

مقدار activity_main نام فایل xml مربوط به layout برنامه مان می باشد.

همچنین دستور savedInstanceState حالت جاری layout برنامه را ذخیره می نماید. به این معنا که، فرض نمایید بر روی layout خود یک ابزار EditText قرار داده اید و مقدار نام خودتان را درون آن وارد کرده اید. زمانی که حالت دستگاه اندرویدی خودتون را به landscape و یا portrait تغییر دهید مشاهده می نمایید که مقدار نام شما هنوز در EditText وجود دارد و پاک نشده است. دلیل آن به خاطر استفاده از دستور فوق می باشد.

در مرحله بعدی می بایست کدهایی بنویسیم تا بوسیله ی آنها بتوانیم به ابزارهای TextView و Button خود دسترسی پیدا نماییم و همچنین متغیر های لازم برای استفاده در طول برنامه را نیز وارد می نماییم. (شکل 13)

image

شکل 13

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

اگر در زمان تعریف یک متغیر از کلمه کلیدی final استفاده نمایید، مقداری که به آن نصبت میدهید یک مقدار یکتا خواهد بود و به هیچ وجه نمی توانید مقدار آنرا در طول برنامه خود تغییر دهید.

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

image

شکل  14

کدهای بالا را در ادامه کدهای وارد شده قبلی در متد onCreate قرار میدهیم.

 

در کد بالا، ابتدا با استفاده از خصوصیت setOnClickListener، برای دکمه خود رویداد کلیک را شبیه سازی نموده ایم. در مرحله بعد، با استفاده از تابع getlblmessageMediaFileUri، نام فایل برای ذخیره فایل ویدیویی ضبط شده را می سازیم و سپس نام تولید شده را در متغیر fileUri ذخیره می نمایم.

نام فایل تولید شده حتما می بایست در یک متغیر از نوع Uri ذخیره گردد.

 

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

با استفاده از دستور MediaStore.ACTION_VIDEO_CAPTURE، تنها می توانیم  اقدام به فیلم برداری نماییم  و  اگر نیاز به گرفتن  عکس داشته باشیم می بایست از دستور MediaStore.ACTION_IMAGE_CAPTURE   استفاده نماییم.

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

در ادامه کدهای مربوط به تابع getlblmessageMediaFile را خواهیم نوشت. با استفاده از این تابع، نام فایل ویدیویی ضبط شده و همچنین محل ذخیره شدن آنرا مشخص می نماییم.(شکل 15)

 

image

 

شکل 15

دستورات فوق بعد از متد onCreate نوشته می شود.

در متد فوق و در خط اول تنها شئی با نام mediaFile از کلاس File تعریف نموده ایم. این شی در ادامه جهت ذخیره کردن نام تولیدی و یکتای فایل ویدیویی ضبط شده مورد استفاده قرار خواهد گرفت.

در ادامه با توجه به سیاستی که برای پروژه خود در نظر گرفته ایم « ساخت پوشه ای جدید به نام MyCameraVideo در پوشه Movies درSDCard  »، شئی با نام mediaStoregDire از کلاس File تعریف نموده ایم و با استفاده از دستور Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) آدرس پوشه Movies موجود در SDCart دستگاه اندرویدی خود را به عنوان پارامتر اول و مقدار رشته ای MyCameraVideo که نام پوشه ی جدید می باشد را به عنوان پارامتر دوم، برای ساخت آن به کلاس File ارسال نموده ایم.

در خط بعدی شئی با نام date و از نوع کلاس Date تعریف نموده ایم و بعد از آن متغیری با نام timestamp و از نوع String تعریف نموده ایم و مقدار اولیه آنرا برابر با تاریخ و ساعت جاری دستگاه اندرویدی،  مقداردهی نمودیم.

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

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

 

در خط بعدی، با استفاده از دستور شرطی if و متد exists چک می نماییم که آیا پوشه MyCameraVideo وجود دارد یا خیر؟ اگر این پوشه وجود نداشت، وارد بدنه دستور شرطی if می شویم. در داخل بنده با استفاده از دستور شرطی if دیگری، عملیات ساخت پوشه MyCameraVideo را مورد بررسی قرار میدهیم و اگر به هر دلیلی پوشه MyCameraVideo ساخته نگردد، برای جلوگیری از crash شدن برنامه و همچنین اطلاع کاربر پیغام مناسبی را به کاربر نمایش میدهیم.

خروجی متد exists از نوع Boolean « true یا false » می باشد.

برای ساخته شدن یک پوشه در SDCard، از متد mkdir یا mkdirs استفاده می نماییم و خروجی هر دو متد نیز از نوع Boolean « true یا false » می باشند. در صورتی که پوشه مورد نظر ساخته نگردد مقدار true و در غیر این صورت مقدار false برگشت داده خواهد شد.

کلاس Toast کلاسی می باشد که برای نمایش دادن پیغام هایی « با توجه به اتفاقاتی که در طول اجرای برنامه رخ می دهد » به کاربر، مورد استفاده قرار می گیرد. این کلاس سه پارامتر ورودی دارد که مقداردهی کردن هر سه پارامتر الزامی می باشد. پارامتر اول، شئی از نوع Context و پارامتر دوم، پیغام مورد نظر جهت نمایش به کاربر و پارامتر سوم، مدت زمان به نمایش درآمدن کادر پیغام می باشد که می توان از دستور Toast.LENGTH_LONG و یا Toast.LENGTH_SHORT و یا یک عدد صحیح به میلی ثانیه باشد.

هرگاه در برنامه ها نیاز به استفاده از شئی از نوع Context وجود داشته باشد، می توان از دستور getApplicationContext استفاده نمود.

کلاس Log برای درج پیغام هایی در پنجره LogCat برای دیباگ نمودن پروژه های اندرویدی مورد استفاده قرار می گیرد. این کلاس دارای 6 متد مهم و کاربردی می باشد که عبارتند از : e، w، i، d، v، wtf. تمامی این متد ها دو پارامتر ورودی از نوع String دارند. پارامتر اول برای مشخص نمودن مقدار فیلد Tag و پارامتر دوم برای مشخص نمودن مقدار فیلد Text پنجره LogCat می باشد.

برای دسترسی به پنجره LogCat می بایست به منوی Window -> Show View -> Other… رفته و در پنجره باز شده، در کادر type filter text، عبارت LogCat را وارد نماییم و گزینه LogCat را انتخاب و بر روی دکمه OK کلیک نماییم.

تفاوت بین انواع Log ها:

Log.e

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

 

 

Log.w

زمانی به کار می رود که بخواهیم در مورد به وجود آمدن یک وضعیت، هشدار بدهیم. اگرچه وضعیت به وجود آمده، اختلال مهمی در روند اجرای کدها ایجاد نمی کند، ولی می بایست به صورت یک نکته مهم به برنامه نویس تذکر داده شود تا در صورت نیاز، موارد مربوط به آن را در کدنویسی های بعدی مد نظر قرار بدهد .

Log.i

برای نمایش اطلاعات مفیدی در زمینه اجرای بخش های مختلف برنامه اندروید به کار گرفته می شود. مثلا اگر کد شما در کل شامل 5 مرحله باشد، می توانید در انتهای اجرای هر مرحله، با Log.i، پیامی مبنی بر اجرای موفقیت آمیز هر مرحله، در LogCat نمایش بدهید.

Log.d

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

Log.v

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

Log.wtf

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

 

در خط بعدی با استفاده از دستور شرطی if چک می نماییم که آیا مقدار پارامتر ورودی تابع « متغیر type » برابر با مقدار  ذخیره شده در متغیر MEDIA_TYPE_VIDEO می باشد یا خیر؟ اگر با یکدیگر برابر باشند وارد بدنه if می شویم و نام فایل فیلم ذخیره شده را ساخته و در متغیر mediaFile ذخیره می نماییم. در غیر اینصورت وارد بدنه else می شویم و که در این بدنه با استفاده از دستور return از تابع خارج می شویم.

دستور File.separator علامت / را تولید می نماید.

 

در خط آخر نیز مقدار متغیر mediaFile ساخته شده را بر می گردانیم.

در مرحله بعدی حتما می بایست خروجی تابع بالا را به نوع Uri تغییر دهیم. برای این منظور از تابع getlblmessageMediaFileUri استفاده می نماییم. (شکل 16)

 

image

شکل 16

با استفاده از دو تابع نوشته شده ما آدرس محل ذخیره شدن فایل ویدیویی ضبط شده و همچنین نامی یکتا و منحصر به فرد برای آن تولید نمودیم.

حال زمانی که برنامه را اجرا کرده و دکمه Capture Video را لمس نمایید، برنامه دوربین جهت فلیم برداری اجرا می گردد و هرگاه از برنامه دوربین خارج شویم «  دکمه back را لمس نماییم و از برنامه خارج شویم و یا اقدام به ضبط یک فیلم نماییم و بعد از آن از برنامه خارج شویم »، مقادیری یکتا و ثابتی به برنامه ما ارسال می گردد که با استفاده از آنها می توانیم کنترل کاملی بر برنامه خود داشته باشیم. برای اینکه بتوانیم به مقادیر ثابت بازگشتی از برنامه دوربین دسترسی داشته باشیم می بایست از متد onActivityResult استفاده نماییم. (شکل 17)

image

شکل 17

متد onActivityResult سه پارامتر ورودی دریافت می کند. پارامتر اول همان کد یکتا از نوع عدد صحیح می باشد که در دستور startActivityForResult استفاده نموده ایم و پارامتر دوم دو مقدار ثابت RESULT_OK و یا RESULT_CANCELED را از برنامه اجرا شده از طریق کلاس Intent بر می گرداند و پارامتر سوم شئی از کلاس Intent می باشد.

در خط اول با استفاده از دستور شرطی if ابتدا چک می نماییم پاسخی از سمت برنامه دوربین برای برنامه مان ارسال شده است یا خیر؟ اگر شرط برقرار باشد وارد بدنه دستور شرطی if می شویم. در بدنه شرط با استفاده از دستور شرطی if دیگری چک می نماییم که کد ارسال شده از طرف برنامه دوربین برابر با RESULT_OK می باشد یا خیر؟ « آیا کاربر اقدام به ضبط نمودن یک فیلم کرده است یا خیر »

در صورت برقرار بودن این شرط نیز وارد بدنه آن می شویم و با استفاده از متد getData شی Intent که به شی Intent که با استفاده از آن برنامه دوربین را اجرا نموده ایم، داده برگشت داده شده از طرف برنامه دوربین را دریافت کرده و در ابزار TextView و کلاس Toast به کاربر نمایش می دهیم.

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

 

در صورتی که مقدار متغیر resultCode برابر با RESULT_OK نباشد، در دستور شرطی if بعدی چک می نماییم که آیا مقدار متغیر resultCode برابر با RESULT_CANCEL می باشد یا خیر؟ « آیا کاربر دکمه back برنامه دوربین را لمس نموده است یا خیر » که در صورت برقرار بودن شرط نیز یک پیغام مناسب به کاربر نمایش میدهیم. اگر هیچ یک از دو شرط قبلی برقرار نباشد « به هر دلیلی مشکل در اجرا برنامه دوربین » ایجاد گردد دستور else اجرا می گردد و یک پیغام مناسب مبنی بر شکست انجام کار به کاربر نمایش داده می شود.

 

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

شاد و پیروز باشید.

1394/07/27 8087 538
رمز عبور : tahlildadeh.com یا www.tahlildade.com
نظرات شما

نظرات خود را ثبت کنید...