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

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

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

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

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

  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 خاصی را با برنامه‌های دیگر هم‌رسانی کنند. برای اعلام پشتیبانی برنامه‌تان از این مدل، از مشخصه android:grantUriPermissions یا عنصر <grant-uri-permission> استفاده کنید.

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

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

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

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

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

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

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

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

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