السلام عليكم ورحمه الله وبركاته
اليوم سوف اقوم بشرح كيفيه اخذ صوره من الكاميرا وجعلها خليفه للموبيل
اولا وقبل اى شىء ومن المعروف انه عندما نكون مقبلين على بناء مشروع خاص بالاندرويد
فاننا اولا نقوم ببناء الـLayout الخاص بالبرنامج
فهو بسيط جدا عباره عن زرارين Button احدهما يطلب من الموبيل ان يأخذ صوره عن طريق برنامج الكاميرا
والاخر يقوم بوضع الصوره المأخوذه كخلفيه للشاشة
ولكن نريد ايضا ان نرى الصوره التى تم اخذها من الكاميرا فنحن بحاجه ايضا الى مكون ImageView
ليكون شكل الـ Layout كما بالصوره
كود الـ wallpaper_camera.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:weightSum="100" > <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/wallpaper_imageview" android:background="@drawable/icon" android:layout_weight="90" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_weight="10" android:weightSum="10"> <Button android:id="@+id/take_pic_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/take_pic" android:layout_weight="5"/> <Button android:id="@+id/wallpaper_pic_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/wallpaper_pic" android:layout_weight="5"/> </LinearLayout> </LinearLayout>
بعد ان قومنا ببناء الـ Layout الخاص بشكل البرنامج نقوم بعمل الكود الذى يقوم بفتح الكاميرا واخذ صوره وبعدها وضعها كخلفيه
لذلك علينا ان نقوم بعمل Activity جديد لعمل ذلك
هناك اكواد تقليدية مثل عمل مرجعيه للربط بين كود الجافا وكود الـ XML وعمل الحدث لكل زرار فهذا كله معروف مسبقا
لكن الجديد هنا عندما نضغط على زر مثلا Take Picture فانه يقوم باستدعاء داله takePicWithCamera وهذا ما سوف نقوم بشرحها
private void takePicWithCamera() {
Intent intent = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, WALLPAPER_CAMERA);
}وهى ان تقوم بعمل Intent جديدة وطلب من مقدم الوسائط فى الاندرويد ان تقوم بأخذ صوره وهذا ما يقوم به android.provider.MediaStore.ACTION_IMAGE_CAPTURE
وبعد ان تقوم بأخذ الصوره تريد ان تعود بها الى التطبيق الخاص بك لذلك قومنا باستخدام الداله startActivityForResult بدلا من startActivity
لان الداله startActivityForResult واضح من اسمها انها تقوم بتشغيل التطبيق من اجل الحصول على نتيجه
لكن بعد ان قومت بتشغيلها لابد وان تقوم باستقبال النتيجه التى تعود لك بعد التقاط الصوره ولهذا لابد من عمل Overide للداله onActivityResult وهى داله مورثة من Activity class
تستدعى عندما يعود الـ Activity باى نتائج
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == WALLPAPER_CAMERA) {
Bundle bundle = data.getExtras();
cameraBitmap = (Bitmap) bundle.get("data");
cameraImageView.setImageBitmap(cameraBitmap);
}
}
}عند استدعاء هذه الداله لابد وان قوم اولا بتفحص ان كانت هناك نتيجه بالفعل تم ارجاعها للتطبيق ام لا resultCode == RESULT_OK
فعند اذن نقوم ايضا بفحص هل النتائج التى تم ارجاعها للتطبيق هل هى من الكاميرا ام لا
عن طريق فحص كود الطلب WALLPAPER_CAMERA هل هو مساوى لم تم ارساله مسبقا مع الداله startActivityForResult
لتأكد ان النتائج التى تم ارجاعها للتطبيق خاصه بالكاميرا
ومن ثم نقوم باستخراج البيانات التى تم ارجاعها وهى من النوم Bundle ثم نقوم بعدها بالحصول على قيمه الصوره
cameraBitmap = (Bitmap) bundle.get("data");ولكن طبعا الصوره عباره عن Bitmap فنقوم بعمل Casting لتخزينها فى المتغير cameraBitmap
بعد تخزينها نقوم بعرضها فى الـ cameraImageView
الى هنا قد تم فتح الكاميرا واخد صوره منها وارجاعها وعرضها بالتطبيق
بعد ذلك يأتى دور كيفيه جعلها خليفه للشاشة
وهنا لابد من اعطاء تصريح لذلك لجعل التطبيق الخاص بك يضع خليفه للشاشة
نضع ذلك فالـ AndroidManifest.xml
<uses-permission android:name="android.permission.SET_WALLPAPER" />
نعود الى الحدث الخاص بالزرار Set Wallpaper وهو ما يستدعى الداله setWallpaperWithCameraPic التى تقوم بوضع الصوره كخلفيه
وهذا هو الكود الذى يقوم بوضع الخليفه
getApplicationContext().setWallpaper(cameraBitmap);
لكن دعنا نقول ان المستخدم ضغط على الزر Set Wallpaper قبل ان يقوم باخذ صوره
هناك حلين اما ان نتجاهل هذا الحدث واما ان نقوم بتنفيذ صوره Default ووضعها بالخليفه فى حاله عدم التقاط صوره
وهنا استخدمنا الحل الثانى لكى نتعلم كيفيه الحصول على الصور والملفات الصوتيه الموجوده بالتطبيق
لدينا صوره واحده وهى صوره الـ icon فسوف نقوم بجعلها الصوره الـ Default
لكن كيف نحصل عليها ؟؟
InputStream is = getResources().openRawResource(R.drawable.icon); cameraBitmap = BitmapFactory.decodeStream(is);
عن طريق استدعاء الداله getResources الموجوده بالفعل ضمن دوال الـContext ونقوم باستدعاء الداله openRawResource
وهى ما تأخذ الـ id الخاص بالصوره او الصوت او ملف اخر تريد جلبه لداخل التطبيق من ثم تم الحصول على InputStream خاص بالصورة
بعدها نقوم بعمل تحويل لهذا الـ Stream الى الصورة Bitmap عن طريق BitmapFactory.decodeStream
وهكذا تكون اكتملت الداله setWallpaperWithCameraPic
private void setWallpaperWithCameraPic() {
try {
if (cameraBitmap == null) {
InputStream is = getResources().openRawResource(R.drawable.icon);
cameraBitmap = BitmapFactory.decodeStream(is);
}
getApplicationContext().setWallpaper(cameraBitmap);
showToastMessage("Your wallpaper has been set.");
} catch (IOException e) {
e.printStackTrace();
}
}وها قد انتهى التطبيق
وهذا هو الكود الخاص بالـ SetWallpaperWithCameraPhotoActivity
package com.jkelany.wallpaper;
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class SetWallpaperWithCameraPhotoActivity extends Activity implements
View.OnClickListener {
private Button takePicButton, wallpaperButton;
private ImageView cameraImageView;
private Bitmap cameraBitmap;
private final int WALLPAPER_CAMERA = 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.wallpaper_camera);
init();
}
private void init() {
takePicButton = (Button) findViewById(R.id.take_pic_button);
wallpaperButton = (Button) findViewById(R.id.wallpaper_pic_button);
cameraImageView = (ImageView) findViewById(R.id.wallpaper_imageview);
takePicButton.setOnClickListener(this);
wallpaperButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.take_pic_button:
takePicWithCamera();
break;
case R.id.wallpaper_pic_button:
setWallpaperWithCameraPic();
break;
default:
break;
}
}
private void setWallpaperWithCameraPic() {
try {
if (cameraBitmap == null) {
InputStream is = getResources()
.openRawResource(R.drawable.icon);
cameraBitmap = BitmapFactory.decodeStream(is);
}
getApplicationContext().setWallpaper(cameraBitmap);
showToastMessage("Your wallpaper has been set.");
} catch (IOException e) {
e.printStackTrace();
}
}
private void takePicWithCamera() {
Intent intent = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, WALLPAPER_CAMERA);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == WALLPAPER_CAMERA) {
Bundle bundle = data.getExtras();
cameraBitmap = (Bitmap) bundle.get("data");
cameraImageView.setImageBitmap(cameraBitmap);
}
}
}
private void showToastMessage(String text) {
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}
}لتحميل التطبيق كاملا
SetWallpaperWithCameraPhoto.zip
بالتوفيق ان شاء الله :)