چگونه یک اسلایدر به اکتیویتی اضافه کنیم؟

چگونه یک اسلایدر به اکتیویتی اضافه کنیم؟

ابتدا کتابخانه‌های مورد نیاز برای نوشتم اسلایدر را به اپلیکیشن اضافه می‌کنیم:

تو فایل gradle کتابخونه‌ها رو به ترتیب یر اضافه می‌کنیم:

compile “com.android.support:support-v4:+”
compile ‘com.squareup.picasso:picasso:2.3.2’
compile ‘com.nineoldandroids:library:2.4.0’
compile ‘com.daimajia.slider:library:1.1.5@aar’

با اضافه کردن این کتابخونه‌ها اندروید استودیو نیاز به دانلود کتابخونه‌هایی داره که تو sdk  وجود نداره.پس فراموش نکنید حتما فیلتر شکنتون رو اجرا کنید.

 

بعد از اضافه کردن کتابخونه ها باید permission  های مورد نیاز را در فایل AndroidManifest.xml تعریف کنید:

 

<uses-permission android:name=”android.permission.READ_EXTERNAL_STORAGE” />
<uses-permission android:name=”android.permission.INTERNET” />

 

حالا نوبت به این میرسه که تو صفحه اصلی که میخواهیم اسلایدر داشته باشیم کدهامونو بنویسیم:

<com.daimajia.slider.library.SliderLayout
android:id=”@+id/slider”
android:layout_width=”match_parent”
android:layout_height=”200dp” />

 

و در MainActivity.java   ؛ SliderLayout  را که در فایل Layout اضافه کرده بودیم تعریف می‌کنیم:

SliderLayout sliderShow = (SliderLayout) findViewById(R.id.slider);
TextSliderView textSliderView = new TextSliderView(this);

 

 

تو کد بالا ابتدا SliderLyout و TextSliderView را تعریف می‌کنیم و شرح تصویر و خود تصویر را بهش اضافه می‌کنیم:

