درک امنیت و اجازه ها (permission)
تماشای برخط [لینک مستقیم] فیلم آموزشی «درک امنیت و اجازهها»
زیر نویس انگلیسی [English Subtitle]
دریافت نسخه pdf این آموزش [حجم ۶۶۱ کیلوبایت]
ممکنه تا بحال موقع دانلود و نصب یه برنامه اندرویدی توی گوشیتون، به یه همچین پیغامی برخورده باشید که بهتون میگه این برنامه کاربردی که دارید نصب میکنید، به فلان مجوز نیاز داره. مثلا ممکنه بخواد به دوربین دستگاهتون دسترسی داشته باشه، و اونو اینطوری اعلام کنه: "همونطور که میدونید، این برنامه ای که در حال دانلود اون هستید، قراره به دوربین شما دسترسی داشته باشه، بنابراین بهتره به سازنده این برنامه اعتماد کنید".بنابراین اگر شما میخواید برنامهتون بتونه به چیزای مشخصی از دستگاه دسترسی داشته باشه، لازمه که به صراحت اعلام کنید که من برای استفاده از فلان امکانات مشخص، نیاز به مجوز دارم.
پس بذارید یه برنامه رو بررسی کنیم که بطور مشخص قراره باهاش وضعیت wi-fi دستگاه رو بررسی کنیم. میخوایم بدونیم که آیا wifi اتصال داره یا نه؟ یا در واقع آیا کاربر میتونه از طریق wifi به اینترنت وصل بشه یا نه؟
۱. اول یه پروژه جدید ایجاد میکنیم و به کلاس MainActivity.java میریم.
۲.کاری که قراره انجام بدیم اینه که تو تابع onCreate تلاش کنیم به وضعیت wifi دسترسی داشته باشیم. در اینجا نیاز به ساختن یه نمونه از کلاس ConnectivityManager داریم که من اسمشو به اختصار، conman گذاشتم.
هر وقت نیاز داریم که سرویسی رو از سیستمی بگیریم، باید درخواست دسترسی به اون سرویس رو بدیم. برای این کار از تابع getSystemService استفاده میکنیم. بعدش فقط لازمه اسم اون سرویسی که میخوایم بهش دسترسی داشته باشیم رو وارد کنیم. که تو اینجا بهش از طریق یه ثابت ایستا که تو کلاس Context به نام CONNECTIVITY_SERVICE هست ارجاع میدیم.
ConnectivityManager conman = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
۳. حالا میخوایم، توی متنی که به صورت پیش فرض همه پروژههای جدید دارن، بنویسیم که آیا wifi متصل هست یا نه. و چون به صورت پیش فرض این فیلد متنی شناسه نداره به activity_main.xml می ریم و برای اون یه شناسه تعریف میکنیم.
نحوه تعریف کردن شناسه اینطوره که در فایل activity_main.xml، در تگ TextView مینویسیم "android:id="@id/matneman و چون این اولین باره که این شناسه رو تعریف می کنیم، یه علامت مثبت (+) هم کنار کلمه id می نویسیم، یعنی اینطوری:
android:id="@+id/matneman"
۴. تو تابع onCreate به متنمون داخل xml ارجاع میدیم.
TextView matn = (TextView) findViewById (R.id.matneman);
۵. اطلاعات مربوط به وضعیت wifi رو تو یه متغیر boolan به نام wifi میریزیم. برای همین از کلاس ConnectivityManager استفاده میکنیم. تابع getNetworkInfo اطلاعاتی که بخوایم رو از شبکه میگیره. حالا برای ورودی این تابع باید اون اطلاعاتی که احتیاج داریم رو بدیم، ما الان به اطلاعات wifi احتیاج داریم پس ConnectivityManager.TYPE_WIFI رو به عنوان ورودی وارد میکنیم. چون در آخر نیاز به خروجی از نوع boolean (درست یا نادرست) داریم از تابع isConnectedOrConnecting استفاده میکنیم.
در صورتی که wifi دستگاه اتصال داشته باشه و یا در حال اتصال باشه، پیغام "wifi roshane" نمایش داده میشه.
boolean wifi =conman.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting(); if (wifi)matn.setText("wifi roshane!"); else matn.setText("wifi khamooshe!");
۶. اگه برنامه رو اجرا کنیم، با این خطا موجه میشیم:
7. اگر وارد قسمت DDMS بشیم و LogCat رو بیاریم، میبینیم که مشکل یه استثنای امنیتیه! در واقع ما برای دسترسی به وضعیت شبکه، اجازه نگرفتیم.
8. این اجازه رو باید تو فایل AndroidManifest.xml ثبت کنیم. پس Manifest رو باز میکنیم، داخلش زبانه ی permission دیده میشه.
روی زبانه ی permission کلیک میکنیم و میخوایم به کاربر اعلام کنیم که آیا میتونیم به وضعیت شبکه دسترسی داشته باشیم یا نه؟
پس روی دکمه Add کلیک کرده و Uses Permission رو انتخاب میکنیم.
با انتخاب این گزینه، اعلام میکنیم که این برنامه به فلان اجازه احتیاج داره.
9. با زدن فلش جلوی Name میتونیم اسم همه ی اجازه هایی رو که ممکنه برنامه مون بهش نیاز داشته باشه ببینیم.
تو اینجا به Access_Network_State نیاز داریم.
10. حالا اگه زبانه ی AndroidManifest.xml رو بیاریم، میبینیم که یه خط بهش اضافه شده.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
11. دوباره برنامه رو اجرا میکنیم تا ببینیم شبیه ساز چه متنی رو نشون میده.
میگه wifi خاموشه، چون تو ماشین شبیه ساز اینجا در واقع از اتصال شبکه ای من برای شبیه سازی شبکه ی داده های تلفن همراه استفاده میکنه، و این همون چیزیه که انتظارشو داشتیم.