<uri-রিলেটিভ-ফিল্টার-গ্রুপ>

সিনট্যাক্স:
<uri-relative-filter-group android:allow=["true" | "false"]>
  <data ... />
  ...
</uri-relative-filter-group>
এর মধ্যে অন্তর্ভুক্ত:
<intent-filter>
এতে থাকতে পারে:
<data>
বর্ণনা:
সুনির্দিষ্ট Intent ম্যাচিং নিয়ম তৈরি করে, যাতে URI কোয়েরি প্যারামিটার এবং URI ফ্র্যাগমেন্ট অন্তর্ভুক্ত থাকতে পারে। android: allow অ্যাট্রিবিউটের উপর নির্ভর করে নিয়মগুলো অন্তর্ভুক্তিকরণ ( allow ) বা বর্জন ( blocking ) হতে পারে। এই ম্যাচিং নিয়মগুলো অন্তর্ভুক্ত <data> এলিমেন্টের path* , fragment* , এবং query* অ্যাট্রিবিউটের মাধ্যমে নির্দিষ্ট করা হয়।

মিলানো

একটি URI মেলানোর জন্য, URI রিলেটিভ ফিল্টার গ্রুপের প্রতিটি অংশকে অবশ্যই URI-টির কোনো একটি অংশের সাথে মিলতে হবে। URI-এর এমন অংশও থাকতে পারে যা URI রিলেটিভ ফিল্টার গ্রুপে নির্দিষ্ট করা নেই। উদাহরণস্বরূপ:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="true">
    <data android:query="param1=value1" />
    <data android:query="param2=value2" />
  </uri-relative-filter-group>
  ...
</intent-filter>

ফিল্টারটি https://project.example.com/any/path/here?param1=value1&param2=value2&param3=value3 সাথে মেলে, কারণ URI রিলেটিভ ফিল্টার গ্রুপ দ্বারা নির্দিষ্ট করা সবকিছুই এখানে উপস্থিত আছে। ফিল্টারটি https://project.example.com/any/path/here?param2=value2&param1=value1 সাথেও মেলে, কারণ কোয়েরি প্যারামিটারগুলোর ক্রম এখানে বিবেচ্য নয়। তবে, ফিল্টারটি https://project.example.com/any/path/here?param1=value1 সাথে মেলে না, কারণ এখানে param2=value2 অনুপস্থিত।

অথবা এবং এবং

<uri-relative-filter-group> এর বাইরের <data> ট্যাগগুলোর মধ্যে OR সংযোগ ঘটে, অন্যদিকে <uri-relative-filter-group> এর ভেতরের <data> ট্যাগগুলোর মধ্যে AND সংযোগ ঘটে।

নিম্নলিখিত উদাহরণটি বিবেচনা করুন:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <data android:pathPrefix="/prefix" />
  <data android:pathSuffix="suffix" />
  ...
</intent-filter>

এই ফিল্টারটি সেইসব পাথের সাথে মেলে যেগুলো /prefix দিয়ে শুরু হয় অথবা suffix দিয়ে শেষ হয়।

এর বিপরীতে, পরবর্তী উদাহরণটি এমন পাথগুলিকে মেলায় যেগুলি /prefix দিয়ে শুরু হয় এবং suffix দিয়ে শেষ হয় :

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group>
    <data android:pathPrefix="/prefix" />
    <data android:pathSuffix="suffix" />
  </uri-relative-filter-group>
  ...
</intent-filter>

এর ফলে, একই <uri-relative-filter-group> এর মধ্যে থাকা একাধিক path অ্যাট্রিবিউট কোনো কিছুর সাথেই মেলে না:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group>
    <data android:path="/path1" />
    <data android:path="/path2" />
  </uri-relative-filter-group>
  ...
</intent-filter>

ঘোষণা আদেশ

নিম্নলিখিত উদাহরণটি বিবেচনা করুন:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group>
    <data android:fragment="fragment" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:fragmentPrefix="fragment" />
  </uri-relative-filter-group>
  ...
</intent-filter>

ফিল্টারটি #fragment ফ্র্যাগমেন্টটির সাথে মিলে যায়, কারণ বর্জন নিয়মটি মূল্যায়ন করার আগেই একটি মিল খুঁজে পাওয়া যায়, কিন্তু #fragment123 মতো ফ্র্যাগমেন্টগুলো মেলে না।

ভাইবোন ট্যাগ

<uri-relative-filter-group> ট্যাগগুলো তাদের সহোদর <data> ট্যাগগুলোর সাথে একত্রে কাজ করে (অর্থাৎ, <data> ট্যাগগুলো যা <uri-relative-filter-group> এর বাইরে কিন্তু একই <intent-filter> ভিতরে থাকে)। সঠিকভাবে কাজ করার জন্য <uri-relative-filter-group> ট্যাগগুলোর অবশ্যই সহোদর <data> ট্যাগ থাকতে হবে, কারণ <intent-filter> স্তরে URI অ্যাট্রিবিউটগুলো পরস্পরের উপর নির্ভরশীল।

  • ইন্টেন্ট ফিল্টারের জন্য কোনো scheme নির্দিষ্ট করা না থাকলে, অন্য সব URI অ্যাট্রিবিউট উপেক্ষা করা হয়।
  • ফিল্টারের জন্য কোনো host নির্দিষ্ট করা না থাকলে, port অ্যাট্রিবিউট এবং সমস্ত path* অ্যাট্রিবিউট উপেক্ষা করা হয়।