textSliderView
.description(“Game of Thrones”)
.image(“http://images.boomsbeat.com/data/images/full/19640/game-of-thrones-season-4-jpg.jpg”);

sliderShow.addSlider(textSliderView);

حالا کافیه یه آرایه تعریف کنیم و آدرس تصاویر و نام تصویر را داخل آرایه بریزیم و با یم حلقه طبق مثال بایل به SliderView ‌ی که تعریف کردیم اضافه کنیم. کد کامل را براتون میزارم:

 


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.daimajia.slider.library.SliderLayout;
import com.daimajia.slider.library.SliderTypes.BaseSliderView;
import com.daimajia.slider.library.SliderTypes.TextSliderView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements BaseSliderView.OnSliderClickListener{
ArrayList<String> urlPics;
ArrayList<String> names;
@Override
protected void onCreate(Bundle savedInstanceState) {
urlPics = new ArrayList<>();
names = new ArrayList<>();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SliderLayout sliderShow = (SliderLayout) findViewById(R.id.slider);
urlPics.add(“http://webenik.com/wp-content/uploads/2017/11/android1kjh.jpg”);
urlPics.add(“http://webenik.com/wp-content/uploads/2017/11/Programming-for-Kids-e1465336734364.jpg”);
urlPics.add(“http://webenik.com/wp-content/uploads/2017/12/51ea53b6f14e2a5ea05d98834444.jpg”);
urlPics.add(“http://webenik.com/wp-content/uploads/2017/11/programming-mistakes.jpg”);

names.add(“android”);
names.add(“Kids”);
names.add(“design”);
names.add(“pack”);

for(int i =0  ;i<urlPics.size();i++){
TextSliderView textSliderView = new TextSliderView(this);
textSliderView.image(urlPics.get(i))
.setScaleType(BaseSliderView.ScaleType.Fit)
.setOnSliderClickListener(this);
textSliderView.bundle(new Bundle());
textSliderView.getBundle()
.putString(“extra”,names.get(i));
sliderShow.addSlider(textSliderView);
}

}

@Override
public void onSliderClick(BaseSliderView slider) {

}
}

 

ایجاد صفحه اسپلش (Splash Screen)

چگونه در اندروید صفحه اسپلش (Splash Screen) بسازیم؟

 

 

همینطور که تو اپلیکیشن‌های مختلف دید اکثرشون Splash Screen دارن. منم تصمیم گرفتم آموزش ایجاد Splash Screen  رو براتون بزارم.امیدوارم به کارتون بیاد.

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

ابتدا یه اکتیویتی با هر اسمی که استاندارد نام‌گذاری خودتون تو پروژه‌تون دارید ایجاد میکینم.من اینجا اسمشو میزارم ActivitySpl.

 

درون Acticity_spl.xml  ؛ یک ImageView  ایجاد می‌کنیم و تنظمیات زیر را اضافه می‌کینم.

فقط قبل از هر کاری لوگو خودتونو درست کنید و سایزشو برای اکیتیویتون تنظیم کنید.

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:id=”@+id/activity_spl”
android:orientation=”vertical”
android:background=”#ffffff”
android:gravity=”center”

android:layout_width=”match_parent”
android:layout_height=”match_parent”
tools:context=”rena.myapplication.ActivitySpl”>
<ImageView
android:layout_width=”wrap_content”
android:src=”@drawable/lgogforlearn”
android:layout_height=”wrap_content” />
</LinearLayout>

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

قدم بعدی اینه که یه Style جدید ایجاد کنیم تا به ProgressBar مون تخصیص بدیم.

اول فایل colors.xml را باز میکینیم و یه colorAcent  جدید ایجاد می‌کنیم:

<color name=”colorSplAccent”>#a2fc43</color>

 

بعد تو فایل AndroidManifest.xml تم اکتیویتی اسپلش رو تغییر میدیم به تم جدید:

<activity android:name=”.ActivitySpl” android:theme=”@style/ActivitySpl”>

 

حالا تو فایل Styles.xml خط زیر را اضافه می‌کنیم:

<style name=”ActivitySpl” parent=”Theme.AppCompat.Light.NoActionBar”>

<item name=”colorPrimary”>@color/colorPrimary</item>
<item name=”colorPrimaryDark”>@color/colorPrimaryDark</item>
<item name=”colorAccent”>@color/colorSplAccent</item>

حالا یه ProgressBar  هم اضافه میکنیم تا در لحظه‌ای که برنامه میخواد اجرا بشه و تو اون چند ثانیه انتظار نمایش داده بشه.

<ProgressBar
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
style=”@style/Widget.AppCompat.ProgressBar”/>

 

بعد از نوشتن کدهامون یه AndroidManifest.xml را باز می‌کنیم تا تغییرات لازم را بدهیم.

اگه همه چیز را همونجور که بهتون گفتم انجام داده باشید باید اکتیویتی splash  باید اونجا تعریف شده باشه.

فقط موضوعی که هست اینه که چون اکتیویتی اسپلش باید قیل از همه اکتیویتی‌ها اجرا بشه باید جای MainAticvty را با ActivitySpl عوض کنیم تا اکتیویتی لانچر(LUNCHER ) ActivitySpl بشه.

 

<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”rena.myapplication”>

<application
android:allowBackup=”true”
android:icon=”@mipmap/ic_launcher”
android:label=”@string/app_name”
android:supportsRtl=”true”
android:theme=”@style/AppTheme”>
<activity android:name=”.ActivitySpl”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />

<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
<activity android:name=”.MainActivity”></activity>
<activity android:name=”.Main2Activity” />

</application>

</manifest>

 

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

 

به‌طور معمول تو قسمت اسپلش وقتی اون زمان انتظار برای بالا اومدن برنامه طی میشه کدهای مربوط به اتصال به دیتابیس و برقراری ارتباط با سرور نوشته میشه و در صورت نبودن هیچ مشکلی تو ارتباط برنامه بالا میاد و اکتیویتی اصلی اپلیکیشن باز میشه.

من اینجا فقط چند ثانیه توقف ایجاد شده و انتقال به MainActivity  را براتون می‌نویسم تا تو آموزشهای بعدی که اتصال به دیتابیس را آموزش دادم کدهای مربوطه را بهش اضافه کنیم.

تو ActivitySpl.java  کدهای زیر را برای ایجاد delay و باز کردن MainActivity می‌نویسیم:

 

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_spl);

int secondsDelayed = 1;
new Handler().postDelayed(new Runnable() {
public void run() {
startActivity(new Intent(G.context,MainActivity.class));
finish();
}
}, secondsDelayed * 5000);
}

کدی که اینحا نوشتیم کد بسیار ساده برای ایجاد  توقف چند ثانیه‌ای است. تون عدد 5000  که میبینید به میلی ثانیه است یعنی تو برنامه ما توقف 5 ثانیه خواهد بود .

 

ایجاد تولبار و اضافه کردن لوگو و آیکون به تولبار

ایجاد تولبار و اضافه کردن لوگو و آیکون  به تولبار

 

ما میخواهیم یه تولبار برای برنامه‌مون تعریف کنیم و چند تا آیکون مورد نیازمون رو بهش اضافه کنیم.

اول باید تم برنامه رو به حالت NoActionBar  تغییر بدیم تا تولبار پیش فرض رو نمایش نده.

فایل styles.xml  رو در فولدر res/values باز می‌کنیم و تم رو که DarkActionBar  را به NoActionBar  تغییر میدیم.

<resources>

<!– Base application theme. –>
<style name=”AppTheme” parent=”Theme.AppCompat.Light.NoActionBar”>
<!– Customize your theme here. –>
<item name=”colorPrimary”>@color/colorPrimary</item>
<item name=”colorPrimaryDark”>@color/colorPrimaryDark</item>
<item name=”colorAccent”>@color/colorAccent</item>
</style>

</resources>

در فولدر  layout فایلی یا لایه‌ای بنام toolbar.xml ایجاد می‌کنیم. و تگی بنام toolbar  تعریف میکنیم مانند کد زیر:

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical” android:layout_width=”match_parent”
android:layout_height=”match_parent”>
<android.support.v7.widget.Toolbar
android:layout_width=”match_parent”
android:background=”#ffcc00″
android:layout_height=”?attr/actionBarSize”>
<LinearLayout
android:orientation=”horizontal”
android:layout_width=”match_parent”
android:layout_height=”match_parent”>

</LinearLayout>
</android.support.v7.widget.Toolbar>
</LinearLayout>

 

بعد به اکتیویتی ActivityMain   میریم و toolbar  ایجاد شده را اضافه می‌کنیم.

<include layout=”@layout/toolbar”/>

تا اینجای کار ما یه تولبار اضافه کردیم با رنگ و مشخصاتی که خودمون تعریف کردیم.مانند تصویر زیر:

 

اون قسمت زرد رنگ بالای برنامه تولبار ایجاد شده توسط شماست.

بعد از ایجاد تولبار اختصاصی خودمون باید آیکون‌های مروبط به برنامه‌مون رو اضافه کنیم.

قبل از کد نویسی برید به سایتهای دانلود آیکون مثل flaticon.com و غیره  آیکون‌های مورد نیازتون رو دانلود کنید.

 

من لوگو سایت و این سه تا آیکون که بسیاری کاربردی هستن را با سایز و رنگ دلخواه خودم دانلود کردم و در فولدر drawable کپی کردم.

 

برای اینکه بتونید آیکونهای خودتونو دقیق تنظیم کنید پیشنهاد می‌کنم برای هر آیکون یک LinearLayout جداگانه بسازید و ImageView را داخل اونها قرار بدید.چون حتما تجربه کردید که تنظیم محل تصاویر کمی خسته کننده‌ ست.البته هر چی تجربه‌تون بیشتر بشه کار براتون ساده‌تر بشه.من دفعه اولی که اینمارو داشتم میکردم واقعا گیج شده بودم و به معنای واقعی داستم تو این کدها دست و پا میزدم.

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

 

 

<?xml version=”1.0″ encoding=”utf-8″?>
<?xml version=”1.0″ encoding=”utf-8″?>

<android.support.v7.widget.Toolbar android:layout_width=”match_parent”
android:background=”#f0e910″
android:layout_height=”?attr/actionBarSize”
xmlns:android=”http://schemas.android.com/apk/res/android”>

<LinearLayout
android:orientation=”horizontal”
android:gravity=”center”
android:layout_width=”match_parent”
android:layout_height=”match_parent”>

<LinearLayout
android:layout_width=”wrap_content”
android:orientation=”horizontal”
android:layout_weight=”1″
android:layout_height=”wrap_content”>

<LinearLayout
android:id=”@+id/linearFilnalBasket”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”>
<TextView
android:id=”@+id/txtBasketCont”
android:textSize=”16dp”
android:textColor=”#ffffff”
android:text=”1″
android:layout_width=”wrap_content”
android:layout_height=”wrap_content” />

<ImageView
android:id=”@+id/serch”
android:layout_width=”32dp”
android:src=”@drawable/settings”
android:scaleType=”fitCenter”
android:layout_height=”32dp” />

</LinearLayout>

<ImageView
android:layout_marginRight=”32dp”
android:scaleType=”centerCrop”
android:layout_width=”32dp”
android:layout_gravity=”center_vertical”
android:src=”@drawable/emails”
android:id=”@+id/hambergurMenu”
android:layout_height=”32dp” />

</LinearLayout>

<LinearLayout
android:layout_gravity=”right”
android:padding=”0dp”
android:orientation=”horizontal”
android:gravity=”left”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”>

<ImageView
android:layout_marginRight=”32dp”
android:scaleType=”fitCenter”
android:layout_width=”100dp”
android:id=”@+id/digikala”
android:src=”@drawable/aaaabi”
android:layout_height=”wrap_content” />

<ImageView
android:layout_width=”32dp”
android:src=”@drawable/help”
android:layout_marginRight=”32dp”
android:scaleType=”fitCenter”
android:layout_height=”32dp” />

</LinearLayout>

</LinearLayout>

</android.support.v7.widget.Toolbar>

فعال و غیر فعال کردن wifi و blutooth

فعال و غیر فعال کردن wifi و blutooth

قبل از هر اقدامی و نوشتن هر کدی ابتدا باید permission  ها را در فایل AndroidManifest.xml تعریف کنیم.

 

کدهای زیر را در فایل AndroidManifest.xml  کپی کنید:

<uses-permission android:name=”Android.permission.BLUETOOTH_ADMIN” />
<uses-permission android:name=”Android.permission.BLUETOOTH” />
<uses-permission android:name=”Android.permission.ACCESS_WIFI_STATE” />
<uses-permission android:name=”Android.permission.CHANGE_WIFI_STATE” />

خوب حالا برای فعال کردن این قابلیت‌ها میتونید از Checkbox  یا RadioButton  یا یه دکمه معمولی استفاده کنید تا کدهای مربوطه را برای فعال و غیرفعال کردنشون  در اونها قرار دهید.

ToggleButton btwifi;
ToggleButton btbluetooth;   protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_enable);
btwifi = (ToggleButton)findViewById(R.id.btwifi);
btbluetooth = (ToggleButton)findViewById(R.id.btbluetooth);

}

 

 

 

بعد از اینکه دکمه ها را تعریف کردیم باید آداپتورهای مربوط به Bluetooth  و Wifi  را هم تعریف بکنیم:

final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
final WifiManager manager=(WifiManager)getSystemService(WIFI_SERVICE);

 

حالا وقتی برنامه اجرا میشه باید ببینیم اگه bluetoth  و wifi  روشنه دکمه را به حالت روشن و اگه خاموشه به حالت روشن دربیاره یعنی همون On و Off  :

if (bluetoothAdapter.enable()){
btbluetooth.setChecked(true);
}else{
btbluetooth.setChecked(false);
}

if (manager.isWifiEnabled()){
btwifi.setChecked(true);
}else{
btwifi.setChecked(false);
}

 

بعد از این کنترل میرسیم به اینکه در صورت کلیک بر روی دکمه چه کاری باید انجام بشه :

btbluetooth.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (btbluetooth.getText().equals(“ON”)){
bluetoothAdapter.enable();
}else{
bluetoothAdapter.disable();
}
}
});

