رفتن به مطلب

ارسال های توصیه شده

سلام،

همونطور که میدونید از اندروید نسخه 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 به اجرا در می آید.

 

upload_2016-6-8_14-48-39-png.44797

 

 

متد CheckAndRequest تنها میتواند از درون یک Activity صدا زده شود.

متد دیگری به نام Check وجود دارد که تنها بررسی میکند آیا دسترسی مورد نظر قبلا تایید شده است یا خیر. این متد میتواند از هر ماژولی در برنامه صدا زده شود.

شاید وسوسه انگیز باشد که در ابتدا بررسی کنیم آیا دسترسی مورد نیاز داده شده است یا نه و اگر وجود نداشت، آن را درخواست کنیم! در حالی که این کار فقط روند اجرای نرم افزار را پیچیده میکند به شکلی که شما مجبور به سر و کار داشتن با تمام این موارد میشوید.

به عنوان یک قاعده کلی، شما نباید متد RuntimePermissions.Check را از یک Activity صدا بزنید (و استفاده کنید)، همواره ساده ترین راه استفاده از CheckAndRequest میباشد.

 

لیست کردن دسترسی های برنامه

بسیاری از این موضوع آگاه نیستند که میتوان دسترسی های پروژه را با کلیک کردن برروی دکمه List Permissions در زبانه Logs مشاهده کرد:

 

SS-2016-06-08_15.06.00.png

 

در 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 (مرکز پاسخگویی به سوالات برنامه نویسی)

موفق باشید.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .
توجه: مطلب ارسالی شما پس از تایید مدیریت برای همه قابل رویت خواهد بود.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
  • اضافه کردن...