مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

آموزش تبادل اطلاعات در برنامه های اندرویدی و روش ارتباط آنها

در مطلب قبلی گفتیم که می توان در اندروید از یک Activity به activity دیگر رفت. همچنین گفتیم که می توان با استفاده از intent های ضمنی از یک activity داخل برنامه به activity های دیگر رفت. حال می خواهیم در این مطلب بررسی کنیم که آیا یک activity وجود دارد که ما به آن منتقل شویم. یعنی آیا برای intent ما گیرنده ای وجود دارد؟

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

اگرچه پلتفرم اندروید تضمین می کند که intent های ضمنی با یکی از برنامه باز خواهد شد ولی همیشه باید یک بار ببینید که آیا دریافت کننده ای برای intent شما وجود دارد یا خیر زیرا که اگر دریافت کننده ای برای intent شما پیدا نشود برنامه شما کرش خواهد کرد. برای این که ببینید دریافت کننده ای برای intent شما وجود دارد باید از متد queryIntentActivities استفاده کنید. خروجی این متد یک لیست از activity ها می باشد که اگر لیست خالی باشد به این معنی است که هیچ دریافت کننده ای پیدا نشده است. نحوه استفاده از این متد به شکل زیر است.

PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
        PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;

اگر در کد بالا isInstentSave مقدار true باشد به این معنی است که حداقل یک activity وجود دارد که بتواند به عنوان دریافت کننده intent ما باشد. همان طور که گفتیم یک activity دیگر را با استفاده از startActivity آغاز می کنیم. حال تصور کنید که بیش از یک دریافت کننده برای برنامه ما وجود داشته باشد. برای مثال می خواهیم به یک آدرس وب برویم در این صورت در گوشی های اندرویدی معمولا مرورگر خود اندروید و کروم وجود دارد. در این صورت از شما سوال می شود که می خواهید کدام برنامه intent شما را دریافت کنند. مانند تصویر زیر

وب سایت توسینسو

ولی اگر یک برنامه دریافت کننده باشد فقط خود همان برنامه باز خواهد شد. در زیر یک مثال کامل از باز کردن یک محل روی نقشه را می بینید

// Build the intent
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

// Verify it resolves
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// Start an activity if it's safe
if (isIntentSafe) {
    startActivity(mapIntent);
}

ساخت یک قسمت Share و نمایش app chooser

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

در لیستی که به شما نشان می دهد همه ی برنامه هایی که بر روی دستگاه شما نصب است و می تواند قابلیت ارسال داشته باشد را به شما نشان می دهد. اگر شما برنامه جدیدی را هم نصب کرده باشید و قابلیت share را داشته باشد نیز در این لیست خواهد آمد. می خواهیم ببینیم که این قابلیت چگونه است و چطور می توان یک صفحه به این شکل ساخت. برای ساخت این قابلیت از متد createChooser مربوط به intent استفاده می کنیم. به کد زیر دقت کنید.

Intent intent = new Intent(Intent.ACTION_SEND);


// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show chooser
Intent chooser = Intent.createChooser(intent, title);

// Verify the intent will resolve to at least one activity
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

کد بالا ابتدا بررسی می کند که کدام برنامه ها می توانند قابلیت share را داشته باشند سپس آنها را به لیست به شما نشان خواهد داد.

دریافت نتیجه از یک activity

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

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

Intent contactIntent=new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
contactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(contactIntent,1);

در کد بالا به intent می گوییم که می خواهیم عمل انتخاب را انجام دهیم و انتخاب از بین مخاطبین ما باشد. و نوع آن را نیز از نوع محتوای گوشی انتخاب می کنیم و در انتها با استفاده از متد startActivityForResult شروع به باز کردن activity مورد نظر می کنیم. ولی یک عدد نیز به همراه intent به متد startActivityForResult ارسال می کنیم و آن عدد چیست؟ آن عدد شماره درخواست ما می باشد. و هنگامی که درخواست ما جواب داده می شود با استفاده از آن عدد تصمیم میگیریم که با نتیجه چکار کنیم. حال باید برای پردازش نتیجه از متد زیر استفاده کنیم. دقت داشته باشید که این متد در کلاس activity وجود دارد و شما باید آن را override نمایید.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // چک کردن کد درخواست
    if (requestCode == 1) {
        // چک کردن موفقیت آمیز بودن عملیات
        if (resultCode == RESULT_OK) {
            // گرفتن مقدار داده ها
            Uri contactUri = data.getData();
            // پیدا کردن ستون شماره تلفن مخاطب
            String[] projection = {Phone.NUMBER};

            //اجرای کوئری برای دریافت شماره تلفن از داخل uri
            Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null);
            cursor.moveToFirst();

            // گرفتن مقدار شماره تلفن
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);
                Toast.makeText(getApplicationContext(),num,Toast.LENGTH_LONG).show();

        }
    }
}

در کد بالا متد onActivityResult سه عدد ورودی دارد اولی شماره درخواست می باشد که ما هنگام باز کردن activity به آن می دهیم. دوم کد نتیجه ای است که مشخص می کند نتیجه ok بوده است یا خیر و سومی مقدار داده ای است که بازگشت داده شده است که در قالب یک intent می باشد و از آن شماره تلفن به روش بالا خارج شده و نشان داده می شود.ITPRO باشید

نویسنده: مهدی عادلی فر

منبع: Itpro

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات