آموزش برنامه نویسی اندروید قسمت چهاردهم

1395/1/12 --- 3390

با سلام. با قسمت 14 از آموزش برنامه نویسی اندروید با شما هستم.

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

در جلسات قبل نحوه ارسال ایمیل و چک کردن اتصال به اینترنت را یاد گرفتیم.

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

1 ) چک کرن اینترنت و ارسال ایمیل

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

Button btnEmail = (Button) findViewById(R.id.btnEmail);
btnEmail.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Context myContext = FriendLayoutActivity.this;
       
        ConnectivityManager connectMngr = (ConnectivityManager) myContext.getSystemService(Context.CONNECTIVITY_SERVICE(;
        NetworkInfo netInfo = connectMngr.getActiveNetworkInfo ();
        if(netInfo == null || netInfo.isAvailable() == false || netInfo.isConnected() == false){
            Toast.makeText(getApplicationContext(),"No Internet!", Toast.LENGTH_LONG);
        }
        else{
            
        }

    }

کافی است در else که نشان دهنده اتصال به اینترنت است کد ارسال ایمیل را قرار دهیم:

Intent emailIntent = new Intent(Intent.ACTION_SEND);
String[] emailAdress = {"email@yahoo.com"};
emailIntent.putExtra(Intent.EXTRA_EMAIL,emailAdress);
emailIntent.putExtra(Intent.EXTRA_SUBJECT,"mysubject");
emailIntent.putExtra(Intent.EXTRA_TEXT,"mytext");
emailIntent.setType("message/rfc822");
startActivity(Intent.createChooser(emailIntent,"Choose account"));

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

و البته برای چک کردن اتصال اینترنت permission زیر فراموش نشود:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

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

 

2 )افزودن عکس

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

در ابتدا یک دکمه و یک ImageView برای افزودن و نمایش عکس قرار میدهیم:

آموزش برنامه نویسی اندروید قسمت چهاردهم

وارد کد می­شویم.

باید نکاتی را ابتدا یاد بگیریم:

    Start Activity For Result

این متد مانند StartActivity می­باشد. با این تفاوت که Activity ای که آغاز میگردد یک نتیجه برمیگرداند. و نیز به اکتیویتی آغاز شده یک شماره تعلق میگیرد تا در هنگام بازگشت به این صفحه آن را پیگیری کنیم.

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

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == resultCode) {
            // do something 
        }
    }

در قسمت شرط if باید شماره ای که به اکتیویتی هنگام ارسال دادیم را چک کنیم.

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

 

    متد setImageBitmap برای ImageView

به یک ImageView دو مدل میتوان بک گراند داد.

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

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

((ImageView) findViewById(R.id.imageView)).setImageBitmap(ImageBitmap);

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

در ابتدا باید یک intent تعریف کنیم چون مجددا درخواستی از سیستم عامل داریم.

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, 1);

این نوع Intent را هنگام ارسال ایمیل هم آشنا شدیم. متدی بنام setType دارد. در زیر انواعی از ورودی های این متد را برای شما آورده ام:

آموزش برنامه نویسی اندروید قسمت چهاردهم

