السلام عليكم ورحمة الله وبركاته …..
لقد قمت بكتابة درس عن استخدام معرض الصور في الاندرويد لكي يأخذ
المستخدم صورة منه وبعدها يستخدمها في التطبيق (كصورة شخصية أو غير ذلك… )
هذا رابط الدرس :
https://andrody.com/2015/10/upload_photo_gallery_to_application_android_programmatically/
طبعا قبل قراءة هذا الدرس عليك مراجعة الدرس الماضي لاننا سنقوم بإصلاح الأخطاء الان والتعديل على الكود قليلا
أعتقد أن البعض قد واجه بعض المشاكل في استخدام الكود الذي وضعته في الدرس الماضي .. عند تشغيل البرنامج سوف يظهر خطأ عند اختيار الصورة من المعرض الذي تم فتحه
مما سيسبب توقف التطبيق والسبب في ذلك هو أنك لم تكتب الصلاحيات في ملف المينفيست ..
أعني صلاحيات فتح ملفات من الجهاز واستخدامها في التطبيق .. ومن دون اضافة الصلاحياإلى ملف المينفيست فلن تستطيع
قراءة ملفات من الذاكرة الخارجية للجهاز
الآن , اذهب إلى ملف المينفيست وقم بإضافة هذا السطر :
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
هناك خطأ آخر بالكود قد يظهر عند استخدام ال InputStream وهو :Unhandled Exception : java.io.FileNotFoundException
والسبب انه قد يظهر هذا الخطأ عند اختيار صورة غير موجودة أو تم حذفها
لذلك سنقوم باستخدام try و catch لمعالجة هذا ال exception (الكاتش تقوم فقط بمعالجة هذا الخطأ حين ظهوره
لكن في الحالات العادية هو لن يظهر)
الآن سوف يصبح الكود داخل دالة onActivityResult
if(requestCode == 1 && resultCode == RESULT_OK){ Uri photo_uri = data.getData(); try { InputStream imagestream = getContentResolver().openInputStream(photo_uri); Bitmap selected_photo = BitmapFactory.decodeStream(imagestream); photo.setImageBitmap(selected_photo); }catch (FileNotFoundException FNFE){ Toast.makeText(Gallery_main.this,FNFE.getMessage(),Toast.LENGTH_LONG).show(); }
الآن قمنا بمعالجة الخطأ … أي ان ظهر هذا ال exception سوف ينفذ الكود بداخل الكاتش ..
الآن فلتجرب أن تقوم بتشغيل التطبيق على المحاكي أو على هاتفك واضغط على الزر .. سيفتح الاستديو ثم اختر الصورة التي تريدها بعدها سيعود لتطبيقك وستجد الصورة في مكان الImageView وهذه هي فائدة دالة onActivityResult
..وإذا واجهت أي خطأ آخر .. قم بالتعليق أسفل المدونة وأخبرنا عن الخطأ الذي واجهك
بعد أن تختر الصورة قد تظهر الصورة غير متناسقة أو كبيرة/صغيرة عند عرضها في ImageView ولذلك علينا تغيير حجم الصورة لتصبح متناسقة مع الImageView
في البداية … علينا تغيير عرض و ارتفاع الصورة ونجعلهما مثل العرض والطول للImageView
اذهب إلى ملف اللاياوت الخاص بالاكتيفيتي الرئيسية xml وقم بتغيير حجم الصورة عن طريق خاصية layout_width و layout_height وقم بجعلهما 100dp :
layout_width = “100dp”
layout_height = “100dp “
والآن بما أن ارتفاع الصورة وعرضها أصبح يساوي 100 ,, علينا تغيير حجم الصورة التي اختارها المستخدم من المعرض إلى نفس حجم ال ImageView
في داخل دالة onActivityResult أكمل الكود بإضافة التالي :
selected_photo =Bitmap.createScaledBitmap(selected_photo, 100, 100, true); photo.setImageBitmap(selected_photo);
ما قمنا بفعله هو تغيير طول وعرض الصورة باستخدام دالة createScaledBitmap في الباراميتر الأول : البيتماب التي تريد تغيير حجمها , الثاني : العرض الذي تريده و الثالث : الارتفاع الذي تريده,, والأخير نقوم بوضع true كقيمة افتراضية
و الآن سيصبح حجم الصورة على حجم ال ImageView
ملاحظة : اذا قمت بتغيير ارتفاع أو عرض ال ImageViewمن ال xml عليك تغيير قيمة ال 100 هنا أيضا
الآن سنقوم بتدوير الصورة :rotate
أحيانا عندما تضع الصورة في ImageView قد يتغير اتجاهها أيضا كأن تصبح مائلة إلى اليمين أو اليسار قليلا لذلك سنقوم بتدويرها لتصبح مستقيمة
قم بإضافة هذا الكود :
Matrix matrix =new Matrix(); matrix.postRotate(0); Bitmap rotated_photo = Bitmap.createBitmap(selected_photo,0,0, selected_photo.getWidth(),selected_photo.getHeight(),matrix,true);
الماتركس هو مثل اعدادات للصورة .. بدالة postRotate قمنا بتغيير درجة الانحناء إلى 0 وبعدها بدالة createBitmap قمنا باستخدام الارتفاع والعرض نفسه واعطائها اعدادات الماتركس
الآن قم بتشغيل البرنامج .. سوف ترى الصورة مستقيمة بدون ميلان أو انحناء …. و بامكانك تغيير درجة النحناء إلى 45 مثلا لتجعل الصورة مائلة قليلا
هذه أحد طرق تغيير حجم الصورة وجعلها مائلة أيضا … من يواجه أي مشلكة في الكود أتمنى أن يخبرنا في التعليقات
انتظروا المزيد من الدروس قريبا .. والسلام عليكم
سلام