AndroidManifest Permissions AndroidManifest.xml فائل میں اجازتوں کے اعلانات ہیں جو یہ طے کرتے ہیں کہ ایپلیکیشن کن سسٹم وسائل اور ڈیٹا تک رسائی حاصل کر سکتی ہے۔ Android کو متعلقہ API استعمال کرنے سے پہلے مینی فیسٹ میں ہر اجازت کے اعلان کی ضرورت ہوتی ہے: کیمرہ اور جغرافیائی محل وقوع سے لے کر SMS بھیجنے اور رابطوں تک رسائی تک۔ Android ڈویلپر دستاویزات کے مطابق، ہر اجازت چار تحفظ کی سطحوں میں سے ایک میں آتی ہے: normal، dangerous، signature اور special۔
اہم نکات
AndroidManifest Permissions Android کا سیکیورٹی میکانزم ہے جو ایپلیکیشنز کی محفوظ ڈیٹا اور سسٹم فنکشنز تک رسائی کو کنٹرول کرتا ہے۔ ہر ایپلیکیشن کو
Android کا اجازت ماڈل کئی ارتقائی مراحل سے گزرا ہے۔ Android 6.0 (API 23) سے پہلے، تمام اجازتیں تنصیب کے وقت دی جاتی تھیں — صارف مکمل فہرست دیکھتا تھا اور ایپلیکیشن کی تنصیب سے اتفاق یا انکار کرتا تھا۔ Android 6.0 سے شروع کرتے ہوئے، dangerous سطح کی اجازتیں رن ٹائم پر (Runtime Permissions) درخواست کی جاتی ہیں، جو صارف کو زیادہ لچکدار کنٹرول دیتی ہیں۔
اجازتیں چار تحفظ کی سطحوں میں تقسیم ہیں: normal (تنصیب پر خودکار طور پر دی جاتی ہیں)، dangerous (رن ٹائم درخواست کی ضرورت)، signature (صرف اسی سرٹیفکیٹ سے دستخط شدہ ایپلیکیشنز کے لیے دستیاب) اور special (ترتیبات میں علیحدہ فعال کرنے کی ضرورت)۔ ہر سطح کا اپنا دینے اور منسوخ کرنے کا میکانزم ہے۔
Google I/O 2024 کے مطابق، Android 15 مزید تفصیلی اجازتیں متعارف کرانے کا ارادہ رکھتا ہے — صارف پوری میڈیا لائبریری کے بجائے صرف مخصوص فائلوں تک رسائی دے سکے گا۔ یہ ڈیفالٹ طور پر فراہم کردہ ڈیٹا کی مقدار کو کم سے کم کرنے کے Android کے رجحان کو جاری رکھتا ہے۔
iOS کے برعکس، جہاں تمام اجازتیں رن ٹائم پر درخواست کی جاتی ہیں، Android اجازتوں کو تنصیب کے وقت (install-time) اور رن ٹائم (runtime) میں تقسیم کرتا ہے۔ normal سطح صارف کو مطلع کیے بغیر تنصیب پر خودکار طور پر دی جاتی ہے۔ dangerous سطح کو iOS کی طرح واضح مکالمے کی ضرورت ہوتی ہے۔
ایک اور فرق: Android میں، اجازتیں اجازت گروپوں میں منظم ہیں۔ اگر صارف کیمرہ تک رسائی سے اتفاق کرتا ہے، تو ایپلیکیشن خود بخود مائیکروفون تک رسائی حاصل کر لیتی ہے — وہ ایک ہی MICROPHONE گروپ میں ہیں۔ iOS میں، ہر اجازت گروپوں سے قطع نظر آزادانہ طور پر درخواست کی جاتی ہے۔
| Android ورژن | اجازت ماڈل میں تبدیلی |
|---|---|
| Android 1.0–5.x | تمام اجازتیں تنصیب پر دی جاتی ہیں |
| Android 6.0 (API 23) | dangerous سطح کے لیے Runtime Permissions کا تعارف |
| Android 10 (API 29) | Scoped Storage — فائل سسٹم تک محدود رسائی |
| Android 11 (API 30) | خودکار ری سیٹ اجازتیں — غیر استعمال شدہ اجازتیں ری سیٹ ہو جاتی ہیں |
| Android 14 (API 34) | میڈیا تک رسائی (تصویر، ویڈیو، آڈیو) کے لیے رن ٹائم اجازتیں |
Android اجازتوں کے لیے چار تحفظ کی سطحیں متعین کرتا ہے، ہر ایک کے اپنے دینے کے قواعد ہیں۔ آئیے ہر سطح کا تفصیل سے جائزہ لیتے ہیں۔
Normal اجازتیں صارف کو مطلع یا درخواست کیے بغیر ایپلیکیشن کی تنصیب پر خودکار طور پر دی جاتی ہیں۔ یہ کم خطرے والے افعال کا احاطہ کرتی ہیں جو صارف کی رازداری کو خطرہ نہیں پہنچاتے: INTERNET، ACCESS_NETWORK_STATE، VIBRATE، BLUETOOTH۔ صارف کوئی رضامندی کا مکالمہ نہیں دیکھتا — اجازت تنصیب کے بعد دی گئی سمجھی جاتی ہے۔
ڈویلپر کو normal اجازتوں کے لیے کوڈ میں درخواست سنبھالنے کی ضرورت نہیں ہے — مینی فیسٹ میں اعلان کرنا کافی ہے۔ تاہم، Android 12+ میں، Google Play سے تنصیب کرتے وقت، صارف تمام normal اجازتوں کی فہرست والا ایک «اجازتیں» ٹیب دیکھتا ہے، جو شفافیت بڑھاتا ہے۔ Statista (2024) کے مطابق، Google Play میں 90% سے زیادہ ایپلیکیشنز سب سے عام normal اجازت کے طور پر INTERNET استعمال کرتی ہیں۔
Dangerous اجازتیں ڈیٹا اور افعال تک رسائی کا احاطہ کرتی ہیں جو رازداری سے سمجھوتہ کر سکتے ہیں: کیمرہ، مائیکروفون، جغرافیائی محل وقوع، رابطے، SMS، فون، کیلنڈر، جسمانی سینسر۔ ان اجازتوں کو دو مرحلوں پر مشتمل میکانزم کی ضرورت ہوتی ہے: مینی فیسٹ میں اعلان + ActivityCompat.requestPermissions() کے ذریعے رن ٹائم درخواست۔
صارف dangerous اجازت سے انکار کر سکتا ہے، اور ایپلیکیشن کو اس منظر نامے کو صحیح طریقے سے سنبھالنا چاہیے۔ Android 11+ میں، اگر صارف دو بار انکار کرتا ہے، تو بعد کی درخواستیں سسٹم مکالمہ نہیں دکھاتی ہیں — سسٹم خود بخود DENIED لوٹاتا ہے۔ اس صورت میں، ایپلیکیشن کو صارف کو ترتیبات کی طرف رہنمائی کرنی چاہیے۔
signature سطح — اجازت خود بخود دی جاتی ہے اگر ایپلیکیشن اسی سرٹیفکیٹ سے دستخط شدہ ہو جو سسٹم یا کسی اور ایپلیکیشن نے اجازت کی تعریف کی ہے۔ سسٹم اور کارپوریٹ ایپلیکیشنز کے لیے استعمال ہوتی ہے۔ مثال: BIND_ACCESSIBILITY_SERVICE — صرف سسٹم ایپلیکیشنز کے لیے دستیاب۔
special سطح (SYSTEM_ALERT_WINDOW، WRITE_SETTINGS، REQUEST_INSTALL_PACKAGES، MANAGE_EXTERNAL_STORAGE) — سسٹم ترتیبات کے ذریعے صارف کے واضح عمل کی ضرورت ہوتی ہے۔ ایپلیکیشن Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) کے ساتھ ترتیبات کا صفحہ کھول سکتی ہے۔ Google Play special اجازتوں کے استعمال کو محدود کرتا ہے اور اشاعت کے وقت فارم میں جواز کی ضرورت ہوتی ہے۔
Android 6.0 سے، تمام dangerous اجازتوں کو رن ٹائم درخواست کی ضرورت ہوتی ہے۔ آئیے Kotlin میں رن ٹائم اجازتوں کے ساتھ مکمل کام کے چکر کا جائزہ لیتے ہیں۔
جس API کو dangerous اجازت کی ضرورت ہے اسے کال کرنے سے پہلے، ہمیشہ ContextCompat.checkSelfPermission() کے ذریعے موجودہ حیثیت چیک کریں۔ اگر حیثیت PERMISSION_GRANTED ہے، تو آپ API کال کر سکتے ہیں۔ اگر PERMISSION_DENIED ہے، تو آپ کو ActivityResultContract RequestPermission (AndroidX) یا فرسودہ requestPermissions() کے ذریعے اجازت کی درخواست کرنی ہوگی۔
ایک ساتھ متعدد اجازتوں کی درخواست کرنے کے لیے ActivityResultContracts.RequestMultiplePermissions استعمال کرنے کی سفارش کی جاتی ہے۔ Google ایک مکالمے میں متعلقہ اجازتوں (مثلاً، ویڈیو ریکارڈنگ کے لیے کیمرہ + مائیکروفون) کو گروپ کرنے کی سفارش کرتا ہے، تاکہ صارف درخواست کا مکمل سیاق و سباق دیکھ سکے۔
import android.Manifest
import android.content.pm.PackageManager
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
class CameraActivity : AppCompatActivity() {
private val requestPermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
openCamera()
} else {
explainWhyPermissionNeeded()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
checkCameraPermission()
}
private fun checkCameraPermission() {
when {
ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED -> {
openCamera()
}
shouldShowRequestPermissionRationale(
Manifest.permission.CAMERA
) -> {
showRationale()
}
else -> {
requestPermissionLauncher.launch(
Manifest.permission.CAMERA
)
}
}
}
}
اگر صارف دو بار انکار کرتا ہے، تو Android درخواست کو «Never ask again» حالت میں ڈال دیتا ہے۔ اس صورت میں، shouldShowRequestPermissionRationale() false لوٹاتا ہے، اور سسٹم مکالمہ نہیں دکھایا جائے گا۔ ایپلیکیشن کو Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) کے ذریعے صارف کو سسٹم ترتیبات کی طرف رہنمائی کرنی چاہیے۔
اہم: پہلے انکار کے فوراً بعد ترتیبات کھولنے کی پیشکش کرنے والا مکالمہ نہ دکھائیں — اسے جارحانہ رویہ سمجھا جاتا ہے۔ shouldShowRequestPermissionRationale() استعمال کریں تاکہ یہ طے کیا جا سکے کہ آیا وضاحت دکھانے کی ضرورت ہے۔ Material Design رہنما خطوط صرف «ترتیبات کھولیں» بٹن کے بجائے رسائی کی قدر کی وضاحت کرنے والی اسکرین دکھانے کی سفارش کرتے ہیں۔
private fun openAppSettings() {
Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", packageName, null)
).also { intent ->
startActivity(intent)
}
}
private fun showPermissionSettings() {
AlertDialog.Builder(this)
.setTitle("کیمرہ تک رسائی")
.setMessage("ترتیبات میں کیمرہ تک رسائی کی اجازت دیں، "
+ "پروفائل تصویر لینے کے لیے")
.setPositiveButton("ترتیبات کھولیں") { _, _ ->
openAppSettings()
}
.setNegativeButton("منسوخ کریں", null)
.show()
}
AndroidManifest.xml فائل میں ہر اجازت کے لیے
ہر اجازت android:name وصف کا استعمال کرتے ہوئے مکمل اجازت کا نام بتانے والے ایک علیحدہ
مثال کے طور پر، WRITE_EXTERNAL_STORAGE اجازت Android 10+ (Scoped Storage) پر ضروری نہیں ہے، لہذا maxSdkVersion="28" (Android 9) بتائیں۔ یہ نئے ورژن پر صارفین کے غیر ضروری سوالات کو روکتا ہے۔ Android Studio Lint کے ذریعے تجویز کردہ maxSdkVersion کے بارے میں خبردار کرتا ہے۔
<!-- AndroidManifest.xml -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Normal permissions (install-time) -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Dangerous permissions (runtime) -->
<uses-permission
android:name="android.permission.CAMERA" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Legacy storage permission limited to API 28 and below -->
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<application>
<!-- ... -->
</application>
</manifest>
تمام ہارڈویئر فیچرز کے لیے required="false" سیٹ کرنے اور PackageManager.hasSystemFeature() کے ذریعے پروگراماتی طور پر دستیابی چیک کرنے کی سفارش کی جاتی ہے۔ یہ آپ کی ایپلیکیشن کے سامعین کو بڑھاتا ہے۔ واحد استثنا اگر فیچر ایپلیکیشن کے آپریشن کے لیے اہم ہے (GPS کے بغیر ٹیکسی بکنگ ایپ کا کوئی مطلب نہیں ہے)۔
اجازتوں کا مناسب انتظام Android ایپلیکیشن کے معیار کا ایک اہم پہلو ہے۔ آئیے اہم سفارشات اور عام غلطیوں کا جائزہ لیتے ہیں۔
صرف وہ اجازتیں درخواست کریں جو ایپلیکیشن کے آپریشن کے لیے واقعی ضروری ہیں۔ ہر اضافی اجازت تنصیب کی تبدیلی کی شرح کو کم کرتی ہے اور انکار کی تعداد بڑھاتی ہے۔ Google Play Console دکھاتا ہے کہ اجازت کے سیٹ کی وجہ سے کتنے صارفین نے تنصیب سے انکار کیا۔ AppBrain (2024) کے مطابق، 10+ dangerous اجازتوں والی ایپلیکیشنز میں 35% کم تنصیبات ہوتی ہیں۔
باقاعدگی سے اپنی اجازت کی فہرست کا جائزہ لیں۔ غیر استعمال شدہ اجازتیں ہٹائیں، خاص طور پر نئے Android ورژن میں منتقلی کرتے وقت جہاں کچھ اجازتیں اختیاری ہو جاتی ہیں۔ مثال کے طور پر، Android 13+ میں فوٹو پکر (ActivityResultContracts.PickVisualMedia) کے ساتھ، میڈیا لائبریری تک رسائی dangerous READ_MEDIA_IMAGES اجازت کے بغیر حاصل کی جا سکتی ہے۔
dangerous اجازت کی درخواست کرنے سے پہلے، صارف کو ایک اسکرین دکھائیں جو بتائے کہ اس اجازت کی ضرورت کیوں ہے اور یہ کیا قدر فراہم کرتی ہے۔ Material Design ایک آئیکن، مختصر متن اور «جاری رکھیں» بٹن کے ساتھ نیچے کی شیٹ یا مکالمہ استعمال کرنے کی سفارش کرتا ہے۔ وضاحت براہ راست درخواست کے مقابلے میں رضامندی کو 20-30% بڑھاتی ہے۔
launch() کال کرنے سے پہلے shouldShowRequestPermissionRationale() چیک کریں۔ اگر true ہے، تو وضاحت دکھائیں۔ اگر false ہے، تو یا تو اجازت پہلے ہی دی جا چکی ہے یا صارف نے مستقل طور پر انکار کر دیا ہے (دوبارہ کبھی نہ پوچھیں)۔ بعد کی صورت میں، درخواست دہرانے کے بجائے «ترتیبات کھولیں» بٹن دکھائیں۔
تمام ممکنہ منظرناموں کی جانچ کریں: اجازت دینا، انکار، مستقل انکار، ترتیبات میں اجازت منسوخ کرنا، اجازت ری سیٹ (Android 11+ خودکار ری سیٹ)۔ ہر منظر نامہ بغیر کریش یا ڈیٹا کے نقصان کے سنبھالا جانا چاہیے۔ Android جانچ گائیڈ جانچ کو خودکار بنانے کے لیے TestPermission لائبریری استعمال کرنے کی سفارش کرتا ہے۔
اس منظر نامے پر خصوصی توجہ دیں جب صارف ایپلیکیشن چلتے ہوئے اجازت منسوخ کرتا ہے (ایپ چھوٹی → ترتیبات → منسوخ)۔ ایپلیکیشن میں واپس آنے پر، onResume() میں تمام اجازتیں دوبارہ چیک کریں۔ اجازت کی حالت کو کیش کرنے پر بھروسہ نہ کریں — صارف اسے کسی بھی وقت تبدیل کر سکتا ہے۔
اکثر پوچھے گئے سوالات
ہاں، اگر SDK اپنے مینی فیسٹ میں اجازت شامل کرتا ہے، تو یہ بلڈ کے وقت ایپلیکیشن مینی فیسٹ کے ساتھ ضم ہو جاتا ہے۔ آپ AndroidManifest.xml میں tools:node="remove" کا استعمال کرتے ہوئے غیر ضروری SDK اجازت کو ہٹا سکتے ہیں۔
اجازت کے بغیر API کال کرنے سے SecurityException پیدا ہوگا، جس سے ایپلیکیشن کریش ہو جائے گی۔ متعلقہ API استعمال کرنے سے پہلے ہمیشہ اجازت کی حیثیت چیک کریں اور انکار کو صحیح طریقے سے سنبھالیں۔
ڈیوائس کی ترتیبات میں: ترتیبات → ایپس → [آپ کی ایپ] → اجازتیں۔ تمام اجازتیں ری سیٹ کرنے کے لیے، adb کمانڈ استعمال کریں: adb shell pm reset-permissions۔
ہاں، Fragment یا Service میں ActivityResultLauncher استعمال کرکے۔ تاہم، درخواست کے مکالمے کو ہمیشہ Activity UI سیاق و سباق کی ضرورت ہوتی ہے۔ Service کے لیے، آپ درخواست Activity کھولنے والے Intent کے ساتھ اطلاع دکھا سکتے ہیں۔
مثال کے طور پر، WRITE_EXTERNAL_STORAGE Android 10+ (Scoped Storage) پر ضروری نہیں ہے۔ android:maxSdkVersion="28" بتا کر، آپ نئے ورژن پر اجازت کے اعلان کو خارج کر دیتے ہیں، مطابقت بہتر کرتے ہیں اور درخواست کردہ اجازتوں کی فہرست کم کرتے ہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں