اطلاعیه

کاربر گرامی

به انجمن برنامه نویسی AnswerCenter.ir خوش آمدید

 برای استفاده از تمامی امکانات سایت لطفا در انجمن عضو شوید


مهران محمودی

مدیر بازنشسته
  • تعداد ارسال ها

    480
  • تاریخ عضویت

  • آخرین بازدید

  • روز های برد

    12

آخرین بار برد مهران محمودی در اسفند 29 2017

مهران محمودی یکی از رکورد داران بیشترین تعداد پسند مطالب است!

4 دنبال کننده

درباره مهران محمودی

  • درجه
    مدیر بازنشسته
  • تاریخ تولد 10/04/1998

روش های تماس

  • اسکایپ
    Meran.Mahmoudi
  • آدرس سایت
    http://AnswerCenter.ir
  • یاهو
    MehranMahmoudi1119

مشخصات پروفایل

  • محل زندگی
    قزوین
  • محل تولد
    قزوین
  • علایق
    -
  • شغل
    -

آخرین بازدید کنندگان نمایه

2,113 بازدید کننده نمایه
  1. اخطار موقع خروجی

    سلام، کاربر گرامی بنده متوجه شدم که چند روز اخیر درگیر کامپایل کردن سورس تلگرام هستید. به احتمال زیاد دلیل اینکه به مشکل میخورید اینه که بخشی از تلگرام (نسخه اندروید رو در جریان هستم) با سی پلاس پلاس نوشته شده. لذا نیازمند NDK هست. فایل رو از گیت هاب دانلود میکنید و بعد داخل اندروید استودیو Import میشه؟ توصیه میکنم اول سورس کد رو Fork کنید روی اکانت گیت هاب خودتون و بعدش از طریق منوی VCS اندروید استودیو و اضافه کردن Remote به اکانت گیت هاب خودتون + Clone کردن سورس، به اندروید استودیو اجازه بدید خودش سورس رو از اونجا دریافت کنه و پروژه بسازه. اینکار باعث میشه Gradle رو به سازگارترین حالت ممکن بسازه و اگر هم مشکلی هست، روی سایر بخش ها باشه و چندان چالشی روی همگام سازی Gradle گریبان گیر شما نشه. کار با Version Control ها مبحث گسترده و کارآمدیِ که متاسفانه در ایران خیلی خوب بهشون توجه نمیشه. شخصا در بسیاری از تیم های برنامه نویسی متوجه شدم که برنامه نویس ها ازش استفاده نمیکنند! بنده کمکی از دستم برنمیاد که بگم از چه راهی وارد بشید تا این مشکلات رفع بشن، ولی اطلاعاتی که داشتم رو در اختیارتون گذاشتم شاید کمکتون کنه! تا جایی که میتونید Android SDK خودتون رو کامل کنید. از بخش Extras در SDK Manager فایل های LLDB و CMAKE و NDK رو دانلود کنید. Android Gradle Plugin خودتون رو به بالاترین نسخه ش ارتقا بدید. نسخه Android Studio رو به بالاترین نسخه ش ارتقا بدید. از به روز بودن Android Sdk Tools و Build-Tools خودتون مطمئن بشید. سورس رو که گرفتید از بخش File - Project Structure مسیر NDK رو به پروژه معرفی کنید. ضمنا بهتره نام پوشه دانلودی NDK رو به ndk-bundle تغییر بدید و سپس به پروژه معرفی کنید. در نهایت باید این رو بگم بسیاری از برنامه نویس های پیشروی اندروید، روی Linux با اندروید استودیو کار میکنن. سرعتش روی لینوکس تقریبا 3 برابر ویندوز میشه! چرا که هسته اندروید بر پایه لینوکس نوشته شده و این باعث میشه بسیاری از ابزار مورد نیاز رو شما روی لینوکس راحت تر داشته باشید. لپ کلام: اغلب تلگرام های غیر رسمی (و البته اکثر اپلیکیشن های Play Store و بخش زیادی از اپلیکیشن های حرفه ای کافه بازار) در محیطی برپایه یونیکس (مکینتاش و یا لینوکس) نوشته شدن و روی ویندوز، اندروید کار کردن غیر منطقیه! (این حرف رو بسیاری از توسعه دهندگان کاربلد اندروید بارها و بارها زدن) کامپایل گرفتن تلگرام هم نه که غیرممکن باشه! بلکه کمی دشواره اگه به ابزار و مفاهیم کلی اندروید تسلط نداشته باشید طاقت فرساست. الفبای موضوع چیزِ پیچیده ایه! امیدوارم موفق بشید. موفق باشید!
  2. عدم نشان دادن فیلد خالی در دیتابیس در spinner

    سلام، کدهایی که دوستان دادن مشکلتون رو حل میکنه به نظرم. منتهی بنده پیشنهاد میکنم ساختار پایگاه داده تون رو درست کنید. برای چنین چیزی (اگه درست متوجه شده باشم هر ستون نام استان رو داره و سطرهاش شامل شهرهای اون استان میشن) در اصل شما باید دو جدول مجزا داشته باشید که با یکدیگر ارتباط دارن. مثال: جدول Province (استان): فیلد Id: حاوی یک مقدار عددی که میتونه Auto Increment باشه و به شکل خودکار بهش اضافه بشه. فیلد Name: نام استان جدول City (شهر): فیلد Id: میتونه اختیاری باشه. ولی بهتره که وجود داشته باشه (مثل فیلد Id جدول Province) فیلد ProvinceID: کلید خارجی که با فیلد Id جدول Province ارتباط داره، در مثالی که میزنم بهتر متوجه میشید. فیلد Name: نام شهر مثال: در جدول Province سطرهایی به این شکل وجود داره: 1 تهران 2 قزوین در جدول City: 1 2 قزوین 2 2 تاکستان 3 1 تهران 4 1 ورامین 5 1 لواسان 6 1 شمیران 7 1 قرچک 8 2 آوج شما متوجه میشید شهر "ورامین" متعلق به استانی هست که در جدول Province مقدار Id برابر با 1 هستش. و از اونجا هم میفهمید که در جدول Province شهر تهران دارای Id برابر 1. پس میشه این نتیجه رو گرفت: شهر ورامین متعلق به استان تهران هستش. پایگاه داده از این نظر که میتونه قلب تپنده یک اپلیکیشن محسوب بشه، شدیدا حائز اهمیت هستش و باید به درستی طراحی بشه. جزء اصول اولیه طراحی یک اپلیکیشن، آماده سازیِ دیتابیس اونه! کاملا قبل از شروع کدنویسی... اصولا یه شغلِ مجزاست در تیم های نرم افزاری! ولی خب ما تو ایرانیم :-) توصیه من اینه که ساختار رو صحیح طراحی کنید، اگر به این شکل جلو برید احتمالا تو دیتابیس دچار پدیده ای به نام "افزونگی" میشید که برای یک اپلیکیشن آفتِ بزرگیه! ضمن اینکه توسعه دادنش هم در آینده سخت تر میشه. موفق باشید.
  3. ارور Plugin with id 'com.android.application not found'

    سلام، لطفا محتویات فایل build.gradle مربوط به پروژه تون رو اینجا قرار بدید که بتونیم ببینیم. اینی که گذاشتید برای ماژول app هستش. نسخه اندروید استودیو رو هم ذکر کنید.
  4. تبدیل برنامه من به عنوان برنامه پیشنهادی

    بله درسته، باید Intent رو در لحظه اجرا شدن تو اکتیویتی کنترلش کنید. برای دریافت Intent ای که باعث اجرا شدن اکتیویتی شده، میتونید از کد زیر استفاده کنید: Dim startingIntent As Intent startingIntent = Activity.GetStartingIntent و برای استفاده از مقادیر موجود در Intent هم از کدهایی با ساختار زیر استفاده کنید (با توجه به نیازتون نام Key رو تغییر بدید): startingIntent.GetData startingIntent.GetExtra("key")
  5. گرفتن اطلاعات در مودال

    سلام، برای رفع خطا راهکار دقیقی مد نظرم نیست. جز اینکه پیشنهاد کنم نسخه B4A تون رو بروزرسانی کنید و از آخرین نسخه ی منتشر شده (7.80) استفاده کنید. از بروز بودن کتابخانه Core هم مطمئن بشید (آخرین نسخه ای که من از کتابخانه Core دارم نسخه ی 7.28 هست) گویا این دستور در نسخه های جدید B4A اضافه شده. علی الحساب از سمپلی که پیوست کردم استفاده کنید. (کدهای سمپل اصلی رو بدون استفاده از دستور WaitFor نوشتم) موفق باشید. DialogsSample.zip
  6. گرفتن اطلاعات در مودال

    سلام، پیشنهاد بنده استفاده از کلاس جدیدی هستش که به کتابخانه Dialogs اضافه شده (نسخه 4.01) به نام CustomLayoutDialog نسخه جدید کتابخانه + مثالی که همراهش هست رو براتون رو پیوست کردم. تصویر زیر نتیجه کار رو نشون میده: موفق باشید. DialogsExample.rar
  7. تبدیل برنامه من به عنوان برنامه پیشنهادی

    سلام، قاعدتا باید به شکل زیر باشه: از منوی Project گزینه Android Manifest رو انتخاب کنید و تمام کدهایی که @Gray Mind عزیز گذاشتن رو به این شکل در انتهاش قرار بدید: AddActivityText(BaseActivity,<intent-filter> <action android:name="android.intent.action.MUSIC_PLAYER" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.APP_MUSIC" /> <category android:name="android.intent.category.MULTIWINDOW_LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="content" /> <data android:host="media" /> <data android:mimeType="audio/*" /> <data android:mimeType="application/ogg" /> <data android:mimeType="application/x-ogg" /> <data android:mimeType="application/itunes" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="file" /> <data android:mimeType="audio/*" /> <data android:mimeType="application/ogg" /> <data android:mimeType="application/x-ogg" /> <data android:mimeType="application/itunes" /> </intent-filter>) BaseActivity نام اون Activity هستش که قراره عملیات اجرا رو انجام بده، شما نام Activity خودتون رو قرار بدید. بنده صرفا کدهای ایشون رو در قالب قابل استفاده برای Basic4Android گفتم. دقت نکردم که ببینم مشکلتون رو حل میکنه یا نه! ولی با یه نگاه اجمالی به نظرم مشکلی نداره. حتی اگه مشکلی بود با کمی مطالعه در مورد Intent-Filterها رفع میشه. ضمنا سه تا intent-filter آخری رو هم حذف کردم بابت اینکه به نظرم به کارتون نمیومد. موفق باشید.
  8. استفاده از عکس داخل چند عکس

    الان متوجه شدم! با ابزارهایی مثل Photoshop که از پس زمینه Transparent پشتیبانی میکنن میتونید اینکار رو انجام بدید. ناحیه اطراف آیکن مورد نظرتون رو انتخاب کنید، Ctrl + C بزنید. از منوی فایل گزینه New رو انتخاب کنید. Document type رو روی Clipboard و اگر پس زمینه شفاف میخواید، Background Contents رو روی Transparent تنظیم کنید. در صفحه باز شده، Ctrl + V رو بزنید و با فرمت PNG ذخیره کنید. با اینکار میتونید تمام آیکن ها رو اسخراج کنید، یه نمونه رو پیوست کردم. --------- پیشنهاد میکنم اگر از اندروید استودیو استفاده میکنید، از تصاویر Vector بهره ببرید. با فرمت SVG داخل اندروید استودیو Import کنید. حجم نسبتا کمتری دارن و مشخصه قابل توجهشون اینه که هیچ تفاوتی در کیفیت تصاویر با تغییر اندازه اون ها نمیبینیم (چون از لحاظ ساختار، بُرداری هستن، با استفاده از منحنی های ریاضی رسم میشن و از پیکسل تشکیل نشدن و نمونه ی بارزش که قطعا هممون دیدیم، فونت ها هستن که با هر اندازه ای کیفیت مطلوبی دارن) بنده از B4A جز برای این اینجا استفاده ای نمیکنم و کارم با Android Studio هستش. بابت همین هم هیچ اطلاعی ندارم که آیا در B4A هم میتونیم از تصاویر SVG استفاده کنیم یا خیر. تحقیق میکنم اگر ممکن بود در اولین فرصت مطلبی رو راجع بهش ارائه میدم. موفق باشید.
  9. باز کردن برنامه ی من از طریق مرورگر گوشی

    سلام، این چند وقت که بیشتر هستم اینجا میبینم گاهی سوالات خوبی داره پرسیده میشه! سوال شما هم جالب و کاربری بود. در نظر داشتم در اولین فرصت مطلبی رو در موردش بنویسم. ------ کار سختی نیست. یه Activity جدید بسازید با نام مثلا ExampleActivity از منوی Project گزینه Manifest Editor، در انتهاش دستورات زیر رو اضافه کنید: AddActivityText(ExampleActivity,<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="answercenter.ir" android:scheme="https" /> </intent-filter>) در مورد تمام المنت های استفاده شده در این دستورات، میتونید در مقالات developer.android.com مطالعه کنید. من فقط بخش حائز اهمیتش که باعث میشه برنامتون به یه سری لینک های خاص حساس بشه رو توضیح میدم، کد زیر هستش که با تغییرش میتونید به هدف خودتون برسید: <data android:host="answercenter.ir" android:scheme="https" /> در واقع android:scheme بیانگر پروتکل استفاده شده و android:host معرف آدرس دامنه هستش. حالا برنامه شما میره جزء برنامه هایی که میتونن آدرس https://answercenter.ir رو کنترل و اجرا (به اصطلاح Handle) کنن. (مثل تلگرام که t.me رو داره یا اینستاگرام که instagram.com رو میبره تو اپلیکیشنش و ...) همین کار کافیه! برای تست و بررسیش همین برنامه رو روی دستگاه نصب کنید. با مرورگر گوشی برید به آدرس https://answercenter.ir و روی یکی از لینک های سایت که با https://answercenter.ir شروع میشه کلیک کنید، میبینید که برنامه پیشنهاد میشه برای اجرا کردنش. نکته آخر: برای دریافت اطلاعات ارسال شده در درون ExampleActivity و در داخل Activity_Create: Dim intentData As String : intentData = Activity.GetStartingIntent.GetData ToastMessageShow(intentData , True) که intentData حاوی یک لینک هستش (لینکی که برنامه رو اجرا کرده) موفق باشید.
  10. استفاده از عکس داخل چند عکس

    سلام، به شدت نامفهوم و گنگ! اصلا نتونستم متوجه منظورتون بشم متاسفانه. و نامفهوم ترین بخشش هم همینه: بالاخره یک عکس یا چند عکس؟!!! میتونید تصویر از چیزی که میخواید بذارید؟ یا بهتر توضیح بدید که بتونیم کمکتون کنیم.
  11. تشخیص مدل دستگاه

    سلام، Dim phone As Phone Dim val As String val = phone.Manufacturer val =val & " " & phone.Model ToastMessageShow(val,False) خروجی روی گوشی: Samsung SM-G530H روی شبیه ساز: unknown Google nexus 4 - 5.0.0 - API 21 - 768x1280 بررسی هاتون اشتباه نبوده احیانا ؟!
  12. قطع و وصل GPS

    سلام، محبت کنید تاپیک قدیمی رو بروز نکنید. برای مشکلتون تاپیک جدید مطرح کنید. در نسخه های اخیر اندروید نمیتونید GPS رو بدون اجازه کاربر خاموش/روشن بکنید. مگر با دسترسی روت، یا معرفی برنامه خودتون به عنوان سیستمی و ... که هر کدوم چالش خودش رو داره. برای دریافت مختصات از GPS در سطح سنسور، از ACCESS_COARSE_LOCATION استفاده کنید و برای دریافت آن در سطح اینترنت از ACCESS_FINE_LOCATION . سورسی که در لینک بالا هست، کمکتون میکنه کاربر رو به صفحه تنظیمات GPS هدایت کنید که خودش خاموش یا روشنش کنه و بعد مختصات رو دریافت میکنه. پیشنهاد میکنم در فایل مانیفست اون، دسترسی ACCESS_COARSE_LOCATION رو هم اضافه کنید. نکته حائز اهمیت هم اینه که دسترسی GPS از اندروید 6 به بعد جزء دسترسی های حساس محسوب میشه، مطلب پایین کامل توضیح داده: باقیش به همت خودتون مربوطه! من به اندازه ای که نیاز داشتید راهنماییتون کردم. موفق باشید.
  13. دریافت json با آبجکت های ناهمنام

    سلام، دوستان روش های جالبی ارائه کردن، منتهی بنده هم این رو پیشنهاد میکنم که کار با کتابخانه Gson رو که خود گوگل ارائه میکنه یاد بگیرید، برای Serialize (تبدیل شیء به متن Json) و Deserialize (تبدیل متن Json به شیء) فوق العاده کار ما رو آسان میکنه و گفتنش خالی از لطف نیست! فایلی که پیوست کردم رو دانلود کنید و از حالت فشرده خارجش کنید. از منوی File به زیرمنوی New برید و New Module رو انتخاب کنید. از پنجره باز شده گزینه Import JAR/.AAR Package رو انتخاب کنید و Next بزنید. فایلی که از حالت فشرده خارج کردید رو انتخاب کنید و Next بزنید تا به پروژه تون اضافه بشه. حالا به از منوی File گزینه Project Structure رو انتخاب کنید. در سمت چپ پنجره باز شده، در بخشِ Modules گزینه app رو انتخاب کنید. به زبانه آخر یعنی Dependencies برید و روی علامت بعلاوه سبز رنگی که در سمت راستش وجود داره کلیک کنید و Module dependency رو انتخاب کنید. دوباره از پنجره باز شده، gson رو انتخاب کرده و تمام پنجره ها رو اوکی کنید و اجازه بدید که Gradle کاملا همگام سازی بشه. داخل پرانتز: همه اینها رو گفتم و راه پیچیده ای بود، اگه به V-P-N دسترسی دارید میتونید با اضافه کردن خط زیر به فایل build.gradle متعلق به app در اندروید استودیو اجازه بدید خودش کتابخانه رو دانلود و به پروژه اضافه کنه. compile 'com.google.code.gson:gson:2.8.2' خب، کتابخانه به پروژه اضافه شد. باید بپردازیم به بحث اصلی که همون Deserialize کردن متن JSON هستش. برای اون JSON که آوردید، باید به این شکل کلاس تعریف کنید که هنگام کار با کتابخانه Gson مشکلی نباشه. public class GeneralModel { JsonItem Data1; JsonItem xyz; JsonItem abc; // و اگر ادامه داره اشیاتون، همش رو همینجا تعریف کنید // به دلیل استاندارد نبودن جیسون } public class JsonItem { String index1; String name; } به این شکل هم JSON خودتون رو به نمونه ای از این کلاس ها تبدیل کنید: Gson g = new Gson(); GeneralModel generalModel = g.fromJson(response, GeneralModel.class); به همین سادگی!! حالا شما یه شیء دارید که اطلاعاتتون داخلش قرار گرفته. مقادیر به این شکل هستش: // generalModel.Data1.name = dan // generalModel.Data1.index1 = 4 // generalModel.abc.name = jordan // generalModel.abc.index1 = 5 // generalModel.xyz.name = jimi // generalModel.xyz.index1 = 2 ولی پیشنهاد میکنم JSON خودتون رو کمی استاندارد کنید. کار کردن با JSON هایی به این شکل که یه بخشیشون بی قاعده و همواره متغیر باشه کمی سخت و البته غیر منطقیه! منتهی به این روشی که گفتم میتونید JSON رو به شیء تعریف بکنید که روش پیشنهادی خودِ گوگل هم هستش! برای تولید متن JSON هم میتونید از همین کتابخانه استفاده کنید. لینک Github برای مطالعه بیشتر موفق باشید. gson-2.8.2.zip
  14. آموزش اندروید - دسترسی های زمان اجرا

    سلام، همونطور که میدونید از اندروید نسخه 6 به بعد بعضی از دسترسی ها نیازمند این هستند که در زمان اجرا از کاربر درخواست بشن. مطلب زیر، در سایت B4X.COM وجود داره که بنده ترجمه و بعضی توضیحات تکمیلی رو بهش اضافه کردم تا کاملا قابل فهم باشه. پیشنهاد میکنم که مطالعه کنید، نکات خوبی ارائه شده. ------------- موضوع: دسترسی های زمان اجرا این یک امکان اختیاری است. تنها در صورتی اجباری محسوب میشود که (مشخصه) android:targetSdkVersion (در Manifest) برابر با 23 یا بالاتر باشد. اگر targetSdkVersion پایینتر از 23 باشد، فرایند استاندارد دسترسی ها روی دستگاه اجرا میشود. (حتی اگر اندروید بالای 6 داشته باشند) نسخه 6.0 نرم افزار B4A (و بالاتر) از "دسترسی های زمان اجرا" پشتیبانی میکند. نکته زیبای "دسترسی های زمان اجرا" این است که هنگام نصب نرم افزارِ شما از Play Store هیچ دسترسی ای از کاربر درخواست نمیشود و در عوض، هنگام اجرای برنامه از آنها درخواست تایید دسترسی های حساس میشود. خوشبختانه بسیاری از دسترسی ها به عنوان دسترسی حساس محسوب نمیشوند. شما میتوانید لیست دسترسی های حساس را در لینک زیر ببینید: https://developer.android.com/guide/topics/permissions/requesting.html#perm-groups (به دلیل تحریم ایران، لیست دسترسی های حساس در زیر آورده شده است) READ_CALENDAR WRITE_CALENDAR CAMERA READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION RECORD_AUDIO READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS BODY_SENSORS SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE درخواست دسترسی در زمان اجرای برنامه مثال: Sub Process_Globals Private rp As RuntimePermissions End Sub Sub Globals Private gmap As GoogleMap Private MapFragment1 As MapFragment End Sub Sub Activity_Create(FirstTime As Boolean) Activity.LoadLayout("1") End Sub Sub MapFragment1_Ready gmap = MapFragment1.GetMap rp.CheckAndRequest(rp.PERMISSION_ACCESS_FINE_LOCATION) End Sub Sub Activity_PermissionResult (Permission As String, Result As Boolean) If Permission = rp.PERMISSION_ACCESS_FINE_LOCATION Then gmap.MyLocationEnabled = Result End If End Sub بخش کلیدی این فرایند، متد RuntimePermissions.CheckAndRequest میباشد. منطق (الگوریتم) این متد (ساده شده): If <user has already approved> Or <older device> Then Activity_PermissionResult (Permission, True) Else ShowDialog Activity_PermissionsResult (Permission, Dialog result) End If ( توضیحات تکمیلی: شرط اول به این شکل عمل میکنه که اگه کاربر قبلا درخواست این دسترسی رو تایید کرده بود یا نسخه اندروید پایینتر از 6 داشت، در واقع برنامه دسترسی انجامِ اون کار رو داره و بدون مشکل میتونه به کارش ادامه بده، در غیر اینصورت دسترسی رو از کاربر درخواست میکنه و به برنامه اعلام میکنه که هنوز دسترسی لازم رو نداره ) متد CheckAndRequest یک متد مسدود کننده (ایجاد کننده تاخیر در برنامه، بلا استفاده شدن برنامه با اجرای آن) نیست. روند اجرای نرم افزار ادامه پیدا میکند و بعد از آن رویداد Activity_PermissionResult به اجرا در می آید. متد CheckAndRequest تنها میتواند از درون یک Activity صدا زده شود. متد دیگری به نام Check وجود دارد که تنها بررسی میکند آیا دسترسی مورد نظر قبلا تایید شده است یا خیر. این متد میتواند از هر ماژولی در برنامه صدا زده شود. شاید وسوسه انگیز باشد که در ابتدا بررسی کنیم آیا دسترسی مورد نیاز داده شده است یا نه و اگر وجود نداشت، آن را درخواست کنیم! در حالی که این کار فقط روند اجرای نرم افزار را پیچیده میکند به شکلی که شما مجبور به سر و کار داشتن با تمام این موارد میشوید. به عنوان یک قاعده کلی، شما نباید متد RuntimePermissions.Check را از یک Activity صدا بزنید (و استفاده کنید)، همواره ساده ترین راه استفاده از CheckAndRequest میباشد. لیست کردن دسترسی های برنامه بسیاری از این موضوع آگاه نیستند که میتوان دسترسی های پروژه را با کلیک کردن برروی دکمه List Permissions در زبانه Logs مشاهده کرد: در B4A نسخه های بالاتر از 6، دسترسی های حساس با * مشخص شده اند. شما نیازی به درخواست مجوز (در زمان اجرای برنامه) برای دسترسی های غیرحساس (معمولی) ندارید. READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE این رایج ترین دسترسی حساس میباشد. هنگامی که از File.DirDefaultExternal یا File.DirRootExternal استفاده میکنید، به شکل خودکار به پروژه اضافه میشود. در حالی که یک راه حل ساده برای اینکار وجود دارد. 1- از RuntimePermissions.GetSafeDirDefaultExternal("") به جای File.DirDefaultExternal استفاده کنید. پارامتری که به آن داده میشود، نامِ یک پوشه داخل پوشه پیشفرض (DirDefaultExternal) میباشد. 2- کد زیر را به فایل Manifest خود اضافه کنید: AddManifestText( <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" /> ) توضیحی که میتوان برای کد بالا ارائه کرد، این است که RuntimePermissions.GetSafeDirDefaultExternal هیچ دسترسی خاصی را در دستگاه هایی با اندروید بالای 4.4 (API 18) نیاز ندارد و در دستگاه های پایین 4.4 به دسترسی WRITE_EXTERNAL_STORAGE نیازمند است. کدِ بالا این دسترسی را برای دستگاه های قدیمی اضافه میکند. شما در زمان اجرای برنامه تنها باید با WRITE_EXTERNAL_STORAGE سر و کار داشته باشید اگر نیازمند دسترسی به پوشه ای به جز پوشه پیشفرض خارجی اپلیکیشن خود (File.DirDefaultExternal) دارید. نکات مهم: - شما تنها میتوانید دسترسی هایی را در زمان اجرا درخواست کنید که در Manifest برنامه خود آنها را تعریف کرده باشید (معمولا توسط کامپایلر مورد بررسی قرار میگیرد). - تست و بررسی دسترسی ها میتواند گیج کننده باشد، چرا که کاربر تنها یکبار نیاز به تایید مجوز دسترسی دارد. راه حل، حذف کردن اپلیکیشن از روی دستگاه است. دکمه های Ctrl + P را در محیط برنامه نویسی B4A بفشارید (Clean Project) و دوباره نرم افزار را اجرا کنید. - کاربر مجوز دسترسی گروهی از دسترسی ها را تایید میکند. بنابراین اگر کاربر درخواست مجوز خواندن مخاطبین را تایید کند، دوباره از او درخواست مجوز دسترسی نوشتن در مخاطبین نمیشود (چرا که با تایید دسترسی خواندن مخاطبین، دسترسی نوشتن در آنها نیز به برنامه داده میشود). - دفعه اول که شما نرم افزار خود را با targetSdkVersion برابر با 23 به Google Play بارگذاری کنید، دیگر نمیتوانید مقدار targetSdkVersion را کاهش دهید. * لینک مطلب در سایت مرجع: Android Tutorial - Runtime Permissions (Android 6.0+ Permissions) | B4X Community - Android, iOS, desktop, server and IoT programming tools ------------ نکته: کتابخانه ی مورد نیاز اینکار در لیست کتابخانه های پیشفرض نسخه های اخیر B4A قرار داره و میتونید از اون لیست انتخابش کرده و به برنامه تون اضافه کنید. دوستانِ عزیزی که فرصتش رو دارند، ممنون میشیم اگه سورس کد آموزشی اینکار رو برای بنده بفرستن یا همینجا بذارن که اگه خوب بود پیوست همین پست بکنم! در غیر اینصورت خودم در اولین فرصت اینکار رو انجام و با توضیحات کامل خدمتتون ارائه میدم. ترجمه اختصاصی فارسی و ارائه آموزش از AnswerCenter.IR (مرکز پاسخگویی به سوالات برنامه نویسی) موفق باشید.
  15. ساخت گالری کامل + اشتراک + زوم + ذخیره

    سلام مختار جان، قربونت برم عزیزِدل، تشکر. خدمت نبودم که!! اصلا خدمت نرفتم من هنوز. مشغول کار و درس و ... بودم و البته هنوزم هستم. خیلی وقته در تلاشم که بتونم باز بیام اینجا و فعالیت داشته باشم؛ گویا کم کم داره میسر میشه. در مورد مسابقه به نظرم ایده ی خوبیه که برگزار بشه. خودِ من که توی مسابقات برنامه نویسی شرکت کردم شدیدا توی روند یادگیری و پیشرفت مهارت برنامه نویسیم موثر بود، واسه همین هم طرفدار پر و پا قرص راه افتادن همچین چیزی هستم. اگر اینجا هم بتونیم چنین بستر مناسبی رو راه بندازیم به نظرم حرکتِ جالبی باشه. ولی کلی وقت و انرژی میخواد برای بررسی کارهای شرکت کننده ها، رتبه بندی افراد و الی آخر!! باید بررسی بشه این قضیه و در فرصت مناسب که امکانش بود عملیش کنیم. مطمئنم و میدونم که آقای آرتا فکرهای خوبی برای انجمن دارن و به بهترین شکل میتونن اینجا رو به سمت پیشرفت ببرن. هممون باید دست به دست هم بدیم و ایشون رو در این مسیر یاری کنیم. برگزاری رویدادهای هیجان انگیز و جذاب هم میتونه در دستورکار قرار بگیره... در آخر ممنونم بابت لطفی که بهم داری و پیشنهادات خوبی که به انجمن میدی