که image/* به معنای انتخاب تمام فرمت عکس ها هست.

پس از آن این اکتیویتی را با دادن شماره ای به آن (عدد 1) آغاز کرده ایم.

در اینجا دیگر کاری نداریم. ادامه کد ما داخل onActivityResult قرار میگیرد.

آموزش برنامه نویسی اندروید قسمت چهاردهم

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

شرط اول بررسی میکند Activity که در حال حاضر بازگشت آن را بررسی میکنیم کدام یک است؟

در شرط دوم مقدار resultCode بررسی شده است. میتواند مقدار RESULT_OK برای مواقعی که موفقیت آمیز بوده و یا RESULT_CANCLE را نیز بگیرد.

پس از آن یک try catch داریم. برای انجام عملیات زیر:

در ابتدا از از ورودی data از این متد، توسط getdata مقادیر داده ها را میخوانیم. خروجی آن از نوع Uri است. پس آن را داخل یک Uri ذخیره کرده ایم.

URI = Uniform Resource identifier

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

در خط بعد InputStream را داریم. کلاسی که برای دریافت داده ها مثلا گرفتن داده های یک فایل در جاوا(و اینجا در اندروید) کاربرد دارد.

همانطور که میبینید نوشته ایم:

InputStream inputStream = getContentResolver().openInputStream(selectedImage);

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

در اندروید 3 مفهوم اصلی قابل بیان است:

1 ) Manifest که الان شما باهاش آشنا هستید

2 ) منابع resources که این را نیز آشنا هستید. همان عکس ها و یا هرگونه منبع به این ترتیب که داریم

3 ) کامپوننت ها. شامل موارد زیر میشوند

  1 ) اکتیویتی ها. همان کلاس های اکتیویتی که میشناسید

  2 ) سرویس ها. برای انجام کاری در پس زمینه برنامه مثلا دانلود یک فایل در هنگام اجرای برنامه بدون اسجاد وقفه در برنامه

  3 ) Content provider: چیزی که الان بهش برخوردیم. منابع مشترک بین برنامه ها!

مثلا گالری شما در بین بسیاری از منابع اشتراک گذاری شده است. از ایمیل، تلگرام، یا هر برنامه ای که بخواهد به تصاویر شما دسترسی داشته باشد. به چنین منابع مشترکی content provider  میگوییم

4 ) در آخر هم broadcast receiver: اینطور مثال بزنم. این اصطلاح را هنگامی بکار میبریم که مثلا گوشی شما صفحه اش خاموش است و یک برنامه ای رویدادی را حس میکند مثلا دریافت پیام. و صفحه آن روشن شده تا به شما نوتیفیکیشنی را نشان دهد.

برمیگردیم به ادامه کد. متد getContentResolver. این متد امکان دسترسی شما به content provider را فراهم میکند. دقیقا مانند نامش رفتار میکند به این معنا که درخواستی که یک کد از content provider دارد را میگیرد و آن را با هدایت کردن دستور به content provider رفع(resolve) میکند!

 

در ادامه آدرس عکسی که انتخاب کردیم را داده ایم و خروجی نهایی داخل inputstream ذخیره شده است.

از آنجایی که عکس دریافتی داخل drawable قرار ندارد باید آن را به Bitmap تبدیل کنیم تا بتوانیم بعنوان بکگراند ImageView بدهیم. کد خط بعد بصورت زیر هست:

Bitmap ImageBitmap = BitmapFactory.decodeStream(inputStream);

متد decodeStream یک متد از کلاس BitmapFactory هست که یک inputStream گرفته و آن را به Bitmap تبدیل میکند.

کد ما تمام است! کافی هست این ImageBitmap نتیجه را به بک گراند ImageView بدهیم!

((ImageView) findViewById(R.id.imageView)).setImageBitmap(ImageBitmap);

راند ImageView بدهیم!

((ImageView) findViewById(R.id.imageView)).setImageBitmap(ImageBitmap);

 

تنها یک نکته باید گفته شود. کدی که ما نوشتیم چون سایز ImagView بصورت مربع هست تنها عکس های مربع را قبول میکند. در جلسات بعد یک روش برای crop کردن عکس مثل چیزی که در تلگرام داریم خواهم گفت. چیزی که تا الان داریم با زدن دکمه عکس:

آموزش برنامه نویسی اندروید قسمت چهاردهم

و سپس گالری و انتخاب یک عکس مربعی شکل:

آموزش برنامه نویسی اندروید قسمت چهاردهم

و در آخر یک کار جالب. اگر بخواهیم عکس بصورت دایره ای شود چه؟

آموزش برنامه نویسی اندروید قسمت چهاردهم

میتوانیم عکس را بصورت دایره هم crop کنیم. اما کار جالبی نیست. مثل تلگرام بیایم عمل کنیم! روی imageView خودتان یک ImageView دیگر با کد و بک گراند زیر بسازید که وسط عکس باید خالی (transparent) باشه:

آموزش برنامه نویسی اندروید قسمت چهاردهم

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

آموزش برنامه نویسی اندروید قسمت چهاردهم