استفاده از مفاهیم ضمنی (implicit intents)

۱.شبیه ساز رو اجرا می کنم و برنامه‌ی Gallery رو از تو منوی برنامه‌ها اجرا می‌کنم و یه عکس از توش انتخاب می‌کنم، می‌بینید که بالای عکس یه دکمه share (به‌اشتراک‌گذاری) وجود داره. این دکمه بهتون اجازه می‌ده که این عکس رو برای یکی دیگه بفرستید، اما ممکنه یه عالمه برنامه تو گوشیتون داشته باشید که قادر به انجام این کار باشن. مثل ایمیل یا بلوتوث و ... شما می‌تونید برنامه‌ی خودتون رو به این لیست برنامه‌ها که می‌تونن عکس رو به اشتراک بذارن اضافه کنید و این دقیقا کاریه که یه مفهوم ضمنی (implicit intent) انجام می‌ده.

تو برنامه‌ی Gallery، وقتی دکمه‌ی share رو فشار می‌دیم، این برنامه توسط یه مفهوم ضمنی به سیستم اندروید می‌گه :‌ آیا تو سیستم این گوشی برنامه‌ای وجود داره که بتونه اطلاعات رو بفرسته؟ من یه عکس دارم که می‌خوام بفرستم!
بعد سیستم به کاربر یه لیستی از برنامه‌هایی که قادر به انجام این کار هستن نشون می‌ده. توی شبیه ساز وقتی دکمه share رو می‌زنم، عکس رو تبدیل به MMS می‌کنه بدون اینکه از من سوال کنه چه برنامه‌ای رو می‌خوام، چون تنها برنامه‌ای که تو شبیه‌ساز قادر به مدیریت این کار هست، همین برنامه است.
قبل از اینکه به ادامه آموزش بپردازیم، ممکنه براتون سوال شده باشه که این تصویر رو چطور وارد شبیه‌ساز کردم، خوب اگه بریم سراغ اکلیپس و به DDMS بریم، می‌بینید که یکی از ابزارهای تو نوار بالایی، File Explorer هست که به شما اجازه می‌ده فایل‌های داخل دستگاه رو ببینید، من به sdcard رفتم و عکس مورد نظرم رو گذاشتم، برای گذاشتن فایل باید از دکمه‌ای استفاده کنید که بالا سمت راسته و اگه روش نگه دارید می‌نویسه push a file onto the device. بعد از اینکه فایل رو تو دستگاه گذاشتید باید یه بار reset کنید.

خوب برگردیم به ادامه آموزش، گفتیم که برنامه‌ی Gallery با استفاده از یه مفهوم (intent) یه پیغام به سیستم می‌فرسته، حالا از کجا بفهمیم، این مفهوم چه پیغامی رو به فرستاده؟ برای اینکار دکمه‌ی share رو تو شبیه‌ساز می‌زنیم بعد به ایکلیپس می‌ریم و اگه تو LogCat نگاه کنیم، خط های آخرش نوشته :
Starting: Intent { act=android.intent.action.SEND type=image/jpeg ...
android.intent.action.SEND یه مفهوم ضمنیه، که همراه با خودش نوع داده‌ای تصویر از نوع jpeg رو داره.

۲.بیاید یه برنامه بسازیم که بتونه به پیغامی که دکمه‌ی share می‌ده، جواب بده. اول یه پروژه‌ی جدید می‌سازیم، بعد به AndroidManifest.xml می‌ریم، جایی که می‌تونیم یه مفهوم ضمنی بسازیم، توی پروژه یه فعالیت (activity) اصلی داریم که من اسمشو گذاشتم main. و مشاهده می‌کنید که برای این فعالیت یه intent-filter وجود داره که قبلا دریاره‌اش توضیح دادم. برای ساختن یه مفهوم دیگه، همون بلوک intent-filter رو کپی میکنیم، هر کدوم از این بلوک‌ها به سیستم می‌گه که این فعالیت قادر به مدیریت این مفاهیمه.
در قسمت action کد جدید به جای MAIN می نویسیم، SEND.
برای category هم مقدار DEFAULT رو به جای LAUNCHER مینویسیم. این category به سیستم می‌گه که این مفهوم ا چه نوعیه که معمولا همون مقدار پیش فرض رو می ذاریم و خلاص :دی



۳.مورد بعدی که باید اضافه کنیم، یه تگ data است که نوع داده‌ای که می‌تونیم با این مفهوم مدیریت کنیم رو به اندروید می‌گه. یکی از حصوصیاتش mimetype هست که مساوی */image می ذاریم به این معنی که هرنوع عکسی رو می تونه مدیریت کنه.





با اضافه کردن همین چند خط کد، برنامه مون این توانایی رو پیدا می‌کنه که اگه کسی خواست عکسی رو بفرسته و روی دکمه‌ی share کلیک کرد، ما هم می‌تونیم اون رو براش مدیریت کنیم.
۴.وقتی عکس از برنامه‌ی Gallery برامون فرستاده شد، بیاید یه راهی برای نمایش اون فراهم کنیم. به فایل main.xml داخل layout می‌ریم و اون فیلد متنی رو پاک می‌کنیم. و از ستون سمت چپ تو قسمت Images & Media یه کدوم از گزینه هایی که می تونه تصویر رو نشون بده رو انتخاب می‌کنیم، و یه عکس الکی می ذاریم روش.

بعد به فایل جاوای مربوط به این xml می‌ریم، که main.java هست. اول یه مرجع از اون imageView که تو فایل xml گذاشتیم می‌گیریم. با نوشتن این کد (قبلا مفصل توضیح داده شده):

ImageView image = (ImageView) findViewById(R.id.imageView1);
۵.حالا می‌خوایم اون عکسی که از Gallery برامون فرستاده می‌شه رو به عنوان محتویات این imageView قرار بدیم. با استفاده از تابع setImageURI از کلاس imageView. این تابع باید به جایی اشاره کنه که قراره از اونجا محتویات تصویر مشخص بشه. و ما می‌خوایم این محتویات رو از مفهوم ضمنی بگیریم، پس می‌نویسیم (تو پست قبل توضیح دادم):
image.setImageURI(getIntent().getExtras().get(Intent.EXTRA_STREAM));

از setImageURI خطا می‌گیره، باید crtl+1 رو بزنید و اولین گزینه ی تصحیح اینه که cast کنید. پس اینجوری می شه:
image.setImageURI((Uri) getIntent().getExtras().get(Intent.EXTRA_STREAM));
این Intent.EXTRA_STREAM تمام رشته ای که این مفهوم می‌فرسته رو می‌گیره که در واقع آدرس URI همون عکسه است.
۶.برنامه رو run کنید. وقتی بالا میاد یه خطا می‌گیره که انتظارش هم می‌رفت، چون وقتی همین جوری برنامه رو اجرا کنید آدرس هیچ عکسی فرستاده نشده و موقعی که دارید واقعا برنامه تولید می‌کنید باید به این خطاها فکر کنید و راه حلی براشون پیدا کنید.
۷.حالا به Gallery میریم و روی عکس دکمه‌ی share رو می‌زنیم، و می‌بینیم که برنامه‌ی ما هم به لیستی که می‌تونه این کارو انجام بده اضافه شده!

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


منبع AndroidCode

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