btwifi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (btwifi.getText().equals(“ON”)) {
manager.setWifiEnabled(true);
}else{
manager.setWifiEnabled(false);
}
}
});

 

 

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

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

استفاده از GPS در اندروید

استفاده از GPS  در اندروید

اگه میخواید استفاده از GPS  رو مطالعه کنید ابتدا  آموزش مربوط به استفاده از نقشه گوگل رو ببینید بعد بیایید سراغ این آموزش.

اگه شما نوع اکتیویتی را GoogleMap  انتخاب کرده باشید تو کدهای ایجاد شده در MainActivity   مکان پیش فرض شما در نقشه که با مختصات نقطه مورد نظر مقدار دهی میشه قسمتی داریم که میتونید نوع مکان نما را مشخص کنید.

LatLng tehran = new LatLng(32, 53);
mMap.addMarker(new MarkerOptions().position(tehran).title(“Marker in Iran”).snippet(“لواسان”).icon(BitmapDescriptorFactory.fromResource(R.drawable.placeholder)));

 

حالا برای استفاده از GPS از کد زیر را در متد OnCreate() می‌نویسیم:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

بر روی پیغام خطا کلیک کنید و خود اندروید استودیو یه سری کدهای دیگه اضافه می‌کنه؛ مبنی بر اینکه اگر موبایل شما ساپورت نکنه از برنامه خارج بشه.

کد اضافه شده در حقیقیت شرط کنترل ورژن اندروید شماست:

if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

return;
}

که ما خودمون خط زیر را اضافه میکنیم:

else{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}

کدهای مربوط به گرفتن مختصات به شکل زیره که تو متد onLocationCahnged()  باید اضافه بشه:

int latitude = (double) (location.getLatitude());
int longitude = (double) (location.getLongitude());

که می‌تونید با یه پیغام این مقادیر را نمایش بدید یا با دستور زیر تو log  نمایش بدید.

Log.i(“Geo_Location”, “Latitude: ” + latitude + “, Longitude: ” + longitude);

 

برای نشان دادن مکان فعلی شما در نقشه با نشانگر ابتدا متغیر زیر را تعریف می‌کنیم:

public LatLng myLoc;

بعد درادامه  متد onLocationChanged()  با مقداردهی متد LatLng()  با مقادیری که از GPS  گرفتیم بجای مختصات پیش فرض مکان فعلی شما در نقشه نشان داده می‌شود:

myLoc=new LatLng(latitude, longitude);

ومقادیر کدهای بعدی را به شکل زیر تغییر می‌دهیم:

mMap.addMarker(new MarkerOptions().position(myLoc).title(“Marker in Iran”).snippet(“محل فعلی”).icon(BitmapDescriptorFactory.fromResource(R.drawable.placeholder)));

mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myLoc,10));

 

 

در پایان کل کلاس MainActivity() که برای GPS  نوشته بودیم را براتون میزارم تا یه موقع این بتونید یک جا ازش استفاده کنید:

package rena.mymap;

import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, LocationListener {
public double latitude=0;
public double longitude=0;
private GoogleMap mMap;
public LatLng myLoc;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

LocationManager locationManager = (LocationManager) getSystemService(this.LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

return;
}else{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}

}

@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
LatLng tehran = new LatLng(32, 53);

}

@Override
public void onLocationChanged(Location location) {
latitude = (double) (location.getLatitude());
longitude = (double) (location.getLongitude());
myLoc=new LatLng(latitude, longitude);
mMap.addMarker(new MarkerOptions().position(myLoc).title(“Marker in Iran”).snippet(“لواسان”).icon(BitmapDescriptorFactory.fromResource(R.drawable.placeholder)));
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myLoc,10));
Log.i(“Geo_Location”, “Latitude: ” + latitude + “, Longitude: ” + longitude);
}

@Override
public void onStatusChanged(String s, int i, Bundle bundle) {

}

@Override
public void onProviderEnabled(String s) {

}

@Override
public void onProviderDisabled(String s) {

}

}

اتصال به سرور در اندروید

اتصال به سرور در اندروید

در ابتدا کارpermission  مربوطه را در فایل AndroidManifest.xml اضافه می‌کنیم:

<uses-permission android:name=”android.permission.INTERNET” />

 بعد  یک دکمه می‌سازیم تا کد مربوط به اتصال را درون آن بنویسیم.

 

و متغیر  و دکمه را در MainActivity  تعریف می‌کنیم:

 

public class MainActivity extends AppCompatActivity {
public static String dataServer=””;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnServer =(Button)findViewById(R.id.btnServer);
}
}

 

 

 

یک جاوا کلاس با نام Conn.java می‌سازیم:

import android.os.AsyncTask;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
* Created by alizadeh-ma on 01/03/2018.
*/

public class Conn   extends AsyncTask{
public String link=””;

public Conn(String link)  {
this.link=link;
}

@Override
protected Object doInBackground(Object[] objects){
try{

          URL url=new URL(link);
URLConnection connection =url.openConnection();
BufferedReader bufferedreader =new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder stringBuilder=new StringBuilder();
String data = null;
while ((data=bufferedreader.readLine())!=null){
stringBuilder.append(data);
}
MainActivity.dataServer =stringBuilder .toString();
}
catch (Exception e){
e.printStackTrace();
}
return null;
}
}

حالا کد اتصال را در هنگام کلیک دکمه فراخوانی می‌کنیم:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
public static String dataServer=””;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Conn(“http://webenik.com/android/index.php”).execute();
Button btnServer =(Button)findViewById(R.id.btnServer);
btnServer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// کدهای بعد از اتصال
}
});

             }
}

ارسال و دریافت SMS در اندروید

ارسال و دریافت SMS در اندروید

 

اولین کاری  که برا ی نوشتن کد مربوط به ارسال sms باید انجام داد اضافه کردن permission مربوطه به فایل AndroidManifest.xml است.

: کدهای زیر را رای ارسال و دریافت اس ام اس اضافه میکنیم

<uses-permission android:name=”android.permission.SEND_SMS” />

<uses-permission android:name=”android.permission.RECEIVE_SMS” />

در اکتیویتی مربوطه دو  EditText  برا ی گرفتن شماره تلفن و پیغامی که میخوهید ارسال کنید و همچنین دکمه‌ای برای ارسال ایجاد می‌کنیم. مانند شکل زیر:

و کدهای زیر به اکتیویتی اضافه می‌کنیم.

public class MainActivity extends Activity {

   private static final int MY_PERMISSIONS_REQUEST_SEND_SMS =0 ;

   Button sendBtn;

   EditText txtphoneNo;

   EditText txtMessage;

   String phoneNo;

   String message;

   @Override

   protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

      sendBtn = (Button) findViewById(R.id.btnSendSMS);

      txtphoneNo = (EditText) findViewById(R.id.editText);

      txtMessage = (EditText) findViewById(R.id.editText2);

      sendBtn.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {

            phoneNo = txtphoneNo.getText().toString();

            message = txtMessage.getText().toString();

            smsManager.sendTextMessage(phoneNo, null, message, null, null);

         }

      });

   }

البته این کد که نوشتیم ساده‌ترین شکل ارسال اس ام اس‌ه.

راه درست‌تر و حرفه‌ای‌تر اینه که اول تو برنامه چک کنیم ببینیم آیا دسترسی مورد نظر وجود داره یا نه .اگه بود که اس ام اس ارسال بشه و گرنه از کاربر مجوزشو بگیره بعد اس ام اس را ارسال کنه. که کدش به شکل زیر نوشته میشه.

protected void sendSMSMessage() {

      phoneNo = txtphoneNo.getText().toString();

      message = txtMessage.getText().toString();

      if (ContextCompat.checkSelfPermission(this,

         Manifest.permission.SEND_SMS)

         != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale(this,

               Manifest.permission.SEND_SMS)) {

            } else {

               ActivityCompat.requestPermissions(this,

                  new String[]{Manifest.permission.SEND_SMS},

                  MY_PERMISSIONS_REQUEST_SEND_SMS);

            }

      }

   }

 

   @Override

   public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {

      switch (requestCode) {

         case MY_PERMISSIONS_REQUEST_SEND_SMS: {

            if (grantResults.length > 0

               && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                  SmsManager smsManager = SmsManager.getDefault();

                  smsManager.sendTextMessage(phoneNo, null, message, null, null);

                  Toast.makeText(getApplicationContext(), “SMS sent.”,

                     Toast.LENGTH_LONG).show();

            } else {

               Toast.makeText(getApplicationContext(),

                  “SMS faild, please try again.”, Toast.LENGTH_LONG).show();

               return;

            }

         }

      }

   }

}

 

این متد (sendSMSMessage()) را تو اون قسمتی که ما کد ارسال اس ام اس رو نوشتیم فراخوانی می‌کنیم.

 

خوب میرسیم به دریافت اس ام اس. این بخش کمی داستانش فرق میکنه. اول باید با یه مفهومی به نام Broadcast آشنا بشیم.

BroadcastReceiver در حقیقت سرویس و یا امکانیست که شما آنرا مامور می‌کنید در صورت بروز یک رخداد یک عکس‌العملی نشان دهد.می‌تونید برای درک بهتر با استراق سمع مقایسه کنید.یعنی منتظر میشینه به محض اینکه یک اتفاق خاص مد‌نظرما افتاد یک کاری انجام دهد.

BroadcastReceiver هم یه همچین حالتیه.مثلا شما تعریف می‌کنید که اگر مثلا گوشی شما در معرض امواج وای‌فای قرار گرفت از شما سوال کنه که می‌خواهید به آن متصل بشید یا نه؟کل موضوع همینه.حالا می‌خواهیم با BroadcastReceiver یه برنامه بنویسیم به محض اینکه یک پیغام به گوشی آمد پیام بده.حال سوالی که پیش می‌آید اینه که آیا لازمه برنامه ما برای اینکه پیام را دریافت کند باید همیشه در حال اجرا باشد.نه نیاز نیست .فقط کافیه یکبار برنامه نصب بشه و یکبار اجرا بشه.حالا اگر برنامه را ببندید BroadcastReceiver در حفظه گوشی آماده باشه.اینکه شما چه برخوردی با دریافت پیام بکنید به خودتان بستگی دارد.مثلا می‌تونید تعریف کنید که اگر یک اس‌ام‌اس از یک شماره خاص اومد آلارم اخطار بده و یا نمایش نده و یا هر کار دیگه‌ای.

خوب میریم سراغ کد مربوط به اینکار:

یه کلاس جدید با نام دلخواه خودتون ایجاد می‌کنید.ما اینجا اسمشو میذاریم Receiver.

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class Receiver extends BroadcastReceiver  {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(G.context,”SMS RECEIVE”,Toast.LENGTH_LONG).show();
}
}

ابتدا باید این کلاس را در فایل AndroidManifest.xml تعریف کنیم و کدهای زیر را به تگ  application اضافه کنیم.

<receiver android:name=”.Receiver” >
<intent-filter >
<action android:name=”android.provider.Telephony.SMS_RECEIVED”></action>
</intent-filter>
</receiver>

 

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

خوب داخل همون کلاس Receiver که ساخته بودیم کدهای زیر را قرار می‌دهیم.

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class Receiver extends BroadcastReceiver  {

@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();

     if (bundle!=null){
Object[] objects=(Object[]) bundle.get(“”);
for(int i=0 ; i < objects.length;i++){
SmsMessage message= SmsMessage.createFromPdu((byte[])objects[i]);
String num=message.getDisplayOriginatingAddress();
String mess=message.getDisplayMessageBody();
Toast.makeText(G.context,”  “+num+” “+mess,Toast.LENGTH_LONG).show();
}
}

}

 

 

 

 

فعال کردن قالب متریال دیزاین در اندروید استودیو

فعال کردن قالب  متریال دیزاین در اندروید استودیو

 

برای اینکه بتوانید تم material design را تو اپلیکیشن اندرویدی که دارید می‌نویسید فعال کنید و ازش استفاده کنید مراحل زیر را دنبال کنید:

  1. یک پروژه جدید تو اندروید استودیو ایجاد کنید.زمانیکه نوع اکیتیویتی را از شما سوال می‌کند Blank Activity را انتخاب بکنید.

 

  1. gradle را از ستون کناری اندروید استودیو باز کنید و کتابخانه‌ای که android design را پشتیبانی می‌کند به نام com.android.support:design:23.0.1 را اضافه کنید.مانند کد زیر:

build.gradle

dependencies {

compile fileTree(dir: ‘libs’, include: [‘*.jar’])

compile ‘com.android.support:appcompat-v7:23.0.1’

compile ‘com.android.support:design:23.0.1’

}

و همینطور اینکار را میتوان هم در Project Structure  انجام داد مانند تصویر زیر:

 

 

که کتابخانه  com.android.support:design:23.1.1  را از با زدن دکمه + از لیست انتخاب کرده و اضافه میکنیم و پنجره را می‌بندیم.

 

  1. فایل xml را از مسیر res values باز کنید و مقادیر زیر را به آن اضافه کنید.

colors.xml

<?xml version=”1.0″ encoding=”utf-8″?>

<resources>

<color name=”colorPrimary”>#125688</color>

<color name=”colorPrimaryDark”>#125688</color>

<color name=”textColorPrimary”>#FFFFFF</color>

<color name=”windowBackground”>#FFFFFF</color>

<color name=”navigationBarColor”>#000000</color>

<color name=”colorAccent”>#c8e8ff</color>

</resources>

  1. فایل xml را از مسیر res values باز کنید و استایل‌های زیر را به آن اضافه کنید.

من نام تم متریال دیزاین را MyMaterialTheme گذاشتم.

styles.xml

<resources>

<style name=”MyMaterialTheme” parent=”MyMaterialTheme.Base”>

</style>

<style name=”MyMaterialTheme.Base” parent=”Theme.AppCompat.Light.DarkActionBar”>

<item name=”windowNoTitle”>true</item>

<item name=”windowActionBar”>false</item>

<item name=”colorPrimary”>@color/colorPrimary</item>

<item name=”colorPrimaryDark”>@color/colorPrimaryDark</item>

<item name=”colorAccent”>@color/colorAccent</item>

</style>

</resources>

  1. حالا در همون فولدر res ؛ فولدری با نام values-v21 بسازید و  فایل xml را در فولدر جدید ایجاد کنید.

 

و مقادر زیر را در آن قرار دهید.

styles.xml

<resources>

<style name=”MyMaterialTheme” parent=”MyMaterialTheme.Base”>

<item name=”android:windowContentTransitions”>true</item>

<item name=”android:windowAllowEnterTransitionOverlap”>true</item>

<item name=”android:windowAllowReturnTransitionOverlap”>true</item>

<item name=”android:windowSharedElementEnterTransition”>@android:transition/move</item>

<item name=”android:windowSharedElementExitTransition”>@android:transition/move</item>

</style>

</resources>

 

  1. درنهایت فایل AndroidManifest.xml را باز کنید و مقدار android:theme را به تم جدید تغییر دهید.

 

 

android:theme=”@style/MyMaterialTheme”

AndroidManifest.xml

<?xml version=”1.0″ encoding=”utf-8″?>

<manifest xmlns:android=”http://schemas.android.com/apk/res/android

package=”info.androidhive.materialtabs” >

<application

android:allowBackup=”true”

android:icon=”@mipmap/ic_launcher”

android:label=”@string/app_name”

android:theme=”@style/MyMaterialTheme” >

<activity

android:name=”.activity.MainActivity”

android:label=”@string/app_name” >

<intent-filter>

<action android:name=”android.intent.action.MAIN” />

<category android:name=”android.intent.category.LAUNCHER” />

</intent-filter>

</activity>

</application>

</manifest>

 

 

اپلیکیشن را اجرا کنید و رنگ  notification bar را مشاهد کنید.اگر رنگ notification bar تغییر کرده باشد معنی آن اینست که قالب متریال دیزاین با موفقیت اعمال شده است.

 

 

اضافه کردن دکمه شناور به اکتیویتی

اضافه کردن دکمه شناور(Flaoting button) به اکتیویتی

یا دکمه شناور یکی از جالبترین و کاربردی‌ترین امکاناتیه که در متریال دیزاین اومده و اضافه شده.

برای اضافه کردن دکمه شناور به اکتیویتی ابتدا باید کتابخانه مربوطه را به پروژه اضاف کنیم. اینکار را میتوان هم در Project Structure  انجام داد مانند تصویر زیر:

 

که کتابخانه  com.android.support:design:23.1.1  را از با زدن دکمه + از لیست انتخاب کرده و اضافه میکنیم و پنجره را می‌بندیم.

و هم میتوان در قسمت راست اندروید استودیو و Gradle Scripts   ؛ Build Gradle  را باز کرده و در بخش dependencies مانند نمونه زیر اضافه کرد.

 

build.gradle

dependencies {

compile fileTree(dir: ‘libs’, include: [‘*.jar’])

testCompile ‘junit:junit:4.12’

compile ‘com.android.support:appcompat-v7:23.1.1’

compile ‘com.android.support:design:23.1.1’

}

بعد از اضافه نمون کتابخانه که احتمالا زمان زیادی از شما بگیرد کد زیر را در اکتیویتی که میخواهم دکمه در آن باشد قرار می‌دهیم.

<android.support.design.widget.FloatingActionButton

android:id=”@+id/fab”

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:layout_gravity=”bottom|end”

android:layout_margin=”@dimen/fab_margin”

android:src=”@android:drawable/ic_dialog_email” />

اگه فرض کنیم اکتیویتی ما شامل دو قسمت تولبار و بدنه باشه ما دکمه شماور را در بیرون از کد مربوط به تولبار قرار می‌دهیم مانند کد زیر:

<?xml version=”1.0″ encoding=”utf-8″?>

<android.support.design.widget.CoordinatorLayout xmlns:android=”http://schemas.android.com/apk/res/android”

xmlns:app=”http://schemas.android.com/apk/res-auto”

xmlns:tools=”http://schemas.android.com/tools”

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:fitsSystemWindows=”true”

tools:context=”info.androidhive.fab.MainActivity”>

<android.support.design.widget.AppBarLayout

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:theme=”@style/AppTheme.AppBarOverlay”>

<android.support.v7.widget.Toolbar

android:id=”@+id/toolbar”

android:layout_width=”match_parent”

android:layout_height=”?attr/actionBarSize”

android:background=”?attr/colorPrimary”

app:popupTheme=”@style/AppTheme.PopupOverlay” />

</android.support.design.widget.AppBarLayout>

<include layout=”@layout/content_main” />

<android.support.design.widget.FloatingActionButton

android:id=”@+id/fab”

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:layout_gravity=”bottom|end”

android:layout_margin=”@dimen/fab_margin”

android:src=”@android:drawable/ic_dialog_email” />

android:elevation=”8DP”

</android.support.design.widget.CoordinatorLayout>

 

میشه برای زیبایی دکمه یه سری خصوصیات بهش اضافه کرد مثل سایه(elevation) و مارجین(layout_margin).و همینطور تنظیمات اون طوری نوشته شده که گوشه پایین سمت راست صفحه قرار بگیره.شما می‌تونید هر جایی که خواستید اونو قرار بدی.

تعریف  Id  که ضروریه. بخاطر اینکه برای این دکمه می‌خواهیم با فشردن اون توسط کاربر یه عملیایت انجام بشه.

 

 

خوب حالا برای نوشتن کدی که موقع کلیک شدن به یه اکتیویتی دیگه‌ای منتقل بشه .

به کد جاوا این اکتیویتی می‌ریم .

کد زیر فقط کد مربوط به کلیک دکمه شناوره و کد کامل اکتیویی هم در ادامه براتون گذاشتم.

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

fab.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

// Click action

Intent intent = new Intent(MainActivity.this, NewMessageActivity.class);

startActivity(intent);

}

});

MainActivity.java

package info.androidhive.fab;

import android.content.Intent;

import android.os.Bundle;

import android.support.design.widget.FloatingActionButton;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.Toolbar;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

public class MainActivity extends AppCompatActivity {

private FloatingActionButton fab;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

setSupportActionBar(toolbar);

fab = (FloatingActionButton) findViewById(R.id.fab);

fab.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Intent intent = new Intent(MainActivity.this, NewMessageActivity.class);

startActivity(intent);

}

});

}

}

 

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

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

تو این آموزش قصد دارم نحوه استفاده از نقشه رو تو برنامه اندرویدی براتون آموزش بدم.

اگه تصمیم گرفتید تو برنامه‌تون از نقشه گوگل استفاده کنید این آموزش برای شما طراحی شده .چون چند تا شرکت دیگه هستن که نقشه ارائه میدن ولی به نظرم صرفنظر از ایراد نقشه گوگل که همون آنلاین بودنه بهترین و به‌روزترینشون نقشه گوگله.

