گرفتن عکس و ذخیره آن با دوربین جلوی گوشی در اندروید

شنبه 26 فروردین 1396

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

گرفتن عکس و ذخیره آن با دوربین جلوی گوشی در اندروید

در لایه ی layout آن از یک دکمه برای گرفتن عکس استفاده می کنیم

در پوشه ی drawble باید آیکون موردنظر خود را قرار دهید

حالا در کلاس جاوا قطعه کد زیر را بنویسید:

import anywheresoftware.b4a.B4AMenuItem;
import android.app.Activity;
import android.os.Bundle;
import anywheresoftware.b4a.BA;
import anywheresoftware.b4a.BALayout;
import anywheresoftware.b4a.B4AActivity;
import anywheresoftware.b4a.ObjectWrapper;
import anywheresoftware.b4a.objects.ActivityWrapper;
import java.lang.reflect.InvocationTargetException;
import anywheresoftware.b4a.B4AUncaughtException;
import anywheresoftware.b4a.debug.*;
import java.lang.ref.WeakReference;

public class main extends Activity implements B4AActivity{
	public static main mostCurrent;
	static boolean afterFirstLayout;
	static boolean isFirst = true;
    private static boolean processGlobalsRun = false;
	BALayout layout;
	public static BA processBA;
	BA activityBA;
    ActivityWrapper _activity;
    java.util.ArrayList<B4AMenuItem> menuItems;
	public static final boolean fullScreen = false;
	public static final boolean includeTitle = true;
    public static WeakReference<Activity> previousOne;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		if (isFirst) {
			processBA = new BA(this.getApplicationContext(), null, null, "vb.front.camera", "vb.front.camera.main");
			processBA.loadHtSubs(this.getClass());
	        float deviceScale = getApplicationContext().getResources().getDisplayMetrics().density;
	        BALayout.setDeviceScale(deviceScale);
            
		}
		else if (previousOne != null) {
			Activity p = previousOne.get();
			if (p != null && p != this) {
                BA.LogInfo("Killing previous instance (main).");
				p.finish();
			}
		}
		if (!includeTitle) {
        	this.getWindow().requestFeature(android.view.Window.FEATURE_NO_TITLE);
        }
        if (fullScreen) {
        	getWindow().setFlags(android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN,   
        			android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
		mostCurrent = this;
        processBA.sharedProcessBA.activityBA = null;
		layout = new BALayout(this);
		setContentView(layout);
		afterFirstLayout = false;
		BA.handler.postDelayed(new WaitForLayout(), 5);

	}
	private static class WaitForLayout implements Runnable {
		public void run() {
			if (afterFirstLayout)
				return;
			if (mostCurrent == null)
				return;
            
			if (mostCurrent.layout.getWidth() == 0) {
				BA.handler.postDelayed(this, 5);
				return;
			}
			mostCurrent.layout.getLayoutParams().height = mostCurrent.layout.getHeight();
			mostCurrent.layout.getLayoutParams().width = mostCurrent.layout.getWidth();
			afterFirstLayout = true;
			mostCurrent.afterFirstLayout();
		}
	}
	private void afterFirstLayout() {
        if (this != mostCurrent)
			return;
		activityBA = new BA(this, layout, processBA, "vb.front.camera", "vb.front.camera.main");
        
        processBA.sharedProcessBA.activityBA = new java.lang.ref.WeakReference<BA>(activityBA);
        anywheresoftware.b4a.objects.ViewWrapper.lastId = 0;
        _activity = new ActivityWrapper(activityBA, "activity");
        anywheresoftware.b4a.Msgbox.isDismissing = false;
        if (BA.shellMode) {
			if (isFirst)
				processBA.raiseEvent2(null, true, "SHELL", false);
			processBA.raiseEvent2(null, true, "CREATE", true, "vb.front.camera.main", processBA, activityBA, _activity, anywheresoftware.b4a.keywords.Common.Density);
			_activity.reinitializeForShell(activityBA, "activity");
		}
        initializeProcessGlobals();		
        initializeGlobals();
        
        BA.LogInfo("** Activity (main) Create, isFirst = " + isFirst + " **");
        processBA.raiseEvent2(null, true, "activity_create", false, isFirst);
		isFirst = false;
		if (this != mostCurrent)
			return;
        processBA.setActivityPaused(false);
        BA.LogInfo("** Activity (main) Resume **");
        processBA.raiseEvent(null, "activity_resume");
        if (android.os.Build.VERSION.SDK_INT >= 11) {
			try {
				android.app.Activity.class.getMethod("invalidateOptionsMenu").invoke(this,(Object[]) null);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}
	public void addMenuItem(B4AMenuItem item) {
		if (menuItems == null)
			menuItems = new java.util.ArrayList<B4AMenuItem>();
		menuItems.add(item);
	}
	@Override
	public boolean onCreateOptionsMenu(android.view.Menu menu) {
		super.onCreateOptionsMenu(menu);
		if (menuItems == null)
			return false;
		for (B4AMenuItem bmi : menuItems) {
			android.view.MenuItem mi = menu.add(bmi.title);
			if (bmi.drawable != null)
				mi.setIcon(bmi.drawable);
            if (android.os.Build.VERSION.SDK_INT >= 11) {
				try {
                    if (bmi.addToBar) {
				        android.view.MenuItem.class.getMethod("setShowAsAction", int.class).invoke(mi, 1);
                    }
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			mi.setOnMenuItemClickListener(new B4AMenuItemsClickListener(bmi.eventName.toLowerCase(BA.cul)));
		}
		return true;
	}
    public void onWindowFocusChanged(boolean hasFocus) {
       super.onWindowFocusChanged(hasFocus);
       if (processBA.subExists("activity_windowfocuschanged"))
           processBA.raiseEvent2(null, true, "activity_windowfocuschanged", false, hasFocus);
    }
	private class B4AMenuItemsClickListener implements android.view.MenuItem.OnMenuItemClickListener {
		private final String eventName;
		public B4AMenuItemsClickListener(String eventName) {
			this.eventName = eventName;
		}
		public boolean onMenuItemClick(android.view.MenuItem item) {
			processBA.raiseEvent(item.getTitle(), eventName + "_click");
			return true;
		}
	}
    public static Class<?> getObject() {
		return main.class;
	}
    private Boolean onKeySubExist = null;
    private Boolean onKeyUpSubExist = null;
	@Override
	public boolean onKeyDown(int keyCode, android.view.KeyEvent event) {
		if (onKeySubExist == null)
			onKeySubExist = processBA.subExists("activity_keypress");
		if (onKeySubExist) {
			if (keyCode == anywheresoftware.b4a.keywords.constants.KeyCodes.KEYCODE_BACK &&
					android.os.Build.VERSION.SDK_INT >= 18) {
				HandleKeyDelayed hk = new HandleKeyDelayed();
				hk.kc = keyCode;
				BA.handler.post(hk);
				return true;
			}
			else {
				boolean res = new HandleKeyDelayed().runDirectly(keyCode);
				if (res)
					return true;
			}
		}
		return super.onKeyDown(keyCode, event);
	}
	private class HandleKeyDelayed implements Runnable {
		int kc;
		public void run() {
			runDirectly(kc);
		}
		public boolean runDirectly(int keyCode) {
			Boolean res =  (Boolean)processBA.raiseEvent2(_activity, false, "activity_keypress", false, keyCode);
			if (res == null || res == true) {
                return true;
            }
            else if (keyCode == anywheresoftware.b4a.keywords.constants.KeyCodes.KEYCODE_BACK) {
				finish();
				return true;
			}
            return false;
		}
		
	}
    @Override
	public boolean onKeyUp(int keyCode, android.view.KeyEvent event) {
		if (onKeyUpSubExist == null)
			onKeyUpSubExist = processBA.subExists("activity_keyup");
		if (onKeyUpSubExist) {
			Boolean res =  (Boolean)processBA.raiseEvent2(_activity, false, "activity_keyup", false, keyCode);
			if (res == null || res == true)
				return true;
		}
		return super.onKeyUp(keyCode, event);
	}
	@Override
	public void onNewIntent(android.content.Intent intent) {
		this.setIntent(intent);
	}
    @Override 
	public void onPause() {
		super.onPause();
        if (_activity == null) //workaround for emulator bug (Issue 2423)
            return;
		anywheresoftware.b4a.Msgbox.dismiss(true);
        BA.LogInfo("** Activity (main) Pause, UserClosed = " + activityBA.activity.isFinishing() + " **");
        processBA.raiseEvent2(_activity, true, "activity_pause", false, activityBA.activity.isFinishing());		
        processBA.setActivityPaused(true);
        mostCurrent = null;
        if (!activityBA.activity.isFinishing())
			previousOne = new WeakReference<Activity>(this);
        anywheresoftware.b4a.Msgbox.isDismissing = false;
	}

	@Override
	public void onDestroy() {
        super.onDestroy();
		previousOne = null;
	}
    @Override 
	public void onResume() {
		super.onResume();
        mostCurrent = this;
        anywheresoftware.b4a.Msgbox.isDismissing = false;
        if (activityBA != null) { //will be null during activity create (which waits for AfterLayout).
        	ResumeMessage rm = new ResumeMessage(mostCurrent);
        	BA.handler.post(rm);
        }
	}
    private static class ResumeMessage implements Runnable {
    	private final WeakReference<Activity> activity;
    	public ResumeMessage(Activity activity) {
    		this.activity = new WeakReference<Activity>(activity);
    	}
		public void run() {
			if (mostCurrent == null || mostCurrent != activity.get())
				return;
			processBA.setActivityPaused(false);
            BA.LogInfo("** Activity (main) Resume **");
		    processBA.raiseEvent(mostCurrent._activity, "activity_resume", (Object[])null);
		}
    }
	@Override
	protected void onActivityResult(int requestCode, int resultCode,
	      android.content.Intent data) {
		processBA.onActivityResult(requestCode, resultCode, data);
	}
	private static void initializeGlobals() {
		processBA.raiseEvent2(null, true, "globals", false, (Object[])null);
	}

public anywheresoftware.b4a.keywords.Common __c = null;
public vb.front.cam.fronty _fc = null;
public anywheresoftware.b4a.objects.ButtonWrapper _button1 = null;
public anywheresoftware.b4a.objects.PanelWrapper _panel1 = null;
public anywheresoftware.b4a.phone.Phone _p = null;

public static boolean isAnyActivityVisible() {
    boolean vis = false;
vis = vis | (main.mostCurrent != null);
return vis;}
public static String  _activity_create(boolean _firsttime) throws Exception{
 //BA.debugLineNum = 29;BA.debugLine="Sub Activity_Create(FirstTime As Boolean)";
 //BA.debugLineNum = 32;BA.debugLine="Activity.LoadLayout(\"1\")";
mostCurrent._activity.LoadLayout("1",mostCurrent.activityBA);
 //BA.debugLineNum = 34;BA.debugLine="Panel1.Top = 0";
mostCurrent._panel1.setTop((int) (0));
 //BA.debugLineNum = 35;BA.debugLine="Panel1.Left = 0";
mostCurrent._panel1.setLeft((int) (0));
 //BA.debugLineNum = 36;BA.debugLine="Panel1.Height = 400dip";
mostCurrent._panel1.setHeight(anywheresoftware.b4a.keywords.Common.DipToCurrent((int) (400)));
 //BA.debugLineNum = 37;BA.debugLine="Panel1.Width= 400dip";
mostCurrent._panel1.setWidth(anywheresoftware.b4a.keywords.Common.DipToCurrent((int) (400)));
 //BA.debugLineNum = 40;BA.debugLine="button1.Width=150";
mostCurrent._button1.setWidth((int) (150));
 //BA.debugLineNum = 41;BA.debugLine="button1.Height=150";
mostCurrent._button1.setHeight((int) (150));
 //BA.debugLineNum = 44;BA.debugLine="button1.Top = Activity.height - button1.width";
mostCurrent._button1.setTop((int) (mostCurrent._activity.getHeight()-mostCurrent._button1.getWidth()));
 //BA.debugLineNum = 45;BA.debugLine="button1.Left= Activity.Width - button1.width";
mostCurrent._button1.setLeft((int) (mostCurrent._activity.getWidth()-mostCurrent._button1.getWidth()));
 //BA.debugLineNum = 47;BA.debugLine="button1.Text=\"Capture\"";
mostCurrent._button1.setText((Object)("Capture"));
 //BA.debugLineNum = 49;BA.debugLine="FC.Initialize(Panel1,\"FC\")";
mostCurrent._fc.Initialize(mostCurrent.activityBA,(android.view.ViewGroup)(mostCurrent._panel1.getObject()),"FC");
 //BA.debugLineNum = 53;BA.debugLine="Panel1.Invalidate";
mostCurrent._panel1.Invalidate();
 //BA.debugLineNum = 54;BA.debugLine="Activity.Invalidate";
mostCurrent._activity.Invalidate();
 //BA.debugLineNum = 56;BA.debugLine="button1.BringToFront";
mostCurrent._button1.BringToFront();
 //BA.debugLineNum = 57;BA.debugLine="Panel1.SendToBack";
mostCurrent._panel1.SendToBack();
 //BA.debugLineNum = 61;BA.debugLine="End Sub";
return "";
}
public static String  _activity_pause(boolean _userclosed) throws Exception{
 //BA.debugLineNum = 102;BA.debugLine="Sub Activity_Pause (UserClosed As Boolean)";
 //BA.debugLineNum = 104;BA.debugLine="Try";
try { //BA.debugLineNum = 105;BA.debugLine="FC.StopPreview";
mostCurrent._fc.StopPreview();
 } 
       catch (Exception e48) {
			processBA.setLastException(e48); };
 //BA.debugLineNum = 109;BA.debugLine="Try";
try { //BA.debugLineNum = 110;BA.debugLine="FC.Release";
mostCurrent._fc.Release();
 } 
       catch (Exception e52) {
			processBA.setLastException(e52); };
 //BA.debugLineNum = 114;BA.debugLine="End Sub";
return "";
}
public static String  _activity_resume() throws Exception{
 //BA.debugLineNum = 95;BA.debugLine="Sub Activity_Resume";
 //BA.debugLineNum = 97;BA.debugLine="Msgbox(\"Front Camera Application\" ,\"Bermz ISware Software Solutions\")";
anywheresoftware.b4a.keywords.Common.Msgbox("Front Camera Application","Bermz ISware Software Solutions",mostCurrent.activityBA);
 //BA.debugLineNum = 100;BA.debugLine="End Sub";
return "";
}
public static String  _button1_click() throws Exception{
 //BA.debugLineNum = 149;BA.debugLine="Sub button1_click";
 //BA.debugLineNum = 151;BA.debugLine="Try";
try { //BA.debugLineNum = 152;BA.debugLine="FC.TakePicture";
mostCurrent._fc.TakePicture();
 } 
       catch (Exception e76) {
			processBA.setLastException(e76); //BA.debugLineNum = 154;BA.debugLine="Msgbox(\"Camera not working? Reboot phone possibly?\",\"INFO\")";
anywheresoftware.b4a.keywords.Common.Msgbox("Camera not working? Reboot phone possibly?","INFO",mostCurrent.activityBA);
 //BA.debugLineNum = 155;BA.debugLine="Msgbox(\"  OS\", p.SdkVersion)";
anywheresoftware.b4a.keywords.Common.Msgbox("  OS",BA.NumberToString(mostCurrent._p.getSdkVersion()),mostCurrent.activityBA);
 //BA.debugLineNum = 158;BA.debugLine="If p.SdkVersion >1 AND p.SdkVersion < 9 Then";
if (mostCurrent._p.getSdkVersion()>1 && mostCurrent._p.getSdkVersion()<9) { 
 //BA.debugLineNum = 160;BA.debugLine="Msgbox(\"Starting Older Front Cam OS\", \"Android OS Version: \" & p.SdkVersion)";
anywheresoftware.b4a.keywords.Common.Msgbox("Starting Older Front Cam OS","Android OS Version: "+BA.NumberToString(mostCurrent._p.getSdkVersion()),mostCurrent.activityBA);
 //BA.debugLineNum = 161;BA.debugLine="FC.Older2b";
mostCurrent._fc.Older2b();
 //BA.debugLineNum = 162;BA.debugLine="FC.StartPreview";
mostCurrent._fc.StartPreview();
 //BA.debugLineNum = 163;BA.debugLine="Panel1.Invalidate";
mostCurrent._panel1.Invalidate();
 //BA.debugLineNum = 164;BA.debugLine="Activity.Invalidate";
mostCurrent._activity.Invalidate();
 };
 };
 //BA.debugLineNum = 168;BA.debugLine="End Sub";
return "";
}
public static String  _fc_picturetaken(byte[] _data) throws Exception{
anywheresoftware.b4a.objects.streams.File.OutputStreamWrapper _out = null;
int _myr = 0;
anywheresoftware.b4a.objects.IntentWrapper _i = null;
 //BA.debugLineNum = 116;BA.debugLine="Sub fc_PictureTaken (Data() As Byte)";
 //BA.debugLineNum = 120;BA.debugLine="Try";
try { //BA.debugLineNum = 121;BA.debugLine="File.MakeDir(File.DirRootExternal, \"DCIM/FrontCam\")";
anywheresoftware.b4a.keywords.Common.File.MakeDir(anywheresoftware.b4a.keywords.Common.File.getDirRootExternal(),"DCIM/FrontCam");
 } 
       catch (Exception e58) {
			processBA.setLastException(e58); };
 //BA.debugLineNum = 128;BA.debugLine="Dim out As OutputStream";
_out = new anywheresoftware.b4a.objects.streams.File.OutputStreamWrapper();
 //BA.debugLineNum = 129;BA.debugLine="Dim myr As Int";
_myr = 0;
 //BA.debugLineNum = 130;BA.debugLine="myr = Rnd(111,33333)";
_myr = anywheresoftware.b4a.keywords.Common.Rnd((int) (111),(int) (33333));
 //BA.debugLineNum = 131;BA.debugLine="out = File.OpenOutput(File.DirRootExternal, \"DCIM/FrontCam/A\" & myr & \".jpg\", False)";
_out = anywheresoftware.b4a.keywords.Common.File.OpenOutput(anywheresoftware.b4a.keywords.Common.File.getDirRootExternal(),"DCIM/FrontCam/A"+BA.NumberToString(_myr)+".jpg",anywheresoftware.b4a.keywords.Common.False);
 //BA.debugLineNum = 132;BA.debugLine="out.WriteBytes(Data, 0, Data.Length)";
_out.WriteBytes(_data,(int) (0),_data.length);
 //BA.debugLineNum = 133;BA.debugLine="out.Close";
_out.Close();
 //BA.debugLineNum = 135;BA.debugLine="ToastMessageShow(\"Image saved: \" & File.Combine(File.DirRootExternal, \"DCIM/FrontCam/A\" & myr & \".jpg\"), True)";
anywheresoftware.b4a.keywords.Common.ToastMessageShow("Image saved: "+anywheresoftware.b4a.keywords.Common.File.Combine(anywheresoftware.b4a.keywords.Common.File.getDirRootExternal(),"DCIM/FrontCam/A"+BA.NumberToString(_myr)+".jpg"),anywheresoftware.b4a.keywords.Common.True);
 //BA.debugLineNum = 137;BA.debugLine="FC.StartPreview";
mostCurrent._fc.StartPreview();
 //BA.debugLineNum = 140;BA.debugLine="Dim I As Intent";
_i = new anywheresoftware.b4a.objects.IntentWrapper();
 //BA.debugLineNum = 141;BA.debugLine="I.Initialize(\"android.intent.action.MEDIA_SCANNER_SCAN_FILE\", _         \"file://\" & File.Combine(File.DirRootExternal, \"DCIM/FrontCam/A\" & myr & \".jpg\"))";
_i.Initialize("android.intent.action.MEDIA_SCANNER_SCAN_FILE","file://"+anywheresoftware.b4a.keywords.Common.File.Combine(anywheresoftware.b4a.keywords.Common.File.getDirRootExternal(),"DCIM/FrontCam/A"+BA.NumberToString(_myr)+".jpg"));
 //BA.debugLineNum = 143;BA.debugLine="Dim p As Phone";
mostCurrent._p = new anywheresoftware.b4a.phone.Phone();
 //BA.debugLineNum = 144;BA.debugLine="p.SendBroadcastIntent(I)";
mostCurrent._p.SendBroadcastIntent((android.content.Intent)(_i.getObject()));
 //BA.debugLineNum = 146;BA.debugLine="End Sub";
return "";
}
public static String  _fc_ready(boolean _success) throws Exception{
 //BA.debugLineNum = 66;BA.debugLine="Sub fc_Ready (Success As Boolean)";
 //BA.debugLineNum = 71;BA.debugLine="Try";
try { //BA.debugLineNum = 72;BA.debugLine="FC.StartPreview";
mostCurrent._fc.StartPreview();
 } 
       catch (Exception e29) {
			processBA.setLastException(e29); //BA.debugLineNum = 74;BA.debugLine="Msgbox(\"FRONT Camera not working?\",\"INFO\")";
anywheresoftware.b4a.keywords.Common.Msgbox("FRONT Camera not working?","INFO",mostCurrent.activityBA);
 //BA.debugLineNum = 76;BA.debugLine="If p.SdkVersion >1 AND p.SdkVersion < 9 Then";
if (mostCurrent._p.getSdkVersion()>1 && mostCurrent._p.getSdkVersion()<9) { 
 //BA.debugLineNum = 78;BA.debugLine="Msgbox(\"Starting Older Front Cam OS\", p.SdkVersion)";
anywheresoftware.b4a.keywords.Common.Msgbox("Starting Older Front Cam OS",BA.NumberToString(mostCurrent._p.getSdkVersion()),mostCurrent.activityBA);
 //BA.debugLineNum = 79;BA.debugLine="FC.Older2b";
mostCurrent._fc.Older2b();
 //BA.debugLineNum = 80;BA.debugLine="FC.StartPreview";
mostCurrent._fc.StartPreview();
 //BA.debugLineNum = 81;BA.debugLine="Panel1.Invalidate";
mostCurrent._panel1.Invalidate();
 //BA.debugLineNum = 82;BA.debugLine="Activity.Invalidate";
mostCurrent._activity.Invalidate();
 };
 };
 //BA.debugLineNum = 88;BA.debugLine="button1.Initialize(\"button1\")";
mostCurrent._button1.Initialize(mostCurrent.activityBA,"button1");
 //BA.debugLineNum = 89;BA.debugLine="button1.BringToFront";
mostCurrent._button1.BringToFront();
 //BA.debugLineNum = 92;BA.debugLine="End Sub";
return "";
}

public static void initializeProcessGlobals() {
    
    if (main.processGlobalsRun == false) {
	    main.processGlobalsRun = true;
		try {
		        main._process_globals();
		
        } catch (Exception e) {
			throw new RuntimeException(e);
		}
    }
}public static String  _globals() throws Exception{
 //BA.debugLineNum = 17;BA.debugLine="Sub Globals";
 //BA.debugLineNum = 20;BA.debugLine="Dim FC As CameraFront";
mostCurrent._fc = new vb.front.cam.fronty();
 //BA.debugLineNum = 21;BA.debugLine="Dim button1 As Button";
mostCurrent._button1 = new anywheresoftware.b4a.objects.ButtonWrapper();
 //BA.debugLineNum = 22;BA.debugLine="Dim Panel1 As Panel";
mostCurrent._panel1 = new anywheresoftware.b4a.objects.PanelWrapper();
 //BA.debugLineNum = 24;BA.debugLine="Dim p As Phone";
mostCurrent._p = new anywheresoftware.b4a.phone.Phone();
 //BA.debugLineNum = 26;BA.debugLine="End Sub";
return "";
}
public static String  _process_globals() throws Exception{
 //BA.debugLineNum = 12;BA.debugLine="Sub Process_Globals";
 //BA.debugLineNum = 15;BA.debugLine="End Sub";
return "";
}
}

برای اینکه عکس مورد نظر در پوشه ذخیره شود و همین طور شما مجوز دسترسی به دوربین جلوی گوشی را داشته باشید داخل فایل android manifest قطعه کد زیر را اضافه نمایید.

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

خروجی به صورت زیر خواهد بود:

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

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