একটি <intent-filter> এর <data> চাইল্ড ট্যাগগুলো যেকোনো <uri-relative-filter-group> ট্যাগের আগে ইভ্যালুয়েট করা হয়। তারপর <uri-relative-filter-group> ট্যাগগুলো ক্রমানুসারে ইভ্যালুয়েট করা হয়, উদাহরণস্বরূপ:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="false">
    <data android:path="/path" />
    <data android:query="query" />
  </uri-relative-filter-group>
  <data android:path="/path" />
  ...
</intent-filter>

ফিল্টারটি https://project.example.com/path?query গ্রহণ করে, কারণ এটি <data android:path="/path" /> এর সাথে মেলে, যা <uri-relative-filter-group> বর্জন নিয়মের বাইরে অবস্থিত।

সাধারণ ব্যবহারের ক্ষেত্রে

ধরুন আপনার কাছে https://project.example.com/path এই URI-টি আছে, যেটিকে আপনি একটি কোয়েরি প্যারামিটারের উপস্থিতি বা মানের উপর নির্ভর করে একটি Intent সাথে মেলাতে চান। এমন একটি Intent ফিল্টার তৈরি করতে যা https://project.example.com/path মেলাবে এবং https://project.example.com/path?query ব্লক করবে, আপনি নিচের মতো কিছু চেষ্টা করতে পারেন:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="true">
    <data android:path="/path" />
  </uri-relative-filter-group>
  ...
</intent-filter>

প্রকৃতপক্ষে, এটি কাজ করে না। https://project.example.com/path?query URI-টি /path পাথটির সাথে মেলে, এবং <uri-relative-filter-group> ট্যাগটি মেলানোর সময় অতিরিক্ত অংশ ব্যবহারের অনুমতি দেয়।

ইনটেন্ট ফিল্টারটি নিম্নরূপভাবে সংশোধন করুন:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="false">
    <data android:path="/path" />
    <data android:queryAdvancedPattern=".+" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="true">
    <data android:path="/path" />
  </uri-relative-filter-group>
  ...
</intent-filter>

এই ফিল্টারটি কাজ করে, কারণ যে ব্লকিং নিয়মগুলো খালি নয় এমন কোয়েরি প্যারামিটার নিষিদ্ধ করে, সেগুলো প্রথমে মূল্যায়ন করা হয়।

কোডটিকে সরল করার জন্য, আচরণটি উল্টে দিন যাতে কোয়েরি প্যারামিটার অনুমোদিত হয় এবং কোয়েরি প্যারামিটার ছাড়া URI-গুলো ব্লক হয়ে যায়:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="true">
    <data android:path="/path" />
    <data android:queryAdvancedPattern=".+" />
  </uri-relative-filter-group>
  ...
</intent-filter>

URI-এনকোডেড অক্ষর

যেসব URI-তে URI-এনকোডেড অক্ষর রয়েছে, সেগুলোকে মেলানোর জন্য ফিল্টারে আসল, এনকোডবিহীন অক্ষরগুলো লিখুন, উদাহরণস্বরূপ:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="true">
    <data android:query="param=value!" />
  </uri-relative-filter-group>
  ...
</intent-filter>

ফিল্টারটি ?param=value! এবং ?param=value%21 সাথে মেলে।

তবে, যদি আপনি ফিল্টারে নিম্নলিখিতভাবে এনকোডেড অক্ষর লেখেন:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="true">
    <data android:query="param=value%21" />
  </uri-relative-filter-group>
  ...
</intent-filter>

ফিল্টারটি ?param=value! অথবা ?param=value%21 কোনোটির সাথেই মেলে না।

উপাদানের সংখ্যা

আপনি একটি <intent-filter> ভিতরে যেকোনো সংখ্যক <uri-relative-filter-group> এলিমেন্ট রাখতে পারেন।

অতিরিক্ত সম্পদ

ইনটেন্ট ফিল্টার কীভাবে কাজ করে, সেইসাথে ফিল্টারের সাথে ইনটেন্ট অবজেক্টগুলো কীভাবে মেলানো হয় তার নিয়মাবলী সম্পর্কে জানতে, “Intents and Intent Filters” এবং “Intent Filters” দেখুন।

<uri-relative-filter-group> সম্পর্কে তথ্যের জন্য, UriRelativeFilterGroup এবং UriRelativeFilter দেখুন।

বৈশিষ্ট্য:
android:allow
এই URI-সাপেক্ষ ফিল্টার গ্রুপটি বর্জন ( ব্লকিং ) নিয়মের পরিবর্তে অন্তর্ভুক্তি ( অনুমতি ) নিয়ম কিনা। এর ডিফল্ট মান হলো "true"
মূল্য বর্ণনা
"true" (ডিফল্ট) যদি URI-সাপেক্ষ ফিল্টার গ্রুপটি মিলে যায়, তাহলে ইন্টেন্ট ফিল্টারটিও মিলে যাবে।
"false" যদি URI-সাপেক্ষ ফিল্টার গ্রুপটি মিলে যায়, তাহলে ইন্টেন্ট ফিল্টারটি মেলে না।
এতে প্রবর্তন করা হয়েছিল:
এপিআই লেভেল ৩৫
আরও দেখুন:
<intent-filter>
<data>