অন্যান্য অ্যাপের সাথে ইন্টার‍্যাকশন সীমাবদ্ধ করুন

শুধুমাত্র সিস্টেমের কার্যকারিতার জন্য অনুরোধ করার জন্য অনুমতি নয়। এছাড়াও, আপনার অ্যাপের কম্পোনেন্টের সাথে অন্যান্য অ্যাপ কীভাবে ইন্টার‍্যাক্ট করতে পারে তা আপনি সীমাবদ্ধ করতে পারবেন।

অন্য অ্যাপের ঘোষিত অনুমতির সেট কীভাবে চেক করতে হয় তা এই গাইডে ব্যাখ্যা করা হয়েছে। এছাড়াও, এই গাইডে ব্যাখ্যা করা হয়েছে যে কীভাবে আপনি অ্যাক্টিভিটি, পরিষেবা, কন্টেন্ট প্রোভাইডার ও ব্রডকাস্ট রিসিভার কনফিগার করতে পারবেন যাতে অন্যান্য অ্যাপ আপনার অ্যাপের সাথে কীভাবে ইন্টার‍্যাক্ট করবে তা সীমাবদ্ধ করা যায়।

অন্য অ্যাপের অনুমতি চেক করুন

অন্য অ্যাপের ঘোষণা করা অনুমতির সেট দেখতে, নিম্নলিখিত ধাপগুলি সম্পূর্ণ করতে কোনও ডিভাইস বা এমুলেটর ব্যবহার করুন:

  1. কোনও অ্যাপের অ্যাপ সংক্রান্ত তথ্য স্ক্রিন খুলুন।
  2. অনুমতি বিকল্প বেছে নিন। অ্যাপকে দেওয়া অনুমতি স্ক্রিন লোড হবে।

    এই স্ক্রিনে পারমিশন গ্রুপের একটি সেট দেখানো হয়। অ্যাপ যেসব অনুমতির সেট ঘোষণা করেছে, সিস্টেম সেগুলি এইসব গ্রুপে সাজায়।

অনুমতি চেক করার আরও অনেক কার্যকর উপায় আছে:

  • কোনও পরিষেবায় কল করার সময় অনুমতি চেক করতে, Context.checkCallingPermission()-এ অনুমতি স্ট্রিং পাস করুন। এই পদ্ধতিটি একটি পূর্ণসংখ্যা প্রদান করে যা নির্দেশ করে যে বর্তমান কলিং প্রক্রিয়াকে সেই অনুমতি দেওয়া হয়েছে কিনা। মনে রাখবেন, এটি শুধুমাত্র তখনই ব্যবহার করা যেতে পারে যখন আপনি অন্য প্রসেস থেকে আসা কল এক্সিকিউট করছেন, সাধারণত কোনও পরিষেবা থেকে প্রকাশিত IDL ইন্টারফেসের মাধ্যমে বা অন্য কোনও উপায়ে অন্য প্রসেসে দেওয়া হয়।
  • অন্য কোনও প্রসেসকে নির্দিষ্ট অনুমতি দেওয়া হয়েছে কিনা তা চেক করতে, প্রসেস আইডি (PID) Context.checkPermission()-এ পাস করুন।
  • অন্য কোনও প্যাকেজকে নির্দিষ্ট অনুমতি দেওয়া হয়েছে কিনা তা চেক করতে, প্যাকেজের নাম PackageManager.checkPermission()-এ পাস করুন।

আপনার অ্যাপের অ্যাক্টিভিটির সাথে ইন্টার‍্যাকশন সীমাবদ্ধ করুন

ম্যানিফেস্টে, <activity> ট্যাগের android:permission অ্যাট্রিবিউট ব্যবহার করুন যাতে অন্য কোন অ্যাপ সেই Activity শুরু করতে পারবে তা সীমাবদ্ধ করা যায়। Context.startActivity() এবং Activity.startActivityForResult()-এর সময় অনুমতি চেক করা হয়। কলারের কাছে প্রয়োজনীয় অনুমতি না থাকলে, SecurityException হয়।

আপনার অ্যাপের পরিষেবার সাথে ইন্টার‍্যাকশন সীমাবদ্ধ করুন

ম্যানিফেস্টে, <service> ট্যাগের android:permission অ্যাট্রিবিউট ব্যবহার করুন যাতে অন্য কোন অ্যাপ সংশ্লিষ্ট Service শুরু বা বাইন্ড করতে পারবে তা সীমাবদ্ধ করা যায়। Context.startService(), Context.stopService() এবং Context.bindService()-এর সময় অনুমতি চেক করা হয়। কলারের কাছে প্রয়োজনীয় অনুমতি না থাকলে, SecurityException হয়।

