برترین های انجمن

  1. Farzad Sarseifi

    Farzad Sarseifi

    مدیریت انجمن


    • امتیاز: پسندیدن (Likes)

      172

    • تعداد ارسال ها

      2,281


  2. Omid Zakeri

    Omid Zakeri

    مدیر انجمن


    • امتیاز: پسندیدن (Likes)

      54

    • تعداد ارسال ها

      148


  3. mehrdadmmb2

    mehrdadmmb2

    توسعه دهنده اندروید


    • امتیاز: پسندیدن (Likes)

      35

    • تعداد ارسال ها

      143


  4. شاهرخ جهان زاده

    شاهرخ جهان زاده

    مدیر انجمن


    • امتیاز: پسندیدن (Likes)

      35

    • تعداد ارسال ها

      110



Popular Content

Showing most liked content since ۱۷/۰۶/۲۴ in all areas

  1. 8 likes

    نگارش 1.0.0

    997 دانلود

    سورس اندروید استودیو فروشگاه اینترنتی + وب سایت + وبسرویس زبان ها جاوا + php

    رایگان

  2. 5 likes
    دانلود Build Tools 26.0.2 برای اندروید استودیو 3 یکی از ابزهای مورد نیاز برنامه نویسان اندروید در ورژن 3 اندروید استودیو داشتن build tools 26.0.2 میباشد که در اندروید استودیو 3 موجود نمیباشد و باید بطور جداگانه دانلود شده و در فولدر build tools اندروید استودیو قرار داده شود دریافت از انجمن اندروید ایران 26.0.2.zip
  3. 5 likes
    با سلام در این تاپیک با نحویه کد و دیکد کردن اطلاعات بین اندروید وسرور آشنا میشوید و میتوانید اطلاعات رو به صورت امن بین کلاینت و سرور رد و بدل کنید. اول این کلاس php را به سرور اضافه کنید <?php class MCrypt { private $iv = 'fedcba9876543210'; #Same as in JAVA private $key = '0123456789abcdef'; #Same as in JAVA function __construct() { } function encrypt($str) { //$key = $this->hex2bin($key); $iv = $this->iv; $td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv); mcrypt_generic_init($td, $this->key, $iv); $encrypted = mcrypt_generic($td, $str); mcrypt_generic_deinit($td); mcrypt_module_close($td); return bin2hex($encrypted); } function decrypt($code) { //$key = $this->hex2bin($key); $code = $this->hex2bin($code); $iv = $this->iv; $td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv); mcrypt_generic_init($td, $this->key, $iv); $decrypted = mdecrypt_generic($td, $code); mcrypt_generic_deinit($td); mcrypt_module_close($td); return utf8_encode(trim($decrypted)); } protected function hex2bin($hexdata) { $bindata = ''; for ($i = 0; $i < strlen($hexdata); $i += 2) { $bindata .= chr(hexdec(substr($hexdata, $i, 2))); } return $bindata; } } و بعد از اون این کلاس جاوا رو به پروژه خودتون اضافه کنید import java.security.NoSuchAlgorithmException; import javax.crypto.Cipher; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class MCrypt { private String iv = "fedcba9876543210";//Dummy iv (CHANGE IT!) private IvParameterSpec ivspec; private SecretKeySpec keyspec; private Cipher cipher; private String SecretKey = "0123456789abcdef";//Dummy secretKey (CHANGE IT!) public MCrypt() { ivspec = new IvParameterSpec(iv.getBytes()); keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES"); try { cipher = Cipher.getInstance("AES/CBC/NoPadding"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public byte[] encrypt(String text) throws Exception { if(text == null || text.length() == 0) throw new Exception("Empty string"); byte[] encrypted = null; try { cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); encrypted = cipher.doFinal(padString(text).getBytes()); } catch (Exception e) { throw new Exception("[encrypt] " + e.getMessage()); } return encrypted; } public byte[] decrypt(String code) throws Exception { if(code == null || code.length() == 0) throw new Exception("Empty string"); byte[] decrypted = null; try { cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); decrypted = cipher.doFinal(hexToBytes(code)); } catch (Exception e) { throw new Exception("[decrypt] " + e.getMessage()); } return decrypted; } public static String bytesToHex(byte[] data) { if (data==null) { return null; } int len = data.length; String str = ""; for (int i=0; i<len; i++) { if ((data[i]&0xFF)<16) str = str + "0" + java.lang.Integer.toHexString(data[i]&0xFF); else str = str + java.lang.Integer.toHexString(data[i]&0xFF); } return str; } public static byte[] hexToBytes(String str) { if (str==null) { return null; } else if (str.length() < 2) { return null; } else { int len = str.length() / 2; byte[] buffer = new byte[len]; for (int i=0; i<len; i++) { buffer[i] = (byte) Integer.parseInt(str.substring(i*2,i*2+2),16); } return buffer; } } private static String padString(String source) { char paddingChar = ' '; int size = 16; int x = source.length() % size; int padLength = size - x; for (int i = 0; i < padLength; i++) { source += paddingChar; } return source; } } حا الا که کلاس های بالا رو به پروژه و سرور اضافه کردید نوبت میرسه به رد بدل کردن اطلاعات میشه برای وارد کردن کلاس php به فایل های php از include استفاده کنید به این صورت توجه کنید که لاس در کنار فایل ها باید باشه و گر نه باید مسیر کامل رو هم بدید include('myclass.php'); توی دو کلاس دو متغییر وجود دارند که باید در هر دو کلاس متغییر (دو متغییر در جاوا و دوتا در سمت سرور ) شبیه به هم باشند و گر نه شناسای مقادیر کد شده مشکل و عملا دیکد نمیشوند این متغییر ها قدرت کد شدن داده رو افزایش می دهند متغییر ها در جاوا private String iv = "fedcba9876543210";//Dummy iv (CHANGE IT!) private String SecretKey = "0123456789abcdef";//Dummy secretKey (CHANGE IT!) متغییر ها در سمت php private $iv = 'fedcba9876543210'; #Same as in JAVA private $key = '0123456789abcdef'; #Same as in JAVA خب کد و دیکد کردن مقدار در جاوا رو به این صورت تعریف میکنیم اول میای یک شیئ از کلاس ایجاد میکنیم mcrypt = new MCrypt(); اول کد اطلاعات رو کد میکنیم بعد مقادیر رو به صورت bytesToHex در یک متغییر قرار میدیم و بعد به وسیله encrypt مقدار رو کد میکنیم (این مقدار کد شده هستش) String encrypted = MCrypt.bytesToHex( mcrypt.encrypt("Text to Encrypt") ); برای دیکد کردن کافیه متغیر رو به درون تابع decrypt قرار بدیم String decrypted = new String( mcrypt.decrypt( encrypted ) ); کا ما در سمت اندروید تموم شد و مقدار کد و دیکد کردیم کد های تکمیلی جاوا mcrypt = new MCrypt(); /* Encrypt */ String encrypted = MCrypt.bytesToHex( mcrypt.encrypt("Text to Encrypt") ); /* Decrypt */ String decrypted = new String( mcrypt.decrypt( encrypted ) ); خب حالا سمت php باز میایم یک شیئ ایجاد میکنیم $mcrypt = new MCrypt(); ابتدا میایم مقدار رو کد میکنیم $encrypted = $mcrypt->encrypt("Text to encrypt"); سپس همون مقدار رو نیز دیکد میکنیم $decrypted = $mcrypt->decrypt($encrypted); کد های تکمیلی php $mcrypt = new MCrypt(); #Encrypt $encrypted = $mcrypt->encrypt("Text to encrypt"); #Decrypt $decrypted = $mcrypt->decrypt($encrypted); امید وارم آموزش مفیدی برای شما باشه من الله التوفیق
  4. 4 likes
    به تازگی گوگل در کنفرانس سال ۲۰۱۷ از ORM خود به نام Google Room رونمایی کرد که هدف این پست هم آموزش کار با این کتابخونه هست. فواید استفاده از Room بهبود امنیت دسترسی آسان پیاده سازی سریع تمام عملیات های اصلی DML به غیر از Select با استفاده از Annotation ها قابل استفاده می باشد البته دستور Select و دیگر کوئری های پیچیده را هم میتونید به راحتی پیاده سازی کنید. در ویدیو قسمت اول کار با سه کامپوننت اصلی Room یعنی DAO, Entityو Database و به همراه عملیات های مختلف یاد میگیریم. لینک دانلود مستقیم
  5. 4 likes
    سلام دوست عزیز 1. بله میتونه از طریق همون فایل php باشه. و یا زبان های دیگه. 2. توکن یک شناسه منحصر به فرد هستش که بین گوشی و سرور قرار داده میشه برای تشخیص صحت درخواست ارسالی از سمت سرور. 3. تو کدهاتون (به زبان جاوا) سعی کنید یوزر و پسورد رو به صورت String قرار ندین. بهتره از Char[ ] استفاده کنید. 4. و اینکه توکن میتونید encrypt کنید و تو گوشی نگهدارین و البته برای ارتباط با سرور هم اطلاعات رو به صورت encrypt شده بفرستین. 5. برای دیکامپایل نشدن کدها یا سختتر شدن دیکامپایل فایل خروجیتون بهتره زمانی که apk میسازید حتما proguard رو فعال کنید
  6. 4 likes

    نگارش 1.0.0

    20 دانلود

    کتابخانه (ShowcaseView ) برای برجسته سازی و نمایش بخش های خاص برنامه ها به کاربر با پوشش متمایز و جذاب طراحی شده است. این کتابخانه عالی است برای اشاره به نقاط مورد علاقه برای کاربران، حرکات، و یا موارد مبهم مفید است.

    رایگان

  7. 4 likes
    در این تاپیک آموزشی، از ابتدا آموزش برنامه نویسی اندروید را شروع خواهیم نمود ،یکی از مشکلات برنامه نویسان اندروید کم یا نبود آموزش های اصولی اندروید میباشد ،بر همین اساس تصمیم بر آن داشتیم بطور جامع آموزش های فارسی را منتشر نماییم . بیشتر کاربران انجمن برنامه نویسی اندروید، کم و بیش با این مشکل رو به رو بوده اند که به چه صورتی اندروید را شروع کنند و شروع به آموزش اندروید بگیرند.بر این اساس در این تاپیک بطور جامع آموزش های اندروید قرار داده خواهد شد.. این تاپیک آموزشی هر چند روز یکبار بروز رسانی خواهد شد و آموزش ها جدیدتر قرار داده خواهد شد منو در اندروید ذخیره سازی اطلاعات در اندروید فرگمنت و گوگل مپ در اندروید وب سرویس در اندروید آموزش های متریال دیزاین در اندروید آموزش های کاتلین : با تشکر انجمن برنامه نویسی اندروید-پی سی دروید
  8. 3 likes
    سلام امروز میخوایم کار با کتابخونه volley رو با هم یاد بگیریم.با افزودن این کتابخونه میتونید ارتباط با کد php که در سرورتون نوشتید رو سریع تر و آسون تر کنید. به این صورت که اول با این کد به پروژه خودتون اضافش کنید. compile 'com.mcxiaoke.volley:library:1.0.19' اگه مشکلی در اضافه کردن این کتابخونه دارید کلیک کنید. خب بریم سراغ کد نویسی کد های زیرو بذارید اونجایی که قراره ارتباط بر قرار شه RequestQueue queue= Volley.newRequestQueue(this); StringRequest myRequest=new StringRequest(Request.Method.POST, "My link", new Response.Listener<String>() { @Override public void onResponse(String response) { Toast.makeText(LogReg.this, response, Toast.LENGTH_SHORT).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(LogReg.this, "خطا در ارتباط با سرور", Toast.LENGTH_SHORT).show(); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String , String> params = new HashMap<>(); params.put("username", "My Username"); params.put("password","My Password"); return params; } }; queue.add(myRequest); توضیحات: اولا که اونجایی که نوشتم Request.Method.POST در حقیقت داریم متد ارسال اطلاعات به فایل رابطمون رو تعیین میکنیم.قسمت mylink هم لینک فایل رو قرار میدید.تابع onResponse در صورت موفقیت آمیز بودن اجرا میشه و متن بازگشتی داخل متغیر response هست همچنین در صورتی که مشکل باشه تابع onErrorResponse اجرا میشه که با دستور error.tostring() به متن خطا دسترسی خواهید داشت.دو کد params.put هم مقادیرو ارسال میکنن(پارامتر اول اسم متغیر و دومی هم مقدار) و کد آخر هم در حقیقت درخواست ما که اسمش myRequest هستو تو صف ارسال (queue) قرار میده. تمام
  9. 3 likes
    کتابخانه Lottie در اندروید آیا همیشه نمایش انیمیش برای شما یک دغدغه بوده؟ چجوری انیمیشن های حرفه ای رو در اندروید نمایش دهیم؟؟ راه حل اینجاس ؟ Lottie کتابخانه Lottie در اندروید این امکان را فراهم می آورد که انیمیشن های افکتر افکت را با خروجی json نمایش دهید که باعث میشود حجم اپلیکیشن بسیار پایین باشد و از سرعت نیز به مشکلی برخورد نکنید لینک اصلی کتابخانه https://github.com/airbnb/lottie-android دانلود Dependency compile 'com.airbnb.android:lottie:2.5.0-rc1' دانلود کتابخانه از سرور انجمن اندروید ایران lottie-android-master.zip
  10. 3 likes
    توی این پست میخوایم طریقه کار با دیتابیس خارجی رو اموزش بدیم. برای این کار با نرم افزار SQLite Expert Personal یا هر نرم افزاری که راحت بودین دیتابیس و درست می کنیم. توی این برنامه دیتابیس ExternalDB رو با یک جدول به نام tbl1 و دو فیلد به نامهای Id و Name ایجاد کردیم. و داده های مورد نظر را توی جدول وارد میکنیم. کارمون با دیتابیس خارجی تموم شد حالا برنامه نویسی رو شروع می کنیم. پروژه جدیدی ایجاده کرده و دیتابیسی که درست کرده بودیم و توی پوشه asset قرار میدیم. فایل Database.java رو ایجاد کرده و کد زیر رو توی اون تایپ می کنیم. package com.p30droid.externaldatabase; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; public class Database extends SQLiteOpenHelper { String DB_PATH = null; public static String DB_NAME = "ExternalDB"; private SQLiteDatabase myDataBase; private final Context myContext; /** * Constructor Takes and keeps a reference of the passed context in order to * access to the application assets and resources. * * @param context */ public Database(Context context) { super(context, DB_NAME, null, 2); this.myContext = context; DB_PATH = "/data/data/" + context.getPackageName() + "/" + "databases/"; } public void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if (dbExist) { // do nothing - database already exist } else { // By calling this method and empty database will be created into // the default system path // of your application so we are gonna be able to overwrite that // database with our database. this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { throw new Error("Error copying database"); } } } private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { String myPath = DB_PATH + DB_NAME; checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { // database does't exist yet. } if (checkDB != null) { checkDB.close(); } return checkDB != null ? true : false; } /** * Copies your database from your local assets-folder to the just created * empty database in the system folder, from where it can be accessed and * handled. This is done by transfering bytestream. * */ private void copyDataBase() throws IOException { // Open your local db as the input stream InputStream myInput = myContext.getAssets().open(DB_NAME); // Path to the just created empty db String outFileName = DB_PATH + DB_NAME; // Open the empty db as the output stream OutputStream myOutput = new FileOutputStream(outFileName); // transfer bytes from the inputfile to the outputfile byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } // Close the streams myOutput.flush(); myOutput.close(); myInput.close(); } public void openDataBase() throws SQLException { // Open the database String myPath = DB_PATH + DB_NAME; // SQLiteDatabase.NO_LOCALIZED_COLLATORS myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.CREATE_IF_NECESSARY); } @Override public synchronized void close() { if (myDataBase != null) myDataBase.close(); super.close(); } // return cursor public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) { return myDataBase.query("pwp_singers", null, null, null, null, null, null); } @Override public void onCreate(SQLiteDatabase arg0) { // TODO Auto-generated method stub } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { // TODO Auto-generated method stub } } خط 21 اسم دیتابیس و قرار دادیم.توابع دیگه هم مربوط به باز کردن،بستن،چک کردن وجود دیتابیس و ... هست(لازم به توضیح بود بگین توضیح بدمش) توی فایل activity_main.xml یه لیست ویو قرار میدیم. توی فایلMainActivity.java کد زیر و تایپ می کنیم. package com.p30droid.externaldatabase; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListAdapter; import android.widget.ListView; import android.app.Activity; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; public class MainActivity extends Activity { Database myDbHelper; SQLiteDatabase db; ListAdapter adapter; ArrayList> data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lst=(ListView) findViewById(R.id.listView1); Load_Database(); db = myDbHelper.getReadableDatabase(); Cursor c = db.rawQuery("select * from tbl1", null); data = new ArrayList>(); for (; c.moveToNext() { HashMap map = new HashMap(); String id = c.getString(c.getColumnIndex("Id")); String name = c.getString(c.getColumnIndex("Name")); map.put("id", id); map.put("name", name); data.add(map); } adapter = new list_view(this, data); lst.setAdapter(adapter); } private void Load_Database() throws Error { myDbHelper = new Database(MainActivity.this); try { myDbHelper.createDataBase(); } catch (IOException ioe) { throw new Error("Unable to create database"); } try { myDbHelper.openDataBase(); } catch (SQLException sqle) { throw sqle; } } } خط 25 دیتابیس و چک میکنیم که ایجاد شده یا نه.اگه هست بازش کنه اگه نه ایجاد میکنه. خط 27 اسم جدول و نوشتیم تا اطلاعات اونو بخونیم. خط 32و 33 فیلدهایی که میخوایم و قرار دادیم و در اخر هم با اداپتور اونو توی لیست ویو میریزیم. خط 38 هم از لیست ویو سفارشی استفاده کردیم که اموزشش تو سایت هست . اینم فایلهاش فایل list_view.java package com.p30droid.externaldatabase; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.res.AssetManager; import android.graphics.Color; import android.graphics.Typeface; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class list_view extends BaseAdapter { private Activity activity; private ArrayList> data; private LayoutInflater inflate; ViewHolder holder; public list_view(Activity a, ArrayList> d) { // TODO Auto-generated constructor stub activity = a; data = d; inflate = (LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return data.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int arg0, View view, ViewGroup arg2) { // TODO Auto-generated method stub View v1 = view; if (v1 == null) { v1 = inflate.inflate(R.layout.list_view, null); holder = new ViewHolder(); holder.txt_name = (TextView) v1.findViewById(R.id.txt_name); holder.txt_id = (TextView) v1.findViewById(R.id.txt_id); holder.txt_id.setVisibility(View.GONE); v1.setTag(holder); } else { holder = (ViewHolder) v1.getTag(); } HashMap song = new HashMap(); song = data.get(arg0); holder.txt_id.setText(song.get("id")); holder.txt_name.setText(song.get("name")); return v1; } static class ViewHolder { TextView txt_name; TextView txt_id; } } فایل list_view.xml <?xml version="1.0" encoding="utf-8"?> android:layout_width="fill_parent" android:layout_height="fill_parent" > android:id="@+id/txt_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="22dp" android:layout_marginTop="30dp" /> android:id="@+id/txt_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/txt_name" android:layout_marginRight="96dp" android:layout_toLeftOf="@+id/txt_name" /> و خروجی کار سورس برنامه
  11. 3 likes

    نگارش 1.0.0

    78 دانلود

    یکی از عواملی که باعث جلب توجه کاربران به برنامه ای می شود استفاده از انیمیشن های جذاب و چشمگیر است. استفاده از انیمیشن در اندروید به برنامه ها شکل و شمایل حرفه ای می دهد و یکی از فاکتورهای اصلی و مهم در طراحی برنامه هایی با رابط کاربری قوی و یا باصطلاح کاربر پسند (User friendly) استفاده از انیمشین در برنامه های اندرویدی است.کتابخانه Curved-Fab-Reveal یکی از کتابخانه های جذاب به صورت انیمیشن و متریال بسیار زیبا.

    رایگان

  12. 3 likes

    نگارش 1.0.0

    158 دانلود

    ایا به سورس اپلیکیشن اندرویدی نیاز دارید که بتوانید یک Music Player قوی پخش فایل های صوتی را داشته باشید،با این پروژه اندرویدی میتوانید اینکار را انجام دهید. ویژگی های این پروژه اندرویدی : پخش فایل صوتی از طریق حافظه داخلی استریم فایل ها صوتی از طریق اینترنت پخش فایل های صوتی با فرمت های MP3, AMR, AAC, PCM WAV, OGG, MP4a, 3GP

    رایگان

  13. 3 likes
    آقای قلندری دستت درد نکنه که زحمت ترجمه کتاب آموزش مقدماتی اندروید رو داری می کشی . واقعا ازت ممنونم . آیا این ترجمه ها رو ممکنه در آینده بصورت فایل پی دی اف برای دانلود قرار بدین ؟
  14. 3 likes
    بالاخره اون کاری که من می خواستم دارید انجام می دید مرسی
  15. 3 likes
    کاربران گرامی با درود و عرض احترام لطفا در ارسالهای خود و بخشهای مختلف انجمن پی سی دروید قوانین زیر را رعایت فرمائید: منع فعالیت سیاسی : هر گونه فعالیت سیاسی بر خلاف قوانین بوده و با کاربر خاطی سریعا برخورد خواهد شد. زبان فارسی : زبان اصلی این انجمن فارسی است ، لطفا در هنگام ارسال مطالب از زبان پینگلیش استفاده نکنید . قوانین عمومی 1- انجمن پی سی دروید بدون هیچگونه فعالیت در جهت کسب منافع مادی فقط و فقط در حیطه راهنمایی کاربران ، رفع مشکلات کاربران ، معرفی و آموزش اندروید فعالیت مینماید و هر کاربر یا مدیری که در جهت سودجویی و منفعت مالی اقدام به منحرف کردن مبحث و سوالات کاربران دیگر را داشته باشد در بار اول به مدت 24 ساعت و برای بار دوم برای همیشه از انجمن اخراج میگردد. 2- تبلیغات در انجمن ممنوع میباشد و کاربران صرفا مجاز به درج تبلیغ در امضا خود میباشد و ارسال پست و تاپیک های تبلیغاتی شامل اخطار و اخراج میشود. 3- تمامي کاربران مي بايست در هنگام ثبت نام در سايت ، از کلمات مناسب جهت استفاده در نام کاربري خود استفاده نمايند. در صورت مشاهده کلمات رکيک و نامناسب، اشتراک آن كاربر در اولين فرصت حذف خواهد شد و دسترسي وي به انجمنها قطع خواهد شد حتي المقدور نام كاربري را با حروف انگيسي به جاي فارسي ايجاد نماييد. 4- کاربران سايت مي بايست در هنگام ارسال پيغام در انجمن ها از کلمات مناسب استفاده نمايند. در صورت مشاهده کلمات رکيک و نامناسب ، اشتراک آن كاربر در اولين فرصت حذف خواهد شد و دسترسي وي به انجمنها قطع خواهد شد. 5- عنوان تاپيک بايد به خودي خود نشانگر محتوا و گفتگوي هاي تاپيک باشد . لطفا در هنگام ايجاد تاپيک به اين نکته توجه کنيد تا تاپيک شما بيشتر مورد توجه ساير کاربران قرار گيرد . از ايجاد تاپيک هايي با عناوين : کمک ، کمک فوري ، خيلي مهم و ساير عناوين عمومي جدا خودداري کنيد ... 6- در صورتي که مايل به ارسال مطلبي از يک سايت ديگر مي باشيد ، حتماً منبع آن را ذکر نماييد. در صورتي که مطلب يا موضوع مذکور نوشته شده توسط شخص خاصي بود ، حتماً نام وي را ذکر نماييد. 7- لطفا در هنگام مطرح کردن سوالات خود ، انجمن مناسب را انتخاب نماييد و از مطرح کردن سوالات خود در انجمنهاي نامتناسب با سوالتان خودداري نماييد. 8- لطفا در هنگام طرح سوالات خود آنها را به صورت جداگانه مطرح فرماييد. بدين معني که در صورتي که سوالهاي گوناگوني داريد ، آنها را در چندين موضوع جداگانه مطرح نماييد و از مطرح کردن تمامي سوالات در يک موضوع خودداري فرماييد . 9- لطفا در هنگام جواب دادن به سوالات از به کار گيري الفاظ و جملاتي که باعث دلسردي کاربر سوال کننده شود خودداري فرماييد. اين را بدانيد که اين سايت محل آموزش است و کساني هستند که سوالهايشان بسيار ابتدايي مي باشد. لذا از به کارگيري کلماتي که باعث شود کاربر به جاي گرفتن جواب سوال خود دلسرد شود اکيداً خودداري فرماييد. 10- لطفا در صورتي که جواب يک سوالي را نمي دانيد از ارسال مطالبي که باعث شلوغ کردن آن تاپيک ( يا سوال ) شود خودداري فرماييد. در صورتي که بحث خاصي داريد مي توانيد براي خودتان يک تاپيک عمومي باز کنيد. 11- از نوشتن يك سوال و يا يك نامه در انجمنهاي مختلف خودداري كنيد. طبق قانون شماره 7 انجمن مناسب و مرتبط به نامه خود را انتخاب كنيد و فقط در آن انجمن نامه خود را ارسال كنيد. 12- تمام کاربران و مدیران موظف به احترام گذاشتن به یکدیگر در انجمن پی سی دروید هستند.ارسال مطالب کنایه آمیز ، بازی با کلمات! ، پیام خصوصی توهین آمیز ، خرد کردن شخصیت افراد و هرگونه بحثی که نشان از بی ادبی و تمسخر دیگران باشد در این انجمن جایی ندارد و بلافاصله کاربر خاطی اخراج خواهد شد. 13- کاربران بسیاری هستند که حتی نمیدانند که روش کار یک انجمن به چه شکل است و یا سوالات خیلی مبتدی میپرسند لذا هیچ کاربری حق جسارت به این دسته از کاربران را نداشته و باید با احترام و با صبر و حوصله پاسخ کاربران و راهنمایی لازم داده شود. انجمن تخصصی اندروید پی سی دروید
  16. 2 likes
    Spinner یکی از ویجت های کاربردی و پراستفاده در برنامه های اندرویدی میباشد و بصورت یک منوی بازشونده عمل میکند که میتوانید یک یا چند آیتم را انتخاب کنید. به روش های مختلف میتوانید در Spinner آیتم اضافه کنید مثلا ارایه،xml ،دیتابیس ,..... میتوانید ویجت خود را کنترل نمایید در این تاپیک کلیه روش ها مورد استفاده قرار میگیرند.برای شروع از آرایه استفاده میکنیم 1-لود کردن آرایه در Spinner : ابتدا باید در XML آن را تعریف کنیم: <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Spinner android:id="@+id/spinner1" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> سپس در اکتیویتی خود باید لیستی را تعریف کرده و در Adapter قرار دهیم: Spinner spinner1 = (Spinner) findViewById(R.id.spinner2); List list = new ArrayList(); list.add("Android"); list.add("BADA"); list.add("Tizen"); ArrayAdapter dataAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, list); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner1.setAdapter(dataAdapter);
  17. 2 likes
    آقا انصافا دمت گرم داشتم پیر میشدم سر این موضوع بالاخره پیداش کرد
  18. 2 likes
    برای ارسال اطلاعات از یک اکتیوینی دیگر باید بدین روش اعمال کنیم،مثلا وقتی روی دکمه ای کلیک شد ، به صفحه مورد نظر رفته و اطلاعات همراه با آن intent فرستاده میشود. در این نمونه مثال دو مقدار url و name که رشته ای هستند برای صفحه بعد فرستاده میشود Intent i = new Intent(getApplicationContext(), list.class); i.putExtra("url", txt_url.getText()); i.putExtra("name", txt_name.getText()); startActivity(i); سپس باید در صفحه وارد شده مقداری که ارسال شده است را بگیریم : Bundle extras = getIntent().getExtras(); if (extras != null) { _url = extras.getStringurl _name = extras.getString("name");}
  19. 2 likes
    سلام برای استفاده از وب سرویس باید با استفاده از کتابخانه های Retrofit و یا Volley اینکار را انجام دهید
  20. 2 likes
    کتابخانه Expandable LinearLayout یک کتابخانه جذاب و جالب می باشد که هر سطر به صورت Expandable دارای یک منوی باز شونده می باشد.همانطور که در زیر مشاهده می کنید: قطعه کد زیر را در قسمت Dependency وارد کنید: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { compile 'com.github.iammert:ExpandableLayout:1.4.1' } قطعه کد زیر را در Layout خود وارد کنید: <iammert.com.expandablelib.ExpandableLayout android:id="@+id/el" android:layout_width="match_parent" android:layout_height="match_parent" app:parentLayout="@layout/layout_parent" app:childLayout="@layout/layout_child"/> Set renderer expandableLayout.setRenderer(new ExpandableLayout.Renderer<FruitCategory, Fruit>() { @Override public void renderParent(View view, FruitCategory model, boolean isExpanded, int parentPosition) { ((TextView) view.findViewById(R.id.tvParent)).setText(model.name); } @Override public void renderChild(View view, Fruit model, int parentPosition, int childPosition) { ((TextView) view.findViewById(R.id.tvChild)).setText(model.name); } }); Set listeners expandableLayout.setExpandListener(new ExpandCollapseListener.ExpandListener<FruitCategory>() { @Override public void onExpanded(int parentIndex, FruitCategory parent, View view) { //Layout expanded } }); expandableLayout.setCollapseListener(new ExpandCollapseListener.CollapseListener<FruitCategory>() { @Override public void onCollapsed(int parentIndex, FruitCategory parent, View view) { //Layout collapsed } }); Add section or children Section<FruitCategory, Fruit> section = new Section<>(); //defaut is false section.expanded = true; FruitCategory fruitCategory = new FruitCategory("Fruits"); Fruit fruit1 = new Fruit("Apple"); Fruit fruit2 = new Fruit("Orange"); section.parent = fruitCategory; section.children.add(fruit1); section.children.add(fruit2); expandableLayout.addSection(section); expandableLayout.addChild(fruitCategory, new Fruit("Grape")); Filter parent and children //make your parent class filterable class FruitCatefory implements Filterable{} //make your child class filterable class FruitCatefory implements Filterable{} Now, you can search in parents or children. Layout will be updated automatically. expendableLayout.filterParent("SEARCH PARAM") //or expendableLayout.filterChildren("SEARCH PARAM") https://github.com/iammert/ExpandableLayout ExpandableLayout-master.zip
  21. 2 likes
    خب برای اینکار شما با سرویس BroadCastReciver متن پیغام از میگیرد و میتوند با یک interface دیتارو به داخل ویجت EditText بفرستید و یا استفاده از کتابخانه EventBus
  22. 2 likes
    شما باید ابتدا شماره تلفن را از کاربر بگیرید و به سمت سرور انتقال دهید و سپس در سمت سرور از شرکت های سرویس دهنده sms یک api بگیرید و برای شماره مورد نظر یک پیغام را ارسال کنید. پیغام معمولا میتواند کد تایید باشد
  23. 2 likes
    سلام، این لینک آموزشه: https://github.com/SIMMORSAL/ViewDrag فقط این به انگلیسیه. کسی میتونه ترجمش کنه به فارسی که همه استفاده ببرن؟
  24. 2 likes
    سلام دوست عزیز برید داخل فایل gradle.properties و اینجا پروکسی هم برای http و هم برای https ست کنید به این صورت systemProp.http.proxyHost=localhost systemProp.http.proxyPort=51520 systemProp.https.proxyHost=localhost systemProp.https.proxyPort=51520 برای دانلود کتابخونه ها باید به https وصل بشید نه http پس پراکسی باید برای Https ست بشه تا تاثیر داشته باشه هاست و پورت وی پی ان خودتونو بزارین
  25. 2 likes
    String encodedHash = Uri.encode("#"); String ussd = "*" + encodedHash + lCallNum + encodedHash; startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + ussd)));
  26. 2 likes
    به مناسبت دومین سالگرد انجمن برنامه نویسی اندروید پی سی دروید،آموزش گام به گام برنامه نویسی اندروید از پایه را آماده کرده ایم امید است بتوانیم سهمی کوچک در پیشرفت تمامی کاربران گرامی انجمن پی سی دروید را داشته باشیم. این فایل آموزشی در 80 صفحه و پنج فصل تدوین شده است سرفصل ها: معماری و ساختار سیستم عامل اندروید آموزش زبان جاوا Layout در اندروید آموزش کاربردی برنامه نویسی اندروید مارکتینگ اندروید لینک دانلود: http://p30droid.com/Uploader/do.php?id=528 با احترام فرزاد سرسیفی مدیر انجمن برنامه نویسی اندروید p30droid.com
  27. 2 likes
    تا به حال نرم افزار های زیادی از قبیل توییتر(twitter) , گوگل پلاس (+google) , جیمیل (gmail) را در اندروید دیده‌ایم که باswipe/pull down ( کشیدن صفحه به سمت پایین) محتوای خود را بروز میکنند . زمانی که صفحه را از بالا به پایین میکشیم یک محتوای جدیدی به ما نشان داده می‌شود یا اینکه محتوای قبلی بروزرسانی خواهد شد. در این آموزش میخواهیم کار با SwipeRefreshLayout را آموزش دهیم. این لایه به ما کمک می‌کند که طراحی اصولی (material designn) و کاربر پسندی را در برنامه های خود داشته باشیم. در یک آموزش مختصر با ما باشید تا به طور ساده با نحوه کار SwipeRefreshLayout (کشیدن صفحه به سمت پایین) آشنا شویم. این مثال نحوه ی Refresh(تازه سازی) کردن صفحه با استفاده از SwipeRefreshLayout را به شما نشان میدهد.مراحل را طبق زیر دنبال کنید. 1-با استفاده ار اندروید استودیو یک پروژه ی جدید با نام Swipe تحت بسته ی com.example.Swipeایجاد کنید. نحوه ی ایجاد پروژه ی جدید در بخش آموزشی ساخت اولین پروژه در اندروید استودیو توضیح داده شده است. 2- محتوای فایل res/layout/activity_main.xml را مانند آنچه در ادامه آمده است تغییر دهید. 3-محتوای فایل اکتیویتی اصلی java/com.example.sendemail/MainActivity.java را به منظور اجرای کدهای دلخواه پس از انجام عمل swipe/pull downn (کشیدن صفحه به سمت پایین)مانند آنچه در ادامه آمده است تغییر دهید. محتوای زیر مربوط به فایل res/layout/activity_main.xml می باشد. <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mySwipe" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- کد خود را اینجا وارد کنید--> </android.support.v4.widget.SwipeRefreshLayout> این لایه(بالا) از کتابخانه‌ی زیر است. android.support.v4.widget در کد بالا ما لایه‌ی SwipeRefreshLayout را به عنوان لایه‌ی والد یا ریشه استفاده کرده ایم و درون آن می‌توانیم لایه ها و عناصر دیگر را به کار ببریم.به عنوان مثال میتوان به صورت زیر نوشت. <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mySwipe" android:layout_width="match_parent" android:layout_height="match_parent" > <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="من یک متن هستم" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="center"/> </ScrollView> </android.support.v4.widget.SwipeRefreshLayout> معمولا درون این لایه یک recyclerView یا listView به کار می‌رود که در صورت تازه سازی (refresh) مقادیر آیتم ها دچار تغییر شوند(آیتم جدیدی وارد لیست شده یا از آن حذف شود). همچنین این لایه می‌تواند به عنوان یک لایه ی فرزند ظاهر شود. حالا نوبت این است که در اکتیویتی (activity) خود این لایه را وصل کنیم و از آن استفاده کنیم.در زیر محتوای فایل java/com.example.location/MainActivity.java آورده شده است. package com.example.Swipe; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { SwipeRefreshLayout mySwipe; @Override protected void onCreate(Bundle savedInstanceState) { ;( super.onCreate(savedInstanceState ;( setContentView(R.layout.activity_main ;( mySwipe = (SwipeRefreshLayout) findViewById(R.id.mySwipe () mySwipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener { @Override () public void onRefresh{ //اعمالی را که میخواهیم هنگام تازه سازی انجام شود ;( mySwipe.setRefreshing(false } ;({ } } داخل کد بالا ما با صدا زدن متد setOnRefreshListener با ورودی رابط (interface) OnRefreshListener می‌توان متد onRefresh را بازنویسی (override) کرده و داخل آن هر عملی که برای تازه سازی لازم است انجام داد. برای مثال زمانی که ما برنامه ای متصل به اینترنت داریم و میخواهیم با swipe کردن مقادیر را بروزرسانی کنیم در متد onRefresh میتوانیم وضعیت اتصال به اینترنت را چک کنیم و اگر متصل بود دیتا را از اینترنت دریافت کرده و مقادیر محتوای صفحه را بروزرسانی کنیم. در اخر کد با نوشتن mySwipe.setRefreshing(false) انیمیشن ایجاد شده را متوقف میکنیم.اگر در جایی از برنامه بخواهیم خاصیت swipe pull down و انیمیشن را غیر فعال کنیم میتوانیم از دستور setEnabled(false) استفاده کنیم.
  28. 2 likes
  29. 2 likes
    ما نرم افزار ساخته ایم برای دانشجو ها . امکاناتش جالبه پیشنهاد میکنم دانلود کنید اگر مشکلی داشت یا پیشنهادی داشتید با ما اطلاع بدید . با تشکر . لینک دانلود :http://iranapps.com/app/com.hsb.daneshjoo ارتباط با ما : h.myapps@gmail.com
  30. 2 likes
    سلام میتونید از این دستورات استفاده کنید: Locale locale_fa = new Locale("fa", "IR"); getResources().getConfiguration().setLocale(locale_fa); در MainActivity و در بخش onCreate...
  31. 2 likes
    سلام جدیترین پست ها "ببینید هر پستی که قرار میگیره یک ایدی جدیدی میگیره میتونید بر اساس بزرگترین ایدی سورت کنید" select * from tblName order by id desc حالا اگر میخواید صفحه بندی بشه مثلا هر سری 10 تا پست رو بیاره به این صورت بزنید select * from tblName order by id desc limit 0,10 0 >> از شماره مثلا از شماره 1 10 >> تعداد 10 تا به 10 حالا بر اساس ویو ها select * from tblName order by view desc حالا اون های که دیده شدندشما باید یک فیلیدی به دیتا بیس اضافه کنید و هر وقت اون پست دیده شد عدد اون رو از 0 به یک تغییر بدید یعنی این پست دیده شده البته اگر بخواید توسط خود کاربر دیده بشه باید یک جدول دیگه ای بزنید و ایدی پست همراه با ایدی کاربر رو توی اون جدول ذخیره کنید و از join توی mysql استفاده کنید select * from tblName where post_view=1 برای سوال بعدیتون که کاقه بازار رو مثال زدید این بستگی داره به کد نویسی شما مثلا میتونید یک اداپتر بنویسید و 3 model و یا به هر نحو دیگه ای 3 اداپتر و.... بستگی داره به قدرت برنامه نویسی تمیزی نوشتن کد و رعایت خیلی از اصول های دیگه درمورد سوال اخرت هم درست متوجه نشدم ولی من بیشتر view pager هام رو کاستوم میکنم برای استفاده های بیشتر
  32. 2 likes
    سلام دوستان اینجام میخوام آموزشی بدم که میتونه خیلی کاربرد داشته باشه شاید در برخی مواقعه دیده باشید که برخی از برنامه ها همراه با متن معمولی لینک قرار میدن اینجا میخوام آموزش بدم که چطور این کار رو میشه انجام داد. برای این کار ما از کتاب خانه Linkify استفاده میکنیم میتونید مستندات کاملش رو از ادرس زیر مطالعه کنید. https://developer.android.com/reference/android/text/util/Linkify.html خوب ما اول باید یک pattern ایجادکنیم کار این pattern چی هستش ما میایم متنی رو که میخوایم لینک دار کنیم رو به این pattern میدیم Pattern pattern= Pattern.compile("جواد زبیدی زاده"); خب حالا اگر ما بخوایم لینک به وسیله scheme خود برنامه خودمون باز بشه یا به وسیله هر برنامه دیگه میاد متنی رو که داخل pattern نوشتیم رو ارسال میکنه اگر بخوایم متن دلخواهی بفرستیم میاید از خاصیت TransformFilter استفاده میکنیم به مثل زیر توجه کنید مثال : اگر عنوان لینک نام و نام خانوادگی کاربر باشه(جواد زبیدی زاده) و بخوایم نام کاربری رو بفرستیم (Javadzobeidi) میایم به صورت زیر انجام میدیم Linkify.TransformFilter username = new Linkify.TransformFilter() { @Override public String transformUrl(Matcher match, String url) { return "javadzobeidi"; } }; حالا باید ویوی که متن توی اون هستش رو هم تعریف کنیم که اینجا Textview هستش TextView event_message = (TextView)itemView.findViewById(R.id.event_message); event_message.setText("جواد زبیدی زاده یک پیغامی برای شما ارسال کرده است"); خب حالا وقتش شده لینک رو ایجاد کنیم گفتیم از کلاس Linkify استفاده میکنیم Linkify.addLinks(event_message,pattern,"myScheme://?username=",null,username); توی کد بالا اگر توجه کنید من یک scheme ایجاد کردم myScheme://?username= این scheme هستش که من با اون اطلاعات رو میگیرم خب اگر تا اینجا درست انجام داده باشید لینک همراه با متن نمایش داده میشه ولی خب یک زیر خط همراه لینک به نمایش در میاد که بهش میگن Underlines برای حذف این زیر خط باید کلاس و تابع زیر رو بنویسید /** * Delete Under Line From Link in Text View Class */ public static class URLSpanNoUnderline extends URLSpan { public URLSpanNoUnderline(String p_Url) { super(p_Url); } public void updateDrawState(TextPaint p_DrawState) { super.updateDrawState(p_DrawState); p_DrawState.setUnderlineText(false); } } /** * Delete Under Line From Link in Text View method * Enterd Text View Get text */ public static void removeUnderlines(Spannable p_Text) { URLSpan[] spans = p_Text.getSpans(0, p_Text.length(), URLSpan.class); for(URLSpan span:spans) { int start = p_Text.getSpanStart(span); int end = p_Text.getSpanEnd(span); p_Text.removeSpan(span); span = new URLSpanNoUnderline(span.getURL()); p_Text.setSpan(span, start, end, 0); } } و کد زیر رو کنار کد ایجاد لینک قرار بدید // Make sure the TextView was instantiated correctly if(event_message != null) { removeUnderlines((Spannable)event_message.getText()); } و من الله التوفیق
  33. 2 likes
    در متد oncreat() این کد رو اضافه کنید this.inflatedView = inflater.inflate(R.layout.fragment_name, container, false); sendButton = (Button) inflatedView.findViewById(R.id.sendTextButton); نحوه ی تعریف بصورتی ک در کد مشاهده میکنید هست.
  34. 2 likes
    وقتی که میخوایم داده هایی رو از کاراکتر ها و یا ارایه ها بخونیم میتونیم اونها رو داخل یک bufferreader بریزیم.و سپس اونها رو بخونیم. تو اینجا یه مثال ساده گذاشتم امیدوارم ب دردت بخوره.توضیح کد اینه ک یه اریه از نوع char داریم و یه بافر ریدر هم تعریف کردیم.میخایم با استفاده از داده های اریه ی char رو بخونیم و برزیم داخل بافر ریدر . بعدش این بافر ریدر رو به رشته تبدیل میکنیم. char[] char_me=arr_char; StringBuffer result = new StringBuffer(); for (int i = 0; i < arr_char.size(); i++) { result.append( char_me[i] ); } String str=result.toString();
  35. 2 likes
    سلام این آموزش رو مطالعه کنید: http://mrbool.com/how-to-change-the-layout-theme-of-an-android-application/25837
  36. 2 likes
    کاتلین چیست ؟ کاتلین یک زبان برنامه نویسی تایپ اسکریتی میباشد برای ماشین مجازی JVM که اندروید ومروگر های بطوررسمی توسط گوگل برای اندروید پشتیبانی میشود. زبان برنامه نویسی کاتلین توسط شرکت Jetbrain توسعه داده شده است .شرکت Jetbrain ایجاد کننده Intellij idea میباشد ،اندروید استودیو نیز براساس Intellij میباشد .در مراسم گوگل i/o 2017 گوگل بطور رسمی کاتلین را زبان رسمی توسعه اندروید بنا نهاد. چرا کاتلین : با استفاده از زبان کاتلین کدهای کمتری خواهید نوشت و با عملیات های بسیار بالا.در جاوا. اگر شما میخواهید یک data کلاس ایجاد کنید مدت زمان زیادی را باید صرف ساخت members و getter و setter ها کنید،اما در کاتلین شما میتوانید اینکار را با کدهای خیلی کمتری انجام دهید data class Person( var id : Long, var name:String, var age: Int) همچنین یک نکته خوب دیگه : Null safe در زبان برنامه نویسی جاوا هنگام کد نویسی با مقدار Null pointer exception زیاد روبه روبه میشوید.اما بااستفاده از زبان برنامه نویسی کاتلین خطای Null pointer exception هیچوقت رخ نخواهد داد چگونه میتوانیم از کاتلین استفاده کنیم ؟ از اندروید استودیو 3.0 کاتلین بطور کامل پشتیبانی میشود. در ورژن های حال حاضر میتوانید پلاگی کاتلین را نصب کنید و از زبان برنامه نویسی کاتلین استفاده کنید.
  37. 2 likes
    برای پیاده سازی اینکار باید در فایل مانیفست تگ زیر را اضافه کنید تا در صورتی کاربر در بخش Brower ها اپ شما را انتخاب کرد اطلاعات برای شما ارسال شود <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="example.com" android:pathPrefix="/someresource/" android:scheme="http" /> <data android:host="www.example.com" android:pathPrefix="/someresource/" android:scheme="http" /> </intent-filter> Here, scheme -> Protocol of particular site host-> Exact site url with WWW pathprefix - > Your site's sub path if available Now,
  38. 2 likes
    این کلمه‌ی کلیدی در مبحث thread مطرح می‌شود. وقتی چند thread با یک متغیر (مثلا یک شی) عادی کار می‌کنند، ممکن است آن را cache کنند. یعنی هر thread ای که این متغیر را cache کند، یک نسخه از آن گرفته و با آن کار می‌کند (تغییرات اعمالی بر روی آن توسط یک thread، به سایر thread ها منعکس نمی‌شود) اگر آن متغییر با کلمه‌ی کلیدی volatile تعریف شود، تنها یک نسخه از آن متغیر وجود دارد و تغییراتی که یک thread بر روی آن انجام می‌دهد، بلافاصله در thread های دیگر منعکس می‌شود. public class VolatileTest { private static final Logger LOGGER = MyLoggerFactory.getSimplestLogger(); private static volatile int MY_INT = 0; public static void main(String[] args) { new ChangeListener().start(); new ChangeMaker().start(); } static class ChangeListener extends Thread { @Override public void run() { int local_value = MY_INT; while ( local_value < 5){ if( local_value!= MY_INT){ LOGGER.log(Level.INFO,"Got Change for MY_INT : {0}", MY_INT); local_value= MY_INT; } } } } static class ChangeMaker extends Thread{ @Override public void run() { int local_value = MY_INT; while (MY_INT <5){ LOGGER.log(Level.INFO, "Incrementing MY_INT to {0}", local_value+1); MY_INT = ++local_value; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } } } output با استفاده از volatile ... Incrementing MY_INT to 1 Got Change for MY_INT : 1 Incrementing MY_INT to 2 Got Change for MY_INT : 2 Incrementing MY_INT to 3 Got Change for MY_INT : 3 Incrementing MY_INT to 4 Got Change for MY_INT : 4 Incrementing MY_INT to 5 Got Change for MY_INT : 5 output بدون استفاده از volatile ... Incrementing MY_INT to 1 Incrementing MY_INT to 2 Incrementing MY_INT to 3 Incrementing MY_INT to 4 Incrementing MY_INT to 5 نکته: استفاده از Volatile در برنامه هایی که تنها از یه Thread استفاده می شه کاربردی نداره…
  39. 2 likes
    قبل از بحث درباره پیاده سازی Singleton، اجازه دهید یکسری سوالات پایه ای را مطرح کنیم و به آنها پاسخ دهیم. هدف استفاده از Singleton Pattern همانطور که از نام آن مشخص است، Singleton Pattern فقط اجازه می دهد یک نمونه از class ساخته شود. چه زمانی نیاز داریم که یک نمونه از کلاس ساخته شود؟ خیلی وقت ها نیاز است که فقط یک نمونه از یک کلاس ساخته شود. مثلاً وقتی که نمی خواهیم وضعیت شی تغییر کند و یا می خواهیم class را به صورت stateless نگه داریم. به عنوان مثال زمانی که می خواهید یکسری داده های master را یکجا بارگذاری کنید و اجازه دهید مصرف کنندگان داده به جای فراخوانی های متعدد، با ساخت یک نمونه از کلاس، یک فراخوانی به یک کلاس Singleton داشته باشند. در حالت کلی، در هر برنامه Enterprise پیچیده، می توان به کلاس های Repository و لایه Data Access به صورت Singleton نگاه کرد. درحالیکه معمولاً نمی خواهیم وضعیت در این لایه ها حفظ شود. از جمله مثال های دیگر می توان به بحث log گیری، تنظیمات (configuration)، Caching و غیره اشاره کرد که می توان آن ها را به صورت Singleton پیاده سازی کرد. چرا که نیاز به یک نقطه مرکزی و سراسری خواهیم داشت تا به این کلاس ها دسترسی داشته باشیم. گذشته از توضیحات فوق، دیده شده است که برخی از برنامه نویسان بی تجربه یکسری نمونه های اضافی می سازند که نه نتها باعث سربار حافظه می شوند، بلکه کارایی برنامه را تحت تاثیر قرار می دهند. چرا کلاس های static به دلایل مختلفی نباید از کلاس های static استفاده کنیم. برخی از این دلایل عبارتند از: · موارد مختلفی هست هست که می خواهید Interface ها را در یک کلاس پیاده سازی کنید (برای مثال پیاده سازی IOC- بعداً به توضیح IOC خواهم پرداخت) و به جای پیاده سازی کلاس به صورت static، آن را به صورت Singleton پیاده سازی می کنیم. · در صورت نیاز، می توانید از یک کلاس singleton به صورت پارامتر یک متد استفاده کنید درحالیکه نمی توان این کار را با کلاس static انجام داد. نکته مهم درباره کلاس های Singleton ایده وضعیت یک کلاس از آنجا نشآت گرفته است که شما نیاز دارید یکسری هماهنگی در محیط های چند نخی (multi-threaded enviroments) ایجاد کنید. اجازه دهید نگاهی به یک پیاده سازی ساده داشته باشیم. در اولین مثال، یک Singleton با Lazy loading پیاده سازی شده است و تا زمانیکه فراخواننده، متد GetInstance را برای اولین بار فراخوانی نکند، نمونه ایجاد نمی شود. public class SingletonClass { private static SingletonClass instance = null; private SingletonClass() { } public static SingletonClass GetInstance { get { if (instance == null) { instance = new SingletonClass(); } return instance; } } اجازه دهید مشکل هماهنگی، که در محیط های چند نخی با آن مواجه هستیم را بر طرف کنیم. برای همین منظور از یک مکانیزم دوقفله استفاده خواهیم کرد: private static SingletonClass instance = null; private static object lockMe = new object(); private SingletonClass() { } public static SingletonClass GetInstance { get { if (instance == null) { lock (lockMe) { if (instance==null) { instance = new SingletonClass(); } } } return instance; } } و در آخر، Singleton با مقداردهی اولیه static. لطفاً توجه داشته باشید .NET Framework ایمنی thread در زمان مقداردهی اولیه تضمین می کند و دیگر نیازی نیست نگران مسائل هماهنگی باشیم. اگر چه دیگر از مزایای Lazy loading اشیاء برخوردار نخواهیم بود. private static SingletonClass instance = new SingletonClass(); public SingletonClass() { } private static SingletonClass GetInstance { get { return instance; } }
  40. 2 likes
    دقیقا مشکل شما از همینجا هستش، دقت کنید که در طراحی گرافیکی حتما از آیکون با حجم مناسب استفاده کنید، چون 50 کیلوبایت برای آیکون یکم زیاده... از لینک پایین میتونید آیکونهای مورد نیازتون رو بدست بیارید: https://materialdesignicons.com/ در غیر این صورت باید به شکل مناسب اونها رو طراحی کنید تا هم حجم اپ بیاد پایین و هم دچار این چنین مشکلاتی نشید... در هر صورت اگر موفق به انجام کار بالا نشدید در فایل مانیفست و در بخش application کدهای زیر رو وارد کنید: android:largeHeap="true" android:hardwareAccelerated="false"
  41. 2 likes
    نه سخت نیس در حال حاظر دوتا دیتابیس پر کاربرد برای اندروید sqlite و realm هستند : https://realm.io/news/realm-for-android/ https://www.androidhive.info/2011/11/android-sqlite-database-tutorial/ منابع زیادی در اینترنت موجود هست .میتونید سرچ کنید
  42. 2 likes
    RecyclerView بسیار شبیه ListView در اندروید است. هر دو برای نمایش لیست در برنامه اندروید مورد استفاده قرار می گیرند، اما در بعضی موارد در مقایسه با یکدیگر تفاوت دارند. ListView در مقایسه با RecyclerView تا حدودی کندتر است. RecyclerView برخی از سفارشی سازی های اضافی را که ListView ارائه نمی کند فراهم می کند. RecyclerView در طراحی آیتم ها لیست ها در اندروید معرفی شده است. RecyclerView می تواند عملکرد نرم افزار را با بازیابی دیدگاه ها برای نمایش اقلام ردیف بهینه سازی کند، زیرا از هر نمایشگر برای نمایش هر آیتم لیست استفاده می کند که ListView هر بار که آیتم لیست قابل مشاهده است، نمای جدید را ایجاد می کند. ListView برخی از اقلام لیست را محدود می کند، در حالی که RecyclerView ابزار خاصی برای طراحی آیتم لیست فراهم می کند. ما همچنین می توانیم بگوییم که RecyclerView نسخه جدید ListView در اندروید است. ListView لیست سفارشی سازی لیست را با کمک منابع drawable فراهم می کند اما سفارشی سازی آن برای مثال محدود می شود. ما می توانیم از itemable برای item list که برای همه موارد در لیست استفاده می شود استفاده کنیم، نمی توانیم سفارشی سازی یک آیتم لیست خاص را ارائه دهیم. در حالی که ابزار ItemDecoration recyclerview، سفارشی کردن طراحی خاص و طرح بندی طرح برای یک آیتم لیست خاص را فراهم می کند. DividerItemDecoration verticalDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.HORIZONTAL); Drawable verticalDivider = ContextCompat.getDrawable(getApplicationContext(), R.drawable.myshape); verticalDecoration.setDrawable(verticalDivider); recyclerView.addItemDecoration(verticalDecoration); DividerItemDecoration horizontalDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL); Drawable horizontalDivider = ContextCompat.getDrawable(getApplicationContext(), R.drawable.myshape); horizontalDecoration.setDrawable(horizontalDivider); recyclerView.addItemDecoration(horizontalDecoration);
  43. 2 likes
    نه ربطی به این موضوع نداره شما تو تنظیمات اپلیکیشن مشخص مینید که حداقل ورژن اندروید(minSdk) که ساپورت میکنه چند باشه
  44. 2 likes
    استفاده از Parcelable یک راه مناسب و مفید برای انتقال یا پاس دادن اطلاعات بین کامپوننت های اندروید می باشد. Parcelable یک مکانیسم سریال سازی است که توسط Android ارائه می شود. برای نوشتن یک شی به صورت Parcelable، باید انرا به اندروید استودیو اضافه کرد. برای این کار می توانید از آدرس زیر کمک بگیرید: http://corochann.com/fast-easy-parcelable-implementation در این اینجا، ما خواهیم ببینیم که چگونه یک شی Parcelable را در یک برنامه Android اجرا کنیم تا اطلاعات پیچیده را از یک اکتیویتی به اکتیویتی دیگر انتقال دهیم. import android.os.Parcel; import android.os.Parcelable; import android.util.Log; public class Student implements Parcelable{ String mSName; int mSAge; String mSAddress; String mSCourse; @Override public int describeContents() { // TODO Auto-generated method stub return 0; } /** * Storing the Student data to Parcel object **/ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(mSName); dest.writeInt(mSAge); dest.writeString(mSAddress); dest.writeString(mSCourse); } /** * A constructor that initializes the Student object **/ public Student(String sName, int sAge, String sAddress, String sCourse){ this.mSName = sName; this.mSAge = sAge; this.mSAddress = sAddress; this.mSCourse = sCourse; } /** * Retrieving Student data from Parcel object * This constructor is invoked by the method createFromParcel(Parcel source) of * the object CREATOR **/ private Student(Parcel in){ this.mSName = in.readString(); this.mSAge = in.readInt(); this.mSAddress = in.readString(); this.mSCourse = in.readString(); } public static final Parcelable.Creator<Student> CREATOR = new Parcelable.Creator<Student>() { @Override public Student createFromParcel(Parcel source) { return new Student(source); } @Override public Student[] newArray(int size) { return new Student[size]; } }; } import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class StudentViewActivity extends Activity { TextView mTvSName; TextView mTvSAge; TextView mTvSAddress; TextView mTvSCourse; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_student); // Fetching data from a parcelable object passed from MainActivity Student student = getIntent().getParcelableExtra("student"); // Getting reference to TextView tv_sname of the layout file activity_student mTvSName = (TextView)findViewById(R.id.tv_sname); // Getting reference to TextView tv_sage of the layout file activity_student mTvSAge = (TextView) findViewById(R.id.tv_sage); // Getting reference to TextView tv_saddress of the layout file activity_student mTvSAddress = (TextView) findViewById(R.id.tv_saddress); // Getting reference to TextView tv_scourse of the layout file activity_student mTvSCourse = (TextView) findViewById(R.id.tv_scourse); if(student!=null){ mTvSName.setText("Name:"+student.mSName); mTvSAge.setText("Age:"+Integer.toString(student.mSAge)); mTvSAddress.setText("Address:"+student.mSAddress); mTvSCourse.setText("Course:"+student.mSCourse); } } } import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { EditText mEtSName; EditText mEtSAge; EditText mEtSAddress; EditText mEtSCourse; Button mBtnOk; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Getting a reference to EditText et_sname of the layout activity_main mEtSName = (EditText)findViewById(R.id.et_sname); // Getting a reference to EditText et_sage of the layout activity_main mEtSAge = (EditText)findViewById(R.id.et_sage); // Getting a reference to EditText et_saddres of the layout activity_main mEtSAddress = (EditText)findViewById(R.id.et_saddress); // Getting a reference to EditText et_scourse of the layout activity_main mEtSCourse = (EditText)findViewById(R.id.et_scource); // Getting a reference to Button btn_ok of the layout activity_main mBtnOk = (Button)findViewById(R.id.btn_ok); // Setting onClick event listener for the "OK" button mBtnOk.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // Creating an instance of Student class with user input data Student student = new Student(mEtSName.getText().toString(), Integer.parseInt(mEtSAge.getText().toString()), mEtSAddress.getText().toString(), mEtSCourse.getText().toString()); // Creating an intent to open the activity StudentViewActivity Intent intent = new Intent(getBaseContext(), StudentViewActivity.class); // Passing data as a parecelable object to StudentViewActivity intent.putExtra("student",student); // Opening the activity startActivity(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
  45. 2 likes
    EventBus یک کتابخانه است که یک روش ساده برای ارتباط بین بخش های مختلف برنامه شما است. برای مثال، ارسال اطلاعات از یک activity به یک سرویس در حال اجرا، و یا تعامل آسان بین fragments ها. به مثال زیر دقت کنید: در این مثال اگر اینترنت قطع شده باشد چگونگی نمایش انرا در اکتیویتی نشان می دهد.. public class NetworkStateReceiver extends BroadcastReceiver { // post event if there is no Internet connection public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if(intent.getExtras()!=null) { NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO); if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) { // there is Internet connection } else if(intent .getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) { // no Internet connection, send network state changed EventBus.getDefault().post(new NetworkStateChanged(false)); } } // event public class NetworkStateChanged { private mIsInternetConnected; public NetworkStateChanged(boolean isInternetConnected) { this.mIsInternetConnected = isInternetConnected; } public boolean isInternetConnected() { return this.mIsInternetConnected; } } public class HomeActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); // register EventBus } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); // unregister EventBus } // method that will be called when someone posts an event NetworkStateChanged public void onEventMainThread(NetworkStateChanged event) { if (!event.isInternetConnected()) { Toast.makeText(this, "No Internet connection!", Toast.LENGTH_SHORT).show(); } } }
  46. 2 likes
    با آمدن ORM‌ها به دنیای برنامه نویسی، کار برنامه نویسی نسبت به قبل ساده‌تر و راحت‌تر شد. عدم استفاده کوئری‌های دستی، پشتیبانی از چند دیتابیس و از همه مهمتر و اصلی‌ترین هدف این ابزار "تنها درگیری با اشیا و مدل شیء گرایی" کار را پیش از پیش آسان‌تر نمود. در این بین به راحتی می‌توان چندین نمونه از این ORM‌ها را نام برد مثل IBatis , Hibernate ,Nhibernate و EF که از معروفترین آن‌ها هستند.من در حال حاضر قصد شروع یک پروژه اندرویدی را دارم و دوست دارم بجای استفاده‌ی از Sqlitehelper، از یک ORM مناسب بهره ببرم که چند سوال برای من پیش می‌آید. آیا ORM ای برای آن تهیه شده است؟ اگر آری چندتا و کدامیک از آن‌ها بهتر هستند؟ شاید در اولین مورد کتابخانه‌ی Hibernate جاوا را نام ببرید؛ ولی توجه به این نکته ضروری است که ما در مورد پلتفرم موبایل و محدودیت‌های آن صحبت می‌کنیم. یک کتابخانه همانند Hibernate مطمئنا برای یک برنامه اندروید چه از نظر حجم نهایی برنامه و چه از نظر حجم بزرگش در اجرا، مشکل زا خواهد بود و وجود وابستگی‌های متعدد و دارا بودن بسیاری از قابلیت‌هایی که اصلا در بانک‌های اطلاعاتی موبایل قابل اجرا نیست، باعث می‌شود این فریمورک انتخاب خوبی برای یک برنامه اندروید نباشد.معیارهای انتخاب یک فریم ورک مناسب برای موبایل: سبک بودن: مهمترین مورد سبک بودن آن است؛ چه از لحاظ اجرای برنامه و چه از لحاظ حجم نهایی برنامه سریع بودن: مطمئنا ORM‌های طراحی شده‌ی موجود، از سرعت خیلی بدی برخوردار نخواهند بود؛ اگر سر زبان هم افتاده باشند. ولی باز هم انتخاب سریع بودن یک ORM، مورد علاقه‌ی بسیاری از ماهاست. یادگیری آسان و کانفیگ راحت تر. greenDAO-master.zip
  47. 2 likes
    اینکار امکان پذیر نیستش ،فقط میتونید اینکارو کنید که مجوز ها به صورت گروهی داده شود activity_main.xml <?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.mpermissions.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> <RelativeLayout android:id="@+id/content_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="info.androidhive.mpermissions.MainActivity" tools:showIn="@layout/activity_main"> <Button android:id="@+id/btnLaunchMultiplePermission" android:layout_below="@+id/imageView" android:layout_marginTop="20dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Request Multiple Permissions"/> <Button android:id="@+id/btnLaunchPermissionFragment" android:layout_below="@+id/btnLaunchMultiplePermission" android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Request Permission on Fragment"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/single_permission_text" android:textAlignment="center" android:layout_alignParentBottom="true" android:layout_alignParentStart="true" android:layout_marginBottom="123dp" /> </RelativeLayout> <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" app:srcCompat="@drawable/ic_file_download_black_24dp" /> </android.support.design.widget.CoordinatorLayout> Manifest : <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> import android.Manifest; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MultiplePermissionsActivity extends AppCompatActivity { private static final int PERMISSION_CALLBACK_CONSTANT = 100; private static final int REQUEST_PERMISSION_SETTING = 101; String[] permissionsRequired = new String[]{Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}; private TextView txtPermissions; private Button btnCheckPermissions; private SharedPreferences permissionStatus; private boolean sentToSettings = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_multiple_permissions); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); permissionStatus = getSharedPreferences("permissionStatus",MODE_PRIVATE); txtPermissions = (TextView) findViewById(R.id.txtPermissions); btnCheckPermissions = (Button) findViewById(R.id.btnCheckPermissions); btnCheckPermissions.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(ActivityCompat.checkSelfPermission(MultiplePermissionsActivity.this, permissionsRequired[0]) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(MultiplePermissionsActivity.this, permissionsRequired[1]) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(MultiplePermissionsActivity.this, permissionsRequired[2]) != PackageManager.PERMISSION_GRANTED){ if(ActivityCompat.shouldShowRequestPermissionRationale(MultiplePermissionsActivity.this,permissionsRequired[0]) || ActivityCompat.shouldShowRequestPermissionRationale(MultiplePermissionsActivity.this,permissionsRequired[1]) || ActivityCompat.shouldShowRequestPermissionRationale(MultiplePermissionsActivity.this,permissionsRequired[2])){ //Show Information about why you need the permission AlertDialog.Builder builder = new AlertDialog.Builder(MultiplePermissionsActivity.this); builder.setTitle("Need Multiple Permissions"); builder.setMessage("This app needs Camera and Location permissions."); builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); ActivityCompat.requestPermissions(MultiplePermissionsActivity.this,permissionsRequired,PERMISSION_CALLBACK_CONSTANT); } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.show(); } else if (permissionStatus.getBoolean(permissionsRequired[0],false)) { //Previously Permission Request was cancelled with 'Dont Ask Again', // Redirect to Settings after showing Information about why you need the permission AlertDialog.Builder builder = new AlertDialog.Builder(MultiplePermissionsActivity.this); builder.setTitle("Need Multiple Permissions"); builder.setMessage("This app needs Camera and Location permissions."); builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); sentToSettings = true; Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivityForResult(intent, REQUEST_PERMISSION_SETTING); Toast.makeText(getBaseContext(), "Go to Permissions to Grant Camera and Location", Toast.LENGTH_LONG).show(); } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.show(); } else { //just request the permission ActivityCompat.requestPermissions(MultiplePermissionsActivity.this,permissionsRequired,PERMISSION_CALLBACK_CONSTANT); } txtPermissions.setText("Permissions Required"); SharedPreferences.Editor editor = permissionStatus.edit(); editor.putBoolean(permissionsRequired[0],true); editor.commit(); } else { //You already have the permission, just go ahead. proceedAfterPermission(); } } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == PERMISSION_CALLBACK_CONSTANT){ //check if all permissions are granted boolean allgranted = false; for(int i=0;i<grantResults.length;i++){ if(grantResults[i]==PackageManager.PERMISSION_GRANTED){ allgranted = true; } else { allgranted = false; break; } } if(allgranted){ proceedAfterPermission(); } else if(ActivityCompat.shouldShowRequestPermissionRationale(MultiplePermissionsActivity.this,permissionsRequired[0]) || ActivityCompat.shouldShowRequestPermissionRationale(MultiplePermissionsActivity.this,permissionsRequired[1]) || ActivityCompat.shouldShowRequestPermissionRationale(MultiplePermissionsActivity.this,permissionsRequired[2])){ txtPermissions.setText("Permissions Required"); AlertDialog.Builder builder = new AlertDialog.Builder(MultiplePermissionsActivity.this); builder.setTitle("Need Multiple Permissions"); builder.setMessage("This app needs Camera and Location permissions."); builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); ActivityCompat.requestPermissions(MultiplePermissionsActivity.this,permissionsRequired,PERMISSION_CALLBACK_CONSTANT); } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.show(); } else { Toast.makeText(getBaseContext(),"Unable to get Permission",Toast.LENGTH_LONG).show(); } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_PERMISSION_SETTING) { if (ActivityCompat.checkSelfPermission(MultiplePermissionsActivity.this, permissionsRequired[0]) == PackageManager.PERMISSION_GRANTED) { //Got Permission proceedAfterPermission(); } } } private void proceedAfterPermission() { txtPermissions.setText("We've got all permissions"); Toast.makeText(getBaseContext(), "We got All Permissions", Toast.LENGTH_LONG).show(); } @Override protected void onPostResume() { super.onPostResume(); if (sentToSettings) { if (ActivityCompat.checkSelfPermission(MultiplePermissionsActivity.this, permissionsRequired[0]) == PackageManager.PERMISSION_GRANTED) { //Got Permission proceedAfterPermission(); } } } } Download Sample M Permissions.zip
  48. 2 likes
    سلام به تمام کاربران عزیز پوستر تبریک سال نو برای عکس پروفایل یا شبکه های اجتماعی آماده دانلود می باشد تبریک سال نو برای شما عزیزان ایشالله ساله خوبی رو داشته باشید . دستون دارم
  49. 2 likes
    [align=center]سلام امروز با یک سورس کتاب اندرویدی فوق العاده با امکانات پیشرفته خدمت شما هستم. این سورس با حجم بسیار کم و سرعت بسیار بالا است و برای اندروید استودیو است و در ایکلیس اجرا نمی شود در ضمن قبل از ایمپورت کردن سورس در اندروید استودیو به ف*ی*ل*ت*ر* شکن وصل باشید تا کتابخانه های مورد نیاز را به صورت اتوماتیک دانلود کند.[/align] تصاویر : [align=center][/align] [align=center]http://i.stack.imgur.com/jtKC8.png[/img][/align] [align=center][/align] [align=center] لایک یادت نره http://p30droid.com/images/smilies/heart.gif[/img][/align] [align=center] دانلود سورس برای اندروید استودیو[/align]
  50. 2 likes
    یکی از امکاناتی که اندروید پیاده سازی شده AutoStartUp کردن اپلیکیشن میباشد بدین صورت وقتی که دیواس اندروید ریبوت یا روشن شد برنامه ما بصوت اتوماتیک اجرا شود. در این آموزش قصد داریم این امکان را پیاده سازی کنیم. ابتدا یک کلاس به نام BootUpReceiver را ایجاد میکنیم: public class BootUpReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Intent i = new Intent(context, Dashboard.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } در این کلاس ما از کلاس BroadcastReceiver ارث بری کرده و این کلاس باعث میشود در پس زمینه اجرا شود ، این کلاس باعث میشود همیشه در حال اجرا باشد. بعد از روشن شدن دیوایس باعث میشود اکتیویتی Dashboard باز شود. سپس در فایل اندروید مانیفست پروژه: <aplication> <receiver android:enabled="true" android:name=".BootUpReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> </aplication> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> انجمن پی سی دروید....