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

مجوزها فقط برای درخواست عملکرد سیستم نیستند. همچنین می توانید نحوه تعامل سایر برنامه ها با اجزای برنامه خود را محدود کنید.

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

مجوزهای یک برنامه دیگر را بررسی کنید

برای مشاهده مجموعه مجوزهایی که برنامه دیگری اعلام می کند، از یک دستگاه یا شبیه ساز برای تکمیل مراحل زیر استفاده کنید:

  1. صفحه اطلاعات برنامه یک برنامه را باز کنید.
  2. مجوزها را انتخاب کنید. صفحه مجوزهای برنامه بارگیری می شود.

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

تعدادی راه مفید دیگر برای بررسی مجوزها وجود دارد:

  • در طول تماس با یک سرویس، یک رشته مجوز را به Context.checkCallingPermission() ارسال کنید. این روش یک عدد صحیح را برمی گرداند که نشان می دهد آیا آن مجوز به فرآیند فراخوانی فعلی داده شده است یا خیر. توجه داشته باشید که این تنها زمانی قابل استفاده است که شما در حال اجرای تماسی هستید که از فرآیند دیگری دریافت می‌شود، معمولاً از طریق رابط IDL که از یک سرویس منتشر شده است یا به روش دیگری که به فرآیند دیگری داده شده است.
  • برای بررسی اینکه آیا به فرآیند دیگری مجوز خاصی داده شده است یا خیر، فرآیند (PID) را به Context.checkPermission() منتقل کنید.
  • برای بررسی اینکه آیا به بسته دیگری مجوز خاصی داده شده است یا خیر، نام بسته را به PackageManager.checkPermission() ارسال کنید.

تعامل با فعالیت های برنامه خود را محدود کنید

از ویژگی android:permission برای تگ <activity> در مانیفست استفاده کنید تا برنامه های دیگر را محدود کنید که بتوانند آن Activity شروع کنند. مجوز در طول Context.startActivity() و Activity.startActivityForResult() بررسی می شود. اگر تماس گیرنده مجوز لازم را نداشته باشد، یک SecurityException رخ می دهد.

تعامل با خدمات برنامه خود را محدود کنید

از ویژگی android:permission برای تگ <service> در مانیفست استفاده کنید تا برنامه های دیگر را محدود کنید که می توانند شروع کنند یا به Service مرتبط متصل شوند. مجوز در طول Context.startService() Context.stopService() و Context.bindService() بررسی می شود. اگر تماس گیرنده مجوز لازم را نداشته باشد، یک SecurityException رخ می دهد.

تعامل با ارائه دهندگان محتوای برنامه خود را محدود کنید

از ویژگی android:permission برای تگ <provider> استفاده کنید تا برنامه‌های دیگر را محدود کنید که به داده‌های ContentProvider دسترسی داشته باشند. (ارائه دهندگان محتوا یک تسهیلات امنیتی اضافی مهم به نام مجوزهای URI در دسترس دارند که در بخش زیر توضیح داده شده است.) بر خلاف سایر مؤلفه ها، دو ویژگی مجوز جداگانه وجود دارد که می توانید برای ارائه دهندگان محتوا تنظیم کنید: android:readPermission محدودیت هایی را برای سایر مؤلفه ها ایجاد می کند. برنامه‌ها می‌توانند از ارائه‌دهنده بخوانند، و android:writePermission محدودیت می‌دهد که سایر برنامه‌ها بتوانند روی آن بنویسند. توجه داشته باشید که اگر ارائه‌دهنده‌ای با مجوز خواندن و نوشتن محافظت می‌شود، نگه داشتن فقط اجازه نوشتن به برنامه اجازه نمی‌دهد از یک ارائه‌دهنده بخواند.

هنگامی که ارائه دهنده برای اولین بار بازیابی می شود و زمانی که یک برنامه عملیاتی را بر روی ارائه دهنده انجام می دهد، مجوزها بررسی می شوند. اگر برنامه درخواست کننده هیچ یک از این مجوزها را نداشته باشد، یک SecurityException رخ می دهد. استفاده از ContentResolver.query() به مجوز خواندن نیاز دارد. استفاده از ContentResolver.insert() ، ContentResolver.update() ، یا ContentResolver.delete() نیاز به اجازه نوشتن دارد. در همه این موارد، نداشتن مجوز لازم منجر به SecurityException می شود.