আপনার অ্যাপের কন্টেন্ট প্রোভাইডারের সাথে ইন্টার‍্যাকশন সীমাবদ্ধ করুন

ম্যানিফেস্টে, <provider> ট্যাগের android:permission অ্যাট্রিবিউট ব্যবহার করুন যাতে অন্য কোন অ্যাপ 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-এর জন্য অন্যান্য অ্যাপকে যথাক্রমে রিড, রাইট অথবা রিড ও রাইট করার অনুমতি দেয়। অন্যান্য অ্যাপ নির্দিষ্ট URI-এর জন্য এই অনুমতিগুলি পায়, কন্টেন্ট প্রোভাইডারে আরও সাধারণভাবে ডেটা অ্যাক্সেস করার অনুমতি তাদের আছে কিনা তা নির্বিশেষে।

যেমন, ধরুন কোনও ব্যবহারকারী আপনার অ্যাপ ব্যবহার করে অ্যাটাচ করা ছবি সহ ইমেল দেখছেন। সাধারণত, অন্যান্য অ্যাপের ইমেলের কন্টেন্ট অ্যাক্সেস করার কথা নয়, তবে তারা ছবি দেখতে আগ্রহী হতে পারে। আপনার অ্যাপ, ইনটেন্ট ও Intent.FLAG_GRANT_READ_URI_PERMISSION ইনটেন্ট ফ্ল্যাগ ব্যবহার করে ছবি দেখার অ্যাপকে ছবি দেখাতে পারে।

আরেকটি বিষয় হল অ্যাপের দৃশ্যমানতা। আপনার অ্যাপ Android 11 (API লেভেল 30) বা তার পরবর্তী কোনও ভার্সনকে টার্গেট করলে, সিস্টেম অটোমেটিক আপনার অ্যাপে কিছু অ্যাপ দেখায় এবং ডিফল্ট হিসেবে অন্যান্য অ্যাপ লুকিয়ে রাখে। আপনার অ্যাপে কন্টেন্ট প্রোভাইডার থাকলে এবং অন্য অ্যাপকে URI সংক্রান্ত অনুমতি দিলে, আপনার অ্যাপ সেই অন্য অ্যাপের কাছে অটোমেটিক দৃশ্যমান হবে।

আরও তথ্যের জন্য, grantUriPermission(), revokeUriPermission() এবং checkUriPermission() পদ্ধতির জন্য রেফারেন্স মেটেরিয়াল দেখুন।

আপনার অ্যাপের ব্রডকাস্ট রিসিভারের সাথে ইন্টার‍্যাকশন সীমিত করুন

<receiver> ট্যাগের android:permission অ্যাট্রিবিউট ব্যবহার করে কোন কোন অ্যাপ সংশ্লিষ্ট BroadcastReceiver-এ ব্রডকাস্ট পাঠাতে পারবে তা সীমাবদ্ধ করুন। Context.sendBroadcast() রিটার্ন করার পরে সিস্টেম অনুমতি চেক করে, কারণ সিস্টেম জমা দেওয়া ব্রডকাস্ট নির্দিষ্ট প্রাপকের কাছে পৌঁছে দেওয়ার চেষ্টা করে। এর অর্থ হল, অনুমতি ব্যর্থ হলে কলারের কাছে কোনও ব্যতিক্রমী পরিস্থিতি তৈরি হয় না—এটি শুধু Intent ডেলিভার করে না।

এছাড়াও, আপনি প্রোগ্রাম্যাটিক্যালি অনুমতি কনফিগার করতে পারবেন:

  • প্রোগ্রাম্যাটিক্যালি রেজিস্টার করা রিসিভারে অন্য কোন অ্যাপ ব্রডকাস্ট করতে পারবে তা নিয়ন্ত্রণ করতে: Context.registerReceiver()-এ অনুমতি দিন।
  • কোন ব্রডকাস্ট রিসিভার ব্রডকাস্ট রিসিভ করতে পারবে তা সীমাবদ্ধ করতে: Context.sendBroadcast() কল করার সময় অনুমতি প্রদান করুন।

মনে রাখবেন যে রিসিভার ও ব্রডকাস্টার, উভয়েরই অনুমতি প্রয়োজন হতে পারে। এটি হলে, উদ্দেশ্যটি সংশ্লিষ্ট টার্গেটে ডেলিভার করার জন্য দুটি অনুমতির চেকই পাস করতে হবে। আরও তথ্যের জন্য, অনুমতির মাধ্যমে ব্রডকাস্ট সীমাবদ্ধ করা দেখুন।