الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية تعيين خليفة للشاشة عن طريق صورة من الكاميرا

بدأه Mahmoud Kelany في 30 سبتمبر 2012 · 2 رد · 1,534 مشاهدة · في Android
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمه الله وبركاته

اليوم سوف اقوم بشرح كيفيه اخذ صوره من الكاميرا وجعلها خليفه للموبيل

اولا وقبل اى شىء ومن المعروف انه عندما نكون مقبلين على بناء مشروع خاص بالاندرويد

فاننا اولا نقوم ببناء الـLayout الخاص بالبرنامج

فهو بسيط جدا عباره عن زرارين Button احدهما يطلب من الموبيل ان يأخذ صوره عن طريق برنامج الكاميرا

والاخر يقوم بوضع الصوره المأخوذه كخلفيه للشاشة

ولكن نريد ايضا ان نرى الصوره التى تم اخذها من الكاميرا فنحن بحاجه ايضا الى مكون ImageView

ليكون شكل الـ Layout كما بالصوره

post-217802-037146200 1349012084_thumb.p

كود الـ 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

post-217802-066430900 1349012136_thumb.p

الى هنا قد تم فتح الكاميرا واخد صوره منها وارجاعها وعرضها بالتطبيق

بعد ذلك يأتى دور كيفيه جعلها خليفه للشاشة

وهنا لابد من اعطاء تصريح لذلك لجعل التطبيق الخاص بك يضع خليفه للشاشة

نضع ذلك فالـ 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();
		}
	}

post-217802-032578500 1349012159_thumb.p

وها قد انتهى التطبيق

وهذا هو الكود الخاص بالـ 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

بالتوفيق ان شاء الله :)

المرفقات
device-2012-09-30-153156.pngdevice-2012-09-30-153317.pngdevice-2012-09-30-153343.png

Software Developer
Mahmoudkelany.com


 

#2

طريقة اخرى لتعيين الصورره كخلفيه

فى الشرح السابق ذكرت انه يمكن تتعين الصوره كخلفية من خلال الكود التالى

getApplicationContext().setWallpaper(cameraBitmap);

لكن ممكن ايضا تعيينها من خلال هذا الكود ايضا

WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
			wallpaperManager.setBitmap(cameraBitmap);

--------------------------------

طريقة اخرى لكيفية الحصول على الصوره من الملفات الخاصه بالمشروع

ذكرنا فالشرح السابق لكى نحصل على الصوره icon فيكون الكود الخاص بها هكذا

InputStream is = getResources().openRawResource(R.drawable.icon);
				cameraBitmap = BitmapFactory.decodeStream(is);

لكن ايضا هناك طريقه اخرى هكذا

Drawable drawable = getResources().getDrawable(R.drawable.icon);
				cameraBitmap = ((BitmapDrawable) drawable).getBitmap();

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 30 سبتمبر 2012 في 17:02

Software Developer
Mahmoudkelany.com


 

#3

شكراً ع الشرح الرائع والمفيد جداً :) جزاك الله كل خير ، قمت بتطبيقه وتجربته على جهازي ولكن لاحظت انه بعد اخذ الصورة وتغيير اتجاه الجهاز ليصبح افقي مثلاً تختفي الصوره من ImageView فهل هناك تعديل على الكود مثلاً :hmm: :hmm: ؟؟!!! تحياتي لك ....

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…