اجازه دسترسی بر اساس URI

این سیستم کنترل دقیق بیشتری را بر روی نحوه دسترسی سایر برنامه ها به ارائه دهندگان محتوای برنامه شما فراهم می کند. به ویژه، ارائه‌دهنده محتوای شما می‌تواند با مجوزهای خواندن و نوشتن از خود محافظت کند، در حالی که همچنان به مشتریان مستقیم خود اجازه می‌دهد URI‌های خاصی را با سایر برنامه‌ها به اشتراک بگذارند. برای اعلام پشتیبانی برنامه خود از این مدل، از ویژگی android:grantUriPermissions یا عنصر <grant-uri-permission> استفاده کنید.

شما همچنین می توانید مجوزها را بر اساس URI اعطا کنید. هنگام شروع یک فعالیت یا برگرداندن نتیجه به یک فعالیت، پرچم Intent.FLAG_GRANT_READ_URI_PERMISSION ، پرچم Intent.FLAG_GRANT_WRITE_URI_PERMISSION یا هر دو پرچم را تنظیم کنید. این به برنامه های دیگر مجوز خواندن، نوشتن، یا خواندن/نوشتن را به ترتیب برای URI داده ای که در intent گنجانده شده است می دهد. برنامه‌های دیگر این مجوزها را برای URI خاص به دست می‌آورند، صرفنظر از اینکه مجوز دسترسی به داده‌های ارائه‌دهنده محتوا را دارند یا نه.

به عنوان مثال، فرض کنید یک کاربر از برنامه شما برای مشاهده یک ایمیل با پیوست تصویر استفاده می کند. سایر برنامه ها نباید به طور کلی به محتوای ایمیل دسترسی داشته باشند، اما ممکن است علاقه مند به مشاهده تصویر باشند. برنامه شما می تواند از یک intent و پرچم Intent.FLAG_GRANT_READ_URI_PERMISSION استفاده کند تا به یک برنامه مشاهده تصویر اجازه دهد تصویر را ببیند.

یکی دیگر از موارد قابل مشاهده بودن برنامه است. اگر برنامه شما Android 11 (سطح API 30) یا بالاتر را هدف قرار می دهد، سیستم برخی از برنامه ها را به طور خودکار برای برنامه شما قابل مشاهده می کند و سایر برنامه ها را به طور پیش فرض پنهان می کند. اگر برنامه شما یک ارائه دهنده محتوا داشته باشد و مجوزهای URI را به برنامه دیگری اعطا کرده باشد، برنامه شما به طور خودکار برای آن برنامه دیگر قابل مشاهده است.

برای اطلاعات بیشتر، مواد مرجع برای متدهای grantUriPermission() ، revokeUriPermission() و checkUriPermission() را مشاهده کنید.

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

از ویژگی android:permission برای تگ <receiver> استفاده کنید تا برنامه های دیگر را محدود کنید که بتوانند به BroadcastReceiver مرتبط ارسال کنند. مجوز پس از بازگشت Context.sendBroadcast() بررسی می شود، زیرا سیستم سعی می کند پخش ارسالی را به گیرنده داده شده تحویل دهد. این بدان معناست که شکست مجوز منجر به بازگرداندن یک استثنا به تماس‌گیرنده نمی‌شود - فقط Intent را ارائه نمی‌کند.

به همین ترتیب، می‌توانید مجوزی به Context.registerReceiver() بدهید تا کنترل کند کدام برنامه‌های دیگر می‌توانند به یک گیرنده ثبت‌شده برنامه‌ای پخش شوند. از طرف دیگر، می‌توانید هنگام فراخوانی Context.sendBroadcast() یک مجوز برای محدود کردن گیرنده‌های پخشی که می‌توانند پخش را دریافت کنند، ارائه کنید.

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