برنامه‌نویس برای اینکه بتونه از نقشه گوگل تو برنامه‌اش استفاده کنه باید یه API Key از سایت اندروید بگیره.این کلید در حقیقت رابط برنامه شما با نقشه گوگله. یعنی نقشه گوگل از طریق این کلید برنامه شما رو شناسایی می‌کنه.بعد از شناسایی شماست که اجازه دسترسی به برنامه شما میده.

پس برای شروع اول فیلترشکنتون رو فعال کنید چون این آدرس برای ما ایرانیها فیلتره.

به آدرس https://developers.google.com/maps  برید.

مثل شکل زیر آیکون اندریود را انتخاب کنید .

 

بعد از آن به صفحه دیگری منتقل می‌شوید GET KEY  را بزنید.

 

بعد از تایید مانند تصویر زیر یه کلید به شما میده که می‌تونید تو برنامه‌تون ازش استفاده کنید.

 

 

البته گوگل الان دیگه مثل قبل سخت‌گیری نمیکنه چون قبلا برای هر پروژه‌تون باید یه API KEY  می‌گرفتید ولی الان هر برنامه‌نویس میتونه یه بار کلید رو بگیره و تو چند تا برنامه استفاده کنه. ولیکن گوگل این امکان رو گذاشته که شما برای امنیت بیشتر برای هر پروژه API KEY  مختص اون پروژه بگیرید.که چگونگی اینرو براتون توضیح میدم.

من هم به شما توصیه می‌کنم اینکار رو بکنید .

تو تصویر بالا یه گزینه هست به اسم API Console. با انتخاب این گزینه وارد صفحه جدیدی میشوید که میتونید این API  KEY  که گرفتی رو جوری تنظیم کنی که فقط تو برنامه خودت و تو برنامه‌هایی که دوست داری فعال باشه. با این کار امنیت برنامه‌تون رو بالا می‌برید.

 

 

تو این صفحه گزینه android app  رو انتخاب می‌کنید و نام پکیج برنامه‌تون رو

(مثلا: org.com.myapp) وارد میکنید.یه SHA-1 certificate fingerprint   هم میخواد که طرز بدست آوردن اون رو هم براتون آموزش میدم.

خود این سایت میگه به آدرسی که ذکر شده برید تا SHA1  رو بهتون بده. تو تصویر هم علامت زدم.

keytool -list -v -keystore mystore.keystore

به command prompt  برید و دستور زیر رو تایپ کنید.

 

 

Keytool -list -v -keystore “%USERPROFILE%\.android\debug.keystore” -alias androiddebugkey -storepass android -keypass android

برای بعضی از دوستان اگه همین دستور رو بزنید ممکنه SHA1 رو بهشون بده ولی برای بعضی ممکنه جواب نده.اگه پاسه درستی به این دستور تو سیستمتون نگرفتید احتمالا مسیر جاوا ست نشده برای اینکار دستور زیر رو اجرا کنید بعد دستور بالا رو دوباره اجرا کنید.

Set PATH=%PATH%; C:\Program Files (x86)\Java\jdk1.9.0\bin

در حقیقت مسیر جاوا رو باید براش ست کنید جاوا من تو این مسیر بود شما هم باید چک کنید ببینید تو چه مسیریه و اونو اینجا بنویسید.

اگه همه چی درست پیش رفت نتیجه‌ای مثل تصویر زیر به شما خواهد داد.

 

 

کد رو کپی کنید و در قسمت SHA1  تو صفحه  API CONSOLE  اضافه کنید.از حالا به بعد این API KEY  فقط با این پکیجی که شما مشخص کردید کار می‌کنه و هیچ کس دیگه‌ای نمیتونه از این API LEY  استفاده کنه و این امنیت برنامه شما رو به شدت افزایش میده.

حالا اندروید استودیو را باز کنید و پروژه‌ای جدید بسازید و موقعی که از شما نوع اکتیویتی رو سوال می‌کنه، Google maps Activity  رو انتخاب کنید تا کارتون راحت باشه و بسیاری از کد‌های پیش فرض رو خودش براتون ایجاد می‌کنه.

بعد از اینکه پروژه‌تون باز شد فایل google_maps_api.xml  رو باز کنید و در قسمت goggle_maps_key   ؛ API KEY  خودتونو قرار بدید.

بعد به فایل AndroidManifest.xml   پروژه برید و دسترسی‌های زیر رو بهش اضافه کنید.

Android.permission.ACCESS_FINE_LOCATION

Android.permission.ACCESS_COARSE_LOCATION

Android.permission.ACCESS_INTERNET

Android.permission.WRITE_EXTERNAL_STORAGE

بعد تو Build.Gradle   کتابخانه زیر رو بهش اضافه کنید.

Compile ‘com.google.android.gms:play-services-maps:10.2.0’

یادتون باشه برای اینکه اندروید استودیو بتونه کتابخانه ها رو از گوگل بگیره باید فیلتر شکنتون روشن باشه.

کار تمومه اگه پروژه رو اجرا کنید نقشه رو نمایش میده.

تجربیات خودتون در رابطه با استفاده از نقشه گوگل و نقشه های دیگه برای دوستانتون هم تو قسمت نظرات بنویسید.

 

چون همه چیز را همگان دانند.