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

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

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

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

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

  1. صفحه اطلاعات برنامه (App info) یک برنامه را باز کنید.
  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 Intent.FLAG_GRANT_READ_URI_PERMISSION استفاده کند تا به یک برنامه مشاهده تصویر اجازه دهد تصویر را ببیند.

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

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

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

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

همچنین می‌توانید مجوزها را به صورت برنامه‌نویسی پیکربندی کنید